You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

HyperLprGUI.py 30 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. """
  2. Author: youngorsu
  3. Email : zhiyongsu@qq.com
  4. Last edited: 2018.1.29
  5. """
  6. # coding=utf-8
  7. import sys
  8. import os
  9. from PyQt5.QtWidgets import (
  10. QMainWindow,
  11. QLabel,
  12. QLineEdit,
  13. QPushButton,
  14. QHBoxLayout,
  15. QVBoxLayout,
  16. QGridLayout,
  17. QTableWidget,
  18. QWidget,
  19. QAbstractItemView,
  20. QHeaderView,
  21. QGraphicsView,
  22. QGraphicsScene,
  23. QGraphicsPixmapItem,
  24. QSplitter,
  25. QFileDialog,
  26. QTableWidgetItem,
  27. QGraphicsRectItem,
  28. QCheckBox,
  29. QMessageBox,
  30. QGroupBox,
  31. QGraphicsSimpleTextItem,
  32. qApp,
  33. QAction,
  34. QApplication)
  35. from PyQt5.QtGui import QIcon, QColor, QPainter, QImage, QPixmap, QPen, QBrush, QFont, QPalette, QKeySequence
  36. from PyQt5.QtCore import Qt, QDir, QSize, QEventLoop, QThread, pyqtSignal
  37. from hyperlpr_py3 import pipline as pp
  38. import cv2
  39. import numpy as np
  40. import time
  41. import shutil
  42. draw_plate_in_image_enable = 1
  43. plateTypeName = ["蓝", "黄", "绿", "白", "黑 "]
  44. def SimpleRecognizePlateWithGui(image):
  45. t0 = time.time()
  46. images = pp.detect.detectPlateRough(
  47. image, image.shape[0], top_bottom_padding_rate=0.1)
  48. res_set = []
  49. y_offset = 32
  50. for j, plate in enumerate(images):
  51. plate, rect, origin_plate = plate
  52. plate = cv2.resize(plate, (136, 36 * 2))
  53. t1 = time.time()
  54. plate_type = pp.td.SimplePredict(plate)
  55. plate_color = plateTypeName[plate_type]
  56. if (plate_type > 0) and (plate_type < 5):
  57. plate = cv2.bitwise_not(plate)
  58. if draw_plate_in_image_enable == 1:
  59. image[y_offset:y_offset + plate.shape[0], 0:plate.shape[1]] = plate
  60. y_offset = y_offset + plate.shape[0] + 4
  61. image_rgb = pp.fm.findContoursAndDrawBoundingBox(plate)
  62. if draw_plate_in_image_enable == 1:
  63. image[y_offset:y_offset + image_rgb.shape[0],
  64. 0:image_rgb.shape[1]] = image_rgb
  65. y_offset = y_offset + image_rgb.shape[0] + 4
  66. image_rgb = pp.fv.finemappingVertical(image_rgb)
  67. if draw_plate_in_image_enable == 1:
  68. image[y_offset:y_offset + image_rgb.shape[0],
  69. 0:image_rgb.shape[1]] = image_rgb
  70. y_offset = y_offset + image_rgb.shape[0] + 4
  71. pp.cache.verticalMappingToFolder(image_rgb)
  72. if draw_plate_in_image_enable == 1:
  73. image[y_offset:y_offset + image_rgb.shape[0],
  74. 0:image_rgb.shape[1]] = image_rgb
  75. y_offset = y_offset + image_rgb.shape[0] + 4
  76. e2e_plate, e2e_confidence = pp.e2e.recognizeOne(image_rgb)
  77. print("e2e:", e2e_plate, e2e_confidence)
  78. image_gray = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2GRAY)
  79. #print("校正", time.time() - t1, "s")
  80. t2 = time.time()
  81. val = pp.segmentation.slidingWindowsEval(image_gray)
  82. # print val
  83. #print("分割和识别", time.time() - t2, "s")
  84. res=""
  85. confidence = 0
  86. if len(val) == 3:
  87. blocks, res, confidence = val
  88. if confidence / 7 > 0.7:
  89. if draw_plate_in_image_enable == 1:
  90. image = pp.drawRectBox(image, rect, res)
  91. for i, block in enumerate(blocks):
  92. block_ = cv2.resize(block, (24, 24))
  93. block_ = cv2.cvtColor(block_, cv2.COLOR_GRAY2BGR)
  94. image[j * 24:(j * 24) + 24, i *
  95. 24:(i * 24) + 24] = block_
  96. if image[j * 24:(j * 24) + 24,
  97. i * 24:(i * 24) + 24].shape == block_.shape:
  98. pass
  99. res_set.append([res,
  100. confidence / 7,
  101. rect,
  102. plate_color,
  103. e2e_plate,
  104. e2e_confidence,
  105. len(blocks)])
  106. print("seg:",res,confidence/7)
  107. #print(time.time() - t0, "s")
  108. print("---------------------------------")
  109. return image, res_set
  110. class LicenseRecognizationThread(QThread):
  111. recognization_done_signal = pyqtSignal(list)
  112. def __init__(self, parent=None):
  113. super().__init__(parent)
  114. self.hyperlpr_dir_path = ""
  115. self.filenames = []
  116. def set_parameter(self, filename_list, path):
  117. self.hyperlpr_dir_path = path
  118. self.filenames = filename_list
  119. def run(self):
  120. while True:
  121. time.sleep(1)
  122. if len(self.hyperlpr_dir_path) > 0:
  123. for i in range(0, len(self.filenames)):
  124. path = os.path.join(
  125. self.hyperlpr_dir_path, self.filenames[i])
  126. image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
  127. image, res_set = SimpleRecognizePlateWithGui(image)
  128. self.recognization_done_signal.emit([i, res_set])
  129. self.hyperlpr_dir_path = ""
  130. class HyperLprImageView(QGraphicsView):
  131. def __init__(self):
  132. super().__init__()
  133. self.init_ui()
  134. def init_ui(self):
  135. scene = QGraphicsScene()
  136. scene.setBackgroundBrush(QColor(100, 100, 100))
  137. scene.setItemIndexMethod(QGraphicsScene.BspTreeIndex)
  138. scene.setSceneRect(scene.itemsBoundingRect())
  139. self.setDragMode(QGraphicsView.RubberBandDrag)
  140. self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate)
  141. self.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing)
  142. self.frame_item = QGraphicsPixmapItem()
  143. self.text_item_offset = 0
  144. self.rect_item_array = []
  145. self.text_item_array = []
  146. for i in range(0, 5):
  147. rect_item = QGraphicsRectItem()
  148. rect_item.setVisible(False)
  149. rect_item.setZValue(20.0)
  150. rect_item.setPen(QPen(Qt.red, 5))
  151. rect_item.setRect(20, 20, 20, 20)
  152. scene.addItem(rect_item)
  153. self.rect_item_array.append(rect_item)
  154. text_item = QGraphicsSimpleTextItem("")
  155. text_item.setBrush(QBrush(Qt.red))
  156. text_item.setZValue(20.0)
  157. text_item.setPos(10, 50)
  158. text_item.setFont(QFont("黑体", 24))
  159. text_item.setVisible(False)
  160. scene.addItem(text_item)
  161. self.text_item_array.append(text_item)
  162. scene.addItem(self.frame_item)
  163. self.curr_factor = 1.0
  164. self.setScene(scene)
  165. def resetRectText(self, res_set):
  166. max_no = len(res_set)
  167. if max_no > 5:
  168. max_no = 5
  169. for i in range(0, 5):
  170. if i < max_no:
  171. curr_rect = res_set[i][2]
  172. self.rect_item_array[i].setRect(int(curr_rect[0]), int(
  173. curr_rect[1]), int(curr_rect[2]), int(curr_rect[3]))
  174. self.rect_item_array[i].setVisible(True)
  175. self.text_item_array[i].setText(
  176. res_set[i][4] + " " + res_set[i][3])
  177. self.text_item_array[i].setPos(
  178. int(curr_rect[0]), int(curr_rect[1]) - 48)
  179. self.text_item_array[i].setVisible(True)
  180. else:
  181. self.text_item_array[i].setVisible(False)
  182. self.rect_item_array[i].setVisible(False)
  183. def wheelEvent(self, event):
  184. factor = event.angleDelta().y() / 120.0
  185. if event.angleDelta().y() / 120.0 > 0:
  186. factor = 1.08
  187. else:
  188. factor = 0.92
  189. if self.curr_factor > 0.1 and self.curr_factor < 10:
  190. self.curr_factor = self.curr_factor * factor
  191. self.scale(factor, factor)
  192. def resetPixmap(self, image):
  193. self.frame_item.setPixmap(QPixmap.fromImage(image))
  194. class HyperLprWindow(QMainWindow):
  195. start_init_signal = pyqtSignal()
  196. def __init__(self):
  197. super().__init__()
  198. self.initUI()
  199. def initUI(self):
  200. self.statusBar().showMessage('Ready')
  201. self.left_action = QAction('上一个', self)
  202. self.left_action.setShortcut(QKeySequence.MoveToPreviousChar)
  203. self.left_action.triggered.connect(self.analyze_last_one_image)
  204. self.right_action = QAction('下一个', self)
  205. self.right_action.setShortcut(QKeySequence.MoveToNextChar)
  206. self.right_action.triggered.connect(self.analyze_next_one_image)
  207. self.rename_image_action = QAction('保存e2e文件名', self)
  208. self.rename_image_action.setShortcut(QKeySequence.MoveToPreviousLine)
  209. self.rename_image_action.triggered.connect(self.rename_current_image_with_info)
  210. self.statusBar()
  211. menubar = self.menuBar()
  212. fileMenu = menubar.addMenu('&Function')
  213. fileMenu.addAction(self.left_action)
  214. fileMenu.addAction(self.right_action)
  215. fileMenu.addAction(self.rename_image_action)
  216. self.image_window_view = HyperLprImageView()
  217. table_widget_header_labels = [
  218. "文件名",
  219. "分割识别",
  220. "置信度",
  221. "颜色",
  222. "E2E识别",
  223. "E2E置信度"]
  224. self.hyperlpr_tableview = QTableWidget(
  225. 0, len(table_widget_header_labels))
  226. self.hyperlpr_tableview.setHorizontalHeaderLabels(
  227. table_widget_header_labels)
  228. self.hyperlpr_tableview.setSelectionBehavior(
  229. QAbstractItemView.SelectItems)
  230. self.hyperlpr_tableview.setSelectionMode(
  231. QAbstractItemView.SingleSelection)
  232. self.hyperlpr_tableview.setEditTriggers(
  233. QAbstractItemView.NoEditTriggers)
  234. self.hyperlpr_tableview.horizontalHeader().setSectionResizeMode(
  235. QHeaderView.ResizeToContents)
  236. self.hyperlpr_tableview.setEditTriggers(
  237. QAbstractItemView.NoEditTriggers)
  238. self.hyperlpr_tableview.cellClicked.connect(
  239. self.recognize_one_license_plate)
  240. self.left_button = QPushButton("<")
  241. self.left_button.setFixedWidth(60)
  242. self.right_button = QPushButton(">")
  243. self.right_button.setFixedWidth(60)
  244. self.left_button.setEnabled(False)
  245. self.right_button.setEnabled(False)
  246. self.left_button.clicked.connect(self.analyze_last_one_image)
  247. self.right_button.clicked.connect(self.analyze_next_one_image)
  248. left_right_layout = QHBoxLayout()
  249. left_right_layout.addStretch()
  250. left_right_layout.addWidget(self.left_button)
  251. left_right_layout.addStretch()
  252. left_right_layout.addWidget(self.right_button)
  253. left_right_layout.addStretch()
  254. self.location_label = QLabel("车牌目录", self)
  255. self.location_text = QLineEdit(self)
  256. self.location_text.setEnabled(False)
  257. #self.location_text.setFixedWidth(300)
  258. self.location_button = QPushButton("...")
  259. self.location_button.clicked.connect(self.select_new_dir)
  260. self.location_layout = QHBoxLayout()
  261. self.location_layout.addWidget(self.location_label)
  262. self.location_layout.addWidget(self.location_text)
  263. self.location_layout.addWidget(self.location_button)
  264. self.location_layout.addStretch()
  265. self.check_box = QCheckBox("与文件名比较车牌")
  266. self.check_box.setChecked(True)
  267. self.update_file_path_button = QPushButton('批量识别')
  268. self.update_file_path_button.clicked.connect(
  269. self.batch_recognize_all_images)
  270. self.update_file_path_layout = QHBoxLayout()
  271. self.update_file_path_layout.addWidget(self.check_box)
  272. self.update_file_path_layout.addWidget(self.update_file_path_button)
  273. self.update_file_path_layout.addStretch()
  274. self.save_as_e2e_filename_button = QPushButton("保存e2e文件名")
  275. self.save_as_e2e_filename_button.setEnabled(False)
  276. self.save_as_e2e_filename_button.clicked.connect(self.rename_current_image_with_info)
  277. self.save_layout = QHBoxLayout()
  278. self.save_layout.addWidget(self.save_as_e2e_filename_button)
  279. self.save_layout.addStretch()
  280. self.top_layout = QVBoxLayout()
  281. self.top_layout.addLayout(left_right_layout)
  282. self.top_layout.addLayout(self.location_layout)
  283. self.top_layout.addLayout(self.update_file_path_layout)
  284. self.top_layout.addLayout(self.save_layout)
  285. function_groupbox = QGroupBox("功能区")
  286. function_groupbox.setLayout(self.top_layout)
  287. license_plate_image_label = QLabel("车牌图")
  288. self.license_plate_widget = QLabel("")
  289. block_image_label = QLabel("分割图")
  290. self.block_plate_widget = QLabel("")
  291. filename_label = QLabel("文件名:")
  292. self.filename_edit = QLineEdit()
  293. segmentation_recognition_label = QLabel("分割识别:")
  294. self.segmentation_recognition_edit = QLineEdit()
  295. self.segmentation_recognition_edit.setFont(QFont("黑体", 24, QFont.Bold))
  296. # self.segmentation_recognition_edit.setStyleSheet("color:red")
  297. confidence_label = QLabel("分割识别\n置信度")
  298. self.confidence_edit = QLineEdit()
  299. #self.confidence_edit.setFont(QFont("黑体", 24, QFont.Bold))
  300. # self.confidence_edit.setStyleSheet("color:red")
  301. plate_color_label = QLabel("车牌颜色")
  302. self.plate_color_edit = QLineEdit()
  303. self.plate_color_edit.setFont(QFont("黑体", 24, QFont.Bold))
  304. # self.plate_color_edit.setStyleSheet("color:red")
  305. e2e_recognization_label = QLabel("e2e识别:")
  306. self.e2e_recognization_edit = QLineEdit()
  307. self.e2e_recognization_edit.setFont(QFont("黑体", 24, QFont.Bold))
  308. # self.e2e_recognization_edit.setStyleSheet("color:red")
  309. e2e_confidence_label = QLabel("e2e置信度")
  310. self.e2e_confidence_edit = QLineEdit()
  311. #self.e2e_confidence_edit.setFont(QFont("黑体", 24, QFont.Bold))
  312. # self.e2e_confidence_edit.setStyleSheet("color:red")
  313. info_gridlayout = QGridLayout()
  314. line_index = 0
  315. info_gridlayout.addWidget(filename_label, line_index, 0)
  316. info_gridlayout.addWidget(self.filename_edit, line_index, 1)
  317. line_index += 1
  318. info_gridlayout.addWidget(license_plate_image_label, line_index, 0)
  319. info_gridlayout.addWidget(self.license_plate_widget, line_index, 1)
  320. line_index += 1
  321. info_gridlayout.addWidget(e2e_recognization_label, line_index, 0)
  322. info_gridlayout.addWidget(self.e2e_recognization_edit, line_index, 1)
  323. line_index += 1
  324. info_gridlayout.addWidget(
  325. segmentation_recognition_label, line_index, 0)
  326. info_gridlayout.addWidget(
  327. self.segmentation_recognition_edit, line_index, 1)
  328. line_index += 1
  329. info_gridlayout.addWidget(plate_color_label, line_index, 0)
  330. info_gridlayout.addWidget(self.plate_color_edit, line_index, 1)
  331. line_index += 1
  332. info_gridlayout.addWidget(block_image_label, line_index, 0)
  333. info_gridlayout.addWidget(self.block_plate_widget, line_index, 1)
  334. line_index += 1
  335. info_gridlayout.addWidget(confidence_label, line_index, 0)
  336. info_gridlayout.addWidget(self.confidence_edit, line_index, 1)
  337. line_index += 1
  338. info_gridlayout.addWidget(e2e_confidence_label, line_index, 0)
  339. info_gridlayout.addWidget(self.e2e_confidence_edit, line_index, 1)
  340. info_widget = QGroupBox("分割识别&e2e")
  341. info_widget.setLayout(info_gridlayout)
  342. right_splitter = QSplitter(Qt.Vertical)
  343. right_splitter.addWidget(self.hyperlpr_tableview)
  344. right_splitter.addWidget(function_groupbox)
  345. right_splitter.addWidget(info_widget)
  346. right_splitter.setStretchFactor(0, 2)
  347. right_splitter.setStretchFactor(2, 1)
  348. main_splitter = QSplitter(Qt.Horizontal)
  349. main_splitter.addWidget(self.image_window_view)
  350. main_splitter.addWidget(right_splitter)
  351. main_splitter.setStretchFactor(0, 1)
  352. self.image_filename_list = []
  353. self.hyperlpr_dir_path = ""
  354. self.segmentation_recognition_correct_number = 0
  355. self.color_correct_number = 0
  356. self.e2e_recognization_correct_number = 0
  357. self.current_row = 0
  358. self.batch_recognization_thread = LicenseRecognizationThread()
  359. self.batch_recognization_thread.recognization_done_signal.connect(
  360. self.recognization_done_slot)
  361. self.batch_recognization_thread.start()
  362. self.start_init_signal.connect(self.read_path_and_show_one_image)
  363. self.setCentralWidget(main_splitter)
  364. self.setWindowTitle("HyperLPR车牌识别软件v1.0")
  365. self.start_init_signal.emit()
  366. def read_path_and_show_one_image(self):
  367. hyperlpr_dir_info_filepath = QDir.homePath() + "/hyperlpr_dir_file"
  368. if os.path.exists(hyperlpr_dir_info_filepath):
  369. with open(hyperlpr_dir_info_filepath, 'r') as f:
  370. self.hyperlpr_dir_path = f.read()
  371. if len(self.hyperlpr_dir_path) > 0:
  372. self.reset_info_gui()
  373. if len(self.image_filename_list) > 0:
  374. self.recognize_and_show_one_image(self.image_filename_list[0], 0)
  375. def select_new_dir(self):
  376. self.hyperlpr_dir_path = QFileDialog.getExistingDirectory(
  377. self, "读取文件夹", QDir.currentPath())
  378. if len(self.hyperlpr_dir_path) > 0:
  379. hyperlpr_dir_info_filepath = QDir.homePath() + "/hyperlpr_dir_file"
  380. with open(hyperlpr_dir_info_filepath, 'w') as f:
  381. f.write(self.hyperlpr_dir_path)
  382. self.reset_info_gui()
  383. def rename_current_image_with_info(self):
  384. if len(self.hyperlpr_dir_path) > 0:
  385. target_dir_path = self.hyperlpr_dir_path + "/result"
  386. if not os.path.exists(target_dir_path):
  387. os.makedirs(target_dir_path)
  388. if len(self.plate_color_edit.text())>0 and len(self.e2e_recognization_edit.text())>0:
  389. orign_path = os.path.join(self.hyperlpr_dir_path, self.filename_edit.text())
  390. target_path = os.path.join(target_dir_path,self.plate_color_edit.text()+"-"+self.e2e_recognization_edit.text()+".jpg")
  391. shutil.copyfile(orign_path, target_path)
  392. def reset_info_gui(self):
  393. self.location_text.setText(self.hyperlpr_dir_path)
  394. self.scan_files_with_new_dir(self.hyperlpr_dir_path)
  395. self.fill_table_with_new_info()
  396. def scan_files_with_new_dir(self, path):
  397. name_list = os.listdir(path) # 列出文件夹下所有的目录与文件
  398. self.image_filename_list.clear()
  399. for i in range(0, len(name_list)):
  400. if name_list[i].endswith(
  401. ".jpg") or name_list[i].endswith(".png"):
  402. self.image_filename_list.append(name_list[i])
  403. def fill_table_with_new_info(self):
  404. self.hyperlpr_tableview.clearContents()
  405. row_count = self.hyperlpr_tableview.rowCount()
  406. for i in range(row_count, -1, -1):
  407. self.hyperlpr_tableview.removeRow(i)
  408. for i in range(0, len(self.image_filename_list)):
  409. row = self.hyperlpr_tableview.rowCount()
  410. self.hyperlpr_tableview.insertRow(row)
  411. item0 = QTableWidgetItem()
  412. item0.setTextAlignment(Qt.AlignCenter)
  413. self.hyperlpr_tableview.setItem(row, 0, item0)
  414. self.hyperlpr_tableview.item(
  415. row, 0).setText(
  416. self.image_filename_list[i])
  417. item1 = QTableWidgetItem()
  418. item1.setTextAlignment(Qt.AlignCenter)
  419. self.hyperlpr_tableview.setItem(row, 1, item1)
  420. item2 = QTableWidgetItem()
  421. item2.setTextAlignment(Qt.AlignCenter)
  422. self.hyperlpr_tableview.setItem(row, 2, item2)
  423. item3 = QTableWidgetItem()
  424. item3.setTextAlignment(Qt.AlignCenter)
  425. self.hyperlpr_tableview.setItem(row, 3, item3)
  426. item4 = QTableWidgetItem()
  427. item4.setTextAlignment(Qt.AlignCenter)
  428. self.hyperlpr_tableview.setItem(row, 4, item4)
  429. item5 = QTableWidgetItem()
  430. item5.setTextAlignment(Qt.AlignCenter)
  431. self.hyperlpr_tableview.setItem(row, 5, item5)
  432. if len(self.image_filename_list) > 0:
  433. self.left_button.setEnabled(True)
  434. self.right_button.setEnabled(True)
  435. self.save_as_e2e_filename_button.setEnabled(True)
  436. def analyze_last_one_image(self):
  437. if self.current_row > 0:
  438. self.recognize_one_license_plate(self.current_row-1, 0)
  439. def analyze_next_one_image(self):
  440. if self.current_row < (len(self.image_filename_list)-1):
  441. self.recognize_one_license_plate(self.current_row + 1, 0)
  442. def recognize_one_license_plate(self, row, col):
  443. if col == 0 and row < len(self.image_filename_list):
  444. self.current_row = row
  445. self.recognize_and_show_one_image(
  446. self.image_filename_list[row], row)
  447. def recognize_and_show_one_image(self, image_filename_text, row):
  448. if image_filename_text.endswith(".jpg"):
  449. print(image_filename_text)
  450. path = os.path.join(self.hyperlpr_dir_path, image_filename_text)
  451. image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
  452. image, res_set = SimpleRecognizePlateWithGui(image)
  453. img = QImage(
  454. image.data,
  455. image.shape[1],
  456. image.shape[0],
  457. image.shape[1] * image.shape[2],
  458. QImage.Format_RGB888)
  459. self.image_window_view.resetPixmap(img.rgbSwapped())
  460. self.image_window_view.resetRectText(res_set)
  461. if len(res_set) > 0:
  462. curr_rect = res_set[0][2]
  463. image_crop = image[int(curr_rect[1]):int(
  464. curr_rect[1] + curr_rect[3]), int(curr_rect[0]):int(curr_rect[0] + curr_rect[2])]
  465. curr_plate = cv2.resize(image_crop, (204, 108))
  466. plate_img = QImage(
  467. curr_plate.data,
  468. curr_plate.shape[1],
  469. curr_plate.shape[0],
  470. curr_plate.shape[1] *
  471. curr_plate.shape[2],
  472. QImage.Format_RGB888)
  473. self.license_plate_widget.setPixmap(
  474. QPixmap.fromImage(plate_img.rgbSwapped()))
  475. # print(res_set[0][6])
  476. block_crop = image[0:24, 0:(24 * int(res_set[0][6]))]
  477. curr_block = cv2.resize(
  478. block_crop, (24 * int(res_set[0][6]), 24))
  479. block_image = QImage(
  480. curr_block.data,
  481. curr_block.shape[1],
  482. curr_block.shape[0],
  483. curr_block.shape[1] *
  484. curr_block.shape[2],
  485. QImage.Format_RGB888)
  486. self.block_plate_widget.setPixmap(
  487. QPixmap.fromImage(block_image.rgbSwapped()))
  488. self.segmentation_recognition_edit.setText(res_set[0][0])
  489. if res_set[0][0] in image_filename_text:
  490. self.segmentation_recognition_edit.setStyleSheet("color:black")
  491. else:
  492. self.segmentation_recognition_edit.setStyleSheet("color:red")
  493. self.filename_edit.setText(image_filename_text)
  494. self.confidence_edit.setText("%.3f" % (float(res_set[0][1])))
  495. self.plate_color_edit.setText(res_set[0][3])
  496. if res_set[0][3] in image_filename_text:
  497. self.plate_color_edit.setStyleSheet("color:black")
  498. else:
  499. self.plate_color_edit.setStyleSheet("color:red")
  500. self.e2e_recognization_edit.setText(res_set[0][4])
  501. if res_set[0][4] in image_filename_text:
  502. self.e2e_recognization_edit.setStyleSheet("color:black")
  503. else:
  504. self.e2e_recognization_edit.setStyleSheet("color:red")
  505. self.e2e_confidence_edit.setText(
  506. "%.3f" % (float(res_set[0][5])))
  507. else:
  508. self.license_plate_widget.clear()
  509. self.block_plate_widget.clear()
  510. self.segmentation_recognition_edit.setText("")
  511. self.filename_edit.setText(image_filename_text)
  512. self.confidence_edit.setText("")
  513. self.plate_color_edit.setText("")
  514. self.e2e_recognization_edit.setText("")
  515. self.e2e_confidence_edit.setText("")
  516. self.fill_table_widget_with_res_info(res_set, row)
  517. def batch_recognize_all_images(self):
  518. self.segmentation_recognition_correct_number = 0
  519. self.color_correct_number = 0
  520. self.e2e_recognization_correct_number = 0
  521. self.batch_recognization_thread.set_parameter(
  522. self.image_filename_list, self.hyperlpr_dir_path)
  523. def recognization_done_slot(self, result_list):
  524. row = result_list[0]
  525. res_set = result_list[1]
  526. self.fill_table_widget_with_res_info(res_set, row)
  527. if row == len(self.image_filename_list) - 1:
  528. total_number = len(self.image_filename_list)
  529. row_count = self.hyperlpr_tableview.rowCount()
  530. if row_count > total_number:
  531. self.hyperlpr_tableview.removeRow(total_number)
  532. self.hyperlpr_tableview.insertRow(total_number)
  533. item0 = QTableWidgetItem()
  534. item0.setTextAlignment(Qt.AlignCenter)
  535. self.hyperlpr_tableview.setItem(total_number, 0, item0)
  536. self.hyperlpr_tableview.item(
  537. total_number, 0).setText(
  538. "统计结果")
  539. item1 = QTableWidgetItem()
  540. item1.setTextAlignment(Qt.AlignCenter)
  541. self.hyperlpr_tableview.setItem(total_number, 1, item1)
  542. self.hyperlpr_tableview.item(
  543. total_number,
  544. 1).setText(
  545. "{0} / {1} = {2: .3f}".format(
  546. self.segmentation_recognition_correct_number,
  547. total_number,
  548. self.segmentation_recognition_correct_number /
  549. total_number))
  550. item2 = QTableWidgetItem()
  551. item2.setTextAlignment(Qt.AlignCenter)
  552. self.hyperlpr_tableview.setItem(total_number, 2, item2)
  553. item3 = QTableWidgetItem()
  554. item3.setTextAlignment(Qt.AlignCenter)
  555. self.hyperlpr_tableview.setItem(total_number, 3, item3)
  556. self.hyperlpr_tableview.item(
  557. total_number, 3).setText(
  558. "{0} / {1} = {2: .3f}".format(self.e2e_recognization_correct_number, total_number,
  559. self.e2e_recognization_correct_number / total_number))
  560. item4 = QTableWidgetItem()
  561. item4.setTextAlignment(Qt.AlignCenter)
  562. self.hyperlpr_tableview.setItem(total_number, 4, item4)
  563. self.hyperlpr_tableview.item(
  564. total_number, 4).setText(
  565. "{0} / {1} = {2: .3f}".format(self.color_correct_number, total_number,
  566. self.color_correct_number / total_number))
  567. item5 = QTableWidgetItem()
  568. item5.setTextAlignment(Qt.AlignCenter)
  569. self.hyperlpr_tableview.setItem(total_number, 5, item5)
  570. def fill_table_widget_with_res_info(self, res_set, row):
  571. image_filename_text = self.image_filename_list[row]
  572. if len(res_set) > 0:
  573. self.hyperlpr_tableview.item(row, 1).setText(res_set[0][0])
  574. if res_set[0][0] in image_filename_text:
  575. self.hyperlpr_tableview.item(
  576. row, 1).setForeground(
  577. QBrush(
  578. QColor(
  579. 0, 0, 255)))
  580. self.segmentation_recognition_correct_number += 1
  581. else:
  582. self.hyperlpr_tableview.item(
  583. row, 1).setForeground(
  584. QBrush(
  585. QColor(
  586. 255, 0, 0)))
  587. self.hyperlpr_tableview.item(
  588. row, 2).setText(
  589. "%.3f" %
  590. (float(
  591. res_set[0][1])))
  592. self.hyperlpr_tableview.item(row, 3).setText(res_set[0][3])
  593. if res_set[0][3] in image_filename_text:
  594. self.hyperlpr_tableview.item(
  595. row, 3).setForeground(
  596. QBrush(
  597. QColor(
  598. 0, 0, 255)))
  599. self.color_correct_number += 1
  600. else:
  601. self.hyperlpr_tableview.item(
  602. row, 3).setForeground(
  603. QBrush(
  604. QColor(
  605. 255, 0, 0)))
  606. self.hyperlpr_tableview.item(row, 4).setText(res_set[0][4])
  607. if res_set[0][4] in image_filename_text:
  608. self.hyperlpr_tableview.item(
  609. row, 4).setForeground(
  610. QBrush(
  611. QColor(
  612. 0, 0, 255)))
  613. self.e2e_recognization_correct_number += 1
  614. else:
  615. self.hyperlpr_tableview.item(
  616. row, 4).setForeground(
  617. QBrush(
  618. QColor(
  619. 255, 0, 0)))
  620. self.hyperlpr_tableview.item(
  621. row, 5).setText(
  622. "%.3f" %
  623. (float(
  624. res_set[0][5])))
  625. if __name__ == '__main__':
  626. app = QApplication(sys.argv)
  627. hyper_lpr_widow = HyperLprWindow()
  628. hyper_lpr_widow.showMaximized()
  629. sys.exit(app.exec_())