text: """
  Author: youngorsu
  Email : zhiyongsu@qq.com
  Last edited: 2018.1.29
  """
  # coding=utf-8
  
  
  import sys
  import os
  from PyQt5.QtWidgets import (
      QMainWindow,
      QLabel,
      QLineEdit,
      QPushButton,
      QHBoxLayout,
      QVBoxLayout,
      QGridLayout,
      QTableWidget,
      QWidget,
      QAbstractItemView,
      QHeaderView,
      QGraphicsView,
      QGraphicsScene,
      QGraphicsPixmapItem,
      QSplitter,
      QFileDialog,
      QTableWidgetItem,
      QGraphicsRectItem,
      QCheckBox,
      QMessageBox,
      QGroupBox,
      QGraphicsSimpleTextItem,
      qApp,
      QAction,
      QApplication)
  from PyQt5.QtGui import QIcon, QColor, QPainter, QImage, QPixmap, QPen, QBrush, QFont, QPalette, QKeySequence
  from PyQt5.QtCore import Qt, QDir, QSize, QEventLoop, QThread, pyqtSignal
  
  from hyperlpr_py3 import pipline as pp
  
  import cv2
  
  import numpy as np
  
  import time
  
  import shutil
  
  draw_plate_in_image_enable = 1
  
  plateTypeName = ["蓝", "黄", "绿", "白", "黑 "]
  
  
  def SimpleRecognizePlateWithGui(image):
      t0 = time.time()
  
      images = pp.detect.detectPlateRough(
          image, image.shape[0], top_bottom_padding_rate=0.1)
  
      res_set = []
      y_offset = 32
      for j, plate in enumerate(images):
          plate, rect, origin_plate = plate
  
          plate = cv2.resize(plate, (136, 36 * 2))
          t1 = time.time()
  
          plate_type = pp.td.SimplePredict(plate)
          plate_color = plateTypeName[plate_type]
  
          if (plate_type > 0) and (plate_type < 5):
              plate = cv2.bitwise_not(plate)
  
          if draw_plate_in_image_enable == 1:
              image[y_offset:y_offset + plate.shape[0], 0:plate.shape[1]] = plate
              y_offset = y_offset + plate.shape[0] + 4
  
          image_rgb = pp.fm.findContoursAndDrawBoundingBox(plate)
  
          if draw_plate_in_image_enable == 1:
              image[y_offset:y_offset + image_rgb.shape[0],
                    0:image_rgb.shape[1]] = image_rgb
              y_offset = y_offset + image_rgb.shape[0] + 4
  
          image_rgb = pp.fv.finemappingVertical(image_rgb)
  
          if draw_plate_in_image_enable == 1:
              image[y_offset:y_offset + image_rgb.shape[0],
                    0:image_rgb.shape[1]] = image_rgb
              y_offset = y_offset + image_rgb.shape[0] + 4
  
          pp.cache.verticalMappingToFolder(image_rgb)
  
          if draw_plate_in_image_enable == 1:
              image[y_offset:y_offset + image_rgb.shape[0],
                    0:image_rgb.shape[1]] = image_rgb
              y_offset = y_offset + image_rgb.shape[0] + 4
  
          e2e_plate, e2e_confidence = pp.e2e.recognizeOne(image_rgb)
          print("e2e:", e2e_plate, e2e_confidence)
  
          image_gray = cv2.cvtColor(image_rgb, cv2.COLOR_RGB2GRAY)
  
          #print("校正", time.time() - t1, "s")
  
          t2 = time.time()
          val = pp.segmentation.slidingWindowsEval(image_gray)
          # print val
          #print("分割和识别", time.time() - t2, "s")
  
          res=""
          confidence = 0
          if len(val) == 3:
              blocks, res, confidence = val
              if confidence / 7 > 0.7:
  
                  if draw_plate_in_image_enable == 1:
                      image = pp.drawRectBox(image, rect, res)
                      for i, block in enumerate(blocks):
                          block_ = cv2.resize(block, (24, 24))
                          block_ = cv2.cvtColor(block_, cv2.COLOR_GRAY2BGR)
                          image[j * 24:(j * 24) + 24, i *
                                24:(i * 24) + 24] = block_
                          if image[j * 24:(j * 24) + 24,
                                   i * 24:(i * 24) + 24].shape == block_.shape:
                              pass
  
          res_set.append([res,
                          confidence / 7,
                          rect,
                          plate_color,
                          e2e_plate,
                          e2e_confidence,
                          len(blocks)])
          print("seg:",res,confidence/7)
      #print(time.time() - t0, "s")
  
      print("---------------------------------")
      return image, res_set
  
  
  class LicenseRecognizationThread(QThread):
  
      recognization_done_signal = pyqtSignal(list)
  
      def __init__(self, parent=None):
          super().__init__(parent)
          self.hyperlpr_dir_path = ""
          self.filenames = []
  
      def set_parameter(self, filename_list, path):
          self.hyperlpr_dir_path = path
          self.filenames = filename_list
  
      def run(self):
          while True:
              time.sleep(1)
              if len(self.hyperlpr_dir_path) > 0:
                  for i in range(0, len(self.filenames)):
                      path = os.path.join(
                          self.hyperlpr_dir_path, self.filenames[i])
                      image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
                      image, res_set = SimpleRecognizePlateWithGui(image)
                      self.recognization_done_signal.emit([i, res_set])
  
                  self.hyperlpr_dir_path = ""
  
  
  class HyperLprImageView(QGraphicsView):
  
      def __init__(self):
  
          super().__init__()
  
          self.init_ui()
  
      def init_ui(self):
  
          scene = QGraphicsScene()
          scene.setBackgroundBrush(QColor(100, 100, 100))
          scene.setItemIndexMethod(QGraphicsScene.BspTreeIndex)
  
          scene.setSceneRect(scene.itemsBoundingRect())
  
          self.setDragMode(QGraphicsView.RubberBandDrag)
          self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate)
          self.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing)
  
          self.frame_item = QGraphicsPixmapItem()
  
          self.text_item_offset = 0
          self.rect_item_array = []
          self.text_item_array = []
          for i in range(0, 5):
              rect_item = QGraphicsRectItem()
              rect_item.setVisible(False)
              rect_item.setZValue(20.0)
              rect_item.setPen(QPen(Qt.red, 5))
              rect_item.setRect(20, 20, 20, 20)
              scene.addItem(rect_item)
              self.rect_item_array.append(rect_item)
              text_item = QGraphicsSimpleTextItem("")
              text_item.setBrush(QBrush(Qt.red))
              text_item.setZValue(20.0)
              text_item.setPos(10, 50)
              text_item.setFont(QFont("黑体", 24))
              text_item.setVisible(False)
              scene.addItem(text_item)
              self.text_item_array.append(text_item)
  
          scene.addItem(self.frame_item)
  
          self.curr_factor = 1.0
  
          self.setScene(scene)
  
      def resetRectText(self, res_set):
          max_no = len(res_set)
  
          if max_no > 5:
              max_no = 5
  
          for i in range(0, 5):
              if i < max_no:
                  curr_rect = res_set[i][2]
                  self.rect_item_array[i].setRect(int(curr_rect[0]), int(
                      curr_rect[1]), int(curr_rect[2]), int(curr_rect[3]))
                  self.rect_item_array[i].setVisible(True)
  
                  self.text_item_array[i].setText(
                      res_set[i][4] + " " + res_set[i][3])
                  self.text_item_array[i].setPos(
                      int(curr_rect[0]), int(curr_rect[1]) - 48)
                  self.text_item_array[i].setVisible(True)
              else:
                  self.text_item_array[i].setVisible(False)
                  self.rect_item_array[i].setVisible(False)
  
      def wheelEvent(self, event):
          factor = event.angleDelta().y() / 120.0
          if event.angleDelta().y() / 120.0 > 0:
              factor = 1.08
          else:
              factor = 0.92
  
          if self.curr_factor > 0.1 and self.curr_factor < 10:
              self.curr_factor = self.curr_factor * factor
              self.scale(factor, factor)
  
      def resetPixmap(self, image):
  
          self.frame_item.setPixmap(QPixmap.fromImage(image))
  
  
  class HyperLprWindow(QMainWindow):
  
      start_init_signal = pyqtSignal()
  
      def __init__(self):
  
          super().__init__()
  
          self.initUI()
  
      def initUI(self):
  
          self.statusBar().showMessage('Ready')
  
          self.left_action = QAction('上一个', self)
          self.left_action.setShortcut(QKeySequence.MoveToPreviousChar)
          self.left_action.triggered.connect(self.analyze_last_one_image)
  
          self.right_action = QAction('下一个', self)
          self.right_action.setShortcut(QKeySequence.MoveToNextChar)
          self.right_action.triggered.connect(self.analyze_next_one_image)
  
          self.rename_image_action = QAction('保存e2e文件名', self)
          self.rename_image_action.setShortcut(QKeySequence.MoveToPreviousLine)
          self.rename_image_action.triggered.connect(self.rename_current_image_with_info)
  
          self.statusBar()
  
          menubar = self.menuBar()
          fileMenu = menubar.addMenu('&Function')
          fileMenu.addAction(self.left_action)
          fileMenu.addAction(self.right_action)
          fileMenu.addAction(self.rename_image_action)
  
          self.image_window_view = HyperLprImageView()
  
          table_widget_header_labels = [
              "文件名",
              "分割识别",
              "置信度",
              "颜色",
              "E2E识别",
              "E2E置信度"]
  
          self.hyperlpr_tableview = QTableWidget(
              0, len(table_widget_header_labels))
          self.hyperlpr_tableview.setHorizontalHeaderLabels(
              table_widget_header_labels)
  
          self.hyperlpr_tableview.setSelectionBehavior(
              QAbstractItemView.SelectItems)
          self.hyperlpr_tableview.setSelectionMode(
              QAbstractItemView.SingleSelection)
          self.hyperlpr_tableview.setEditTriggers(
              QAbstractItemView.NoEditTriggers)
          self.hyperlpr_tableview.horizontalHeader().setSectionResizeMode(
              QHeaderView.ResizeToContents)
          self.hyperlpr_tableview.setEditTriggers(
              QAbstractItemView.NoEditTriggers)
  
          self.hyperlpr_tableview.cellClicked.connect(
              self.recognize_one_license_plate)
  
          self.left_button = QPushButton("<")
          self.left_button.setFixedWidth(60)
          self.right_button = QPushButton(">")
          self.right_button.setFixedWidth(60)
          self.left_button.setEnabled(False)
          self.right_button.setEnabled(False)
          self.left_button.clicked.connect(self.analyze_last_one_image)
          self.right_button.clicked.connect(self.analyze_next_one_image)
          left_right_layout = QHBoxLayout()
          left_right_layout.addStretch()
          left_right_layout.addWidget(self.left_button)
          left_right_layout.addStretch()
          left_right_layout.addWidget(self.right_button)
          left_right_layout.addStretch()
  
          self.location_label = QLabel("车牌目录", self)
          self.location_text = QLineEdit(self)
          self.location_text.setEnabled(False)
          #self.location_text.setFixedWidth(300)
          self.location_button = QPushButton("...")
          self.location_button.clicked.connect(self.select_new_dir)
  
          self.location_layout = QHBoxLayout()
          self.location_layout.addWidget(self.location_label)
          self.location_layout.addWidget(self.location_text)
          self.location_layout.addWidget(self.location_button)
          self.location_layout.addStretch()
  
          self.check_box = QCheckBox("与文件名比较车牌")
          self.check_box.setChecked(True)
  
          self.update_file_path_button = QPushButton('批量识别')
          self.update_file_path_button.clicked.connect(
              self.batch_recognize_all_images)
  
          self.update_file_path_layout = QHBoxLayout()
          self.update_file_path_layout.addWidget(self.check_box)
          self.update_file_path_layout.addWidget(self.update_file_path_button)
          self.update_file_path_layout.addStretch()
  
          self.save_as_e2e_filename_button = QPushButton("保存e2e文件名")
          self.save_as_e2e_filename_button.setEnabled(False)
          self.save_as_e2e_filename_button.clicked.connect(self.rename_current_image_with_info)
          self.save_layout = QHBoxLayout()
          self.save_layout.addWidget(self.save_as_e2e_filename_button)
          self.save_layout.addStretch()
  
          self.top_layout = QVBoxLayout()
          self.top_layout.addLayout(left_right_layout)
          self.top_layout.addLayout(self.location_layout)
          self.top_layout.addLayout(self.update_file_path_layout)
          self.top_layout.addLayout(self.save_layout)
  
          function_groupbox = QGroupBox("功能区")
          function_groupbox.setLayout(self.top_layout)
  
          license_plate_image_label = QLabel("车牌图")
          self.license_plate_widget = QLabel("")
  
          block_image_label = QLabel("分割图")
          self.block_plate_widget = QLabel("")
  
          filename_label = QLabel("文件名：")
          self.filename_edit = QLineEdit()
  
          segmentation_recognition_label = QLabel("分割识别：")
          self.segmentation_recognition_edit = QLineEdit()
          self.segmentation_recognition_edit.setFont(QFont("黑体", 24, QFont.Bold))
          # self.segmentation_recognition_edit.setStyleSheet("color:red")
  
          confidence_label = QLabel("分割识别\n置信度")
          self.confidence_edit = QLineEdit()
          #self.confidence_edit.setFont(QFont("黑体", 24, QFont.Bold))
          # self.confidence_edit.setStyleSheet("color:red")
  
          plate_color_label = QLabel("车牌颜色")
          self.plate_color_edit = QLineEdit()
          self.plate_color_edit.setFont(QFont("黑体", 24, QFont.Bold))
          # self.plate_color_edit.setStyleSheet("color:red")
  
          e2e_recognization_label = QLabel("e2e识别：")
          self.e2e_recognization_edit = QLineEdit()
          self.e2e_recognization_edit.setFont(QFont("黑体", 24, QFont.Bold))
          # self.e2e_recognization_edit.setStyleSheet("color:red")
  
          e2e_confidence_label = QLabel("e2e置信度")
          self.e2e_confidence_edit = QLineEdit()
          #self.e2e_confidence_edit.setFont(QFont("黑体", 24, QFont.Bold))
          # self.e2e_confidence_edit.setStyleSheet("color:red")
  
          info_gridlayout = QGridLayout()
          line_index = 0
          info_gridlayout.addWidget(filename_label, line_index, 0)
          info_gridlayout.addWidget(self.filename_edit, line_index, 1)
          line_index += 1
          info_gridlayout.addWidget(license_plate_image_label, line_index, 0)
          info_gridlayout.addWidget(self.license_plate_widget, line_index, 1)
          line_index += 1
          info_gridlayout.addWidget(e2e_recognization_label, line_index, 0)
          info_gridlayout.addWidget(self.e2e_recognization_edit, line_index, 1)
          line_index += 1
          info_gridlayout.addWidget(
              segmentation_recognition_label, line_index, 0)
          info_gridlayout.addWidget(
              self.segmentation_recognition_edit, line_index, 1)
          line_index += 1
          info_gridlayout.addWidget(plate_color_label, line_index, 0)
          info_gridlayout.addWidget(self.plate_color_edit, line_index, 1)
          line_index += 1
          info_gridlayout.addWidget(block_image_label, line_index, 0)
          info_gridlayout.addWidget(self.block_plate_widget, line_index, 1)
          line_index += 1
          info_gridlayout.addWidget(confidence_label, line_index, 0)
          info_gridlayout.addWidget(self.confidence_edit, line_index, 1)
          line_index += 1
          info_gridlayout.addWidget(e2e_confidence_label, line_index, 0)
          info_gridlayout.addWidget(self.e2e_confidence_edit, line_index, 1)
  
          info_widget = QGroupBox("分割识别&e2e")
  
          info_widget.setLayout(info_gridlayout)
  
          right_splitter = QSplitter(Qt.Vertical)
          right_splitter.addWidget(self.hyperlpr_tableview)
          right_splitter.addWidget(function_groupbox)
          right_splitter.addWidget(info_widget)
          right_splitter.setStretchFactor(0, 2)
          right_splitter.setStretchFactor(2, 1)
  
          main_splitter = QSplitter(Qt.Horizontal)
          main_splitter.addWidget(self.image_window_view)
          main_splitter.addWidget(right_splitter)
          main_splitter.setStretchFactor(0, 1)
  
          self.image_filename_list = []
          self.hyperlpr_dir_path = ""
          self.segmentation_recognition_correct_number = 0
          self.color_correct_number = 0
          self.e2e_recognization_correct_number = 0
          self.current_row = 0
  
          self.batch_recognization_thread = LicenseRecognizationThread()
          self.batch_recognization_thread.recognization_done_signal.connect(
              self.recognization_done_slot)
          self.batch_recognization_thread.start()
  
          self.start_init_signal.connect(self.read_path_and_show_one_image)
  
          self.setCentralWidget(main_splitter)
  
          self.setWindowTitle("车牌识别软件v1.0")
  
          self.start_init_signal.emit()
  
      def read_path_and_show_one_image(self):
  
          hyperlpr_dir_info_filepath = QDir.homePath() + "/hyperlpr_dir_file.txt"
          if os.path.exists(hyperlpr_dir_info_filepath):
              with open(hyperlpr_dir_info_filepath, 'r') as f:
                  self.hyperlpr_dir_path = f.read()
  
          if len(self.hyperlpr_dir_path) > 0:
              self.reset_info_gui()
  
          if len(self.image_filename_list) > 0:
              self.recognize_and_show_one_image(self.image_filename_list[0], 0)
  
      def select_new_dir(self):
  
          self.hyperlpr_dir_path = QFileDialog.getExistingDirectory(
              self, "读取文件夹", QDir.currentPath())
  
          if len(self.hyperlpr_dir_path) > 0:
              hyperlpr_dir_info_filepath = QDir.homePath() + "/hyperlpr_dir_file.txt"
              with open(hyperlpr_dir_info_filepath, 'w') as f:
                  f.write(self.hyperlpr_dir_path)
              self.reset_info_gui()
  
      def rename_current_image_with_info(self):
          if len(self.hyperlpr_dir_path) > 0:
              target_dir_path = self.hyperlpr_dir_path + "/result"
              if not os.path.exists(target_dir_path):
                  os.makedirs(target_dir_path)
              if len(self.plate_color_edit.text())>0 and len(self.e2e_recognization_edit.text())>0:
                  orign_path = os.path.join(self.hyperlpr_dir_path, self.filename_edit.text())
                  target_path = os.path.join(target_dir_path,self.plate_color_edit.text()+"-"+self.e2e_recognization_edit.text()+".jpg")
                  shutil.copyfile(orign_path, target_path)
  
      def reset_info_gui(self):
  
          self.location_text.setText(self.hyperlpr_dir_path)
          self.scan_files_with_new_dir(self.hyperlpr_dir_path)
          self.fill_table_with_new_info()
  
      def scan_files_with_new_dir(self, path):
  
          name_list = os.listdir(path)  # 列出文件夹下所有的目录与文件
          self.image_filename_list.clear()
          for i in range(0, len(name_list)):
              if name_list[i].endswith(
                      ".jpg") or name_list[i].endswith(".png"):
                  self.image_filename_list.append(name_list[i])
  
      def fill_table_with_new_info(self):
          self.hyperlpr_tableview.clearContents()
          row_count = self.hyperlpr_tableview.rowCount()
          for i in range(row_count, -1, -1):
              self.hyperlpr_tableview.removeRow(i)
  
          for i in range(0, len(self.image_filename_list)):
              row = self.hyperlpr_tableview.rowCount()
              self.hyperlpr_tableview.insertRow(row)
  
              item0 = QTableWidgetItem()
              item0.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(row, 0, item0)
              self.hyperlpr_tableview.item(
                  row, 0).setText(
                  self.image_filename_list[i])
  
              item1 = QTableWidgetItem()
              item1.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(row, 1, item1)
  
              item2 = QTableWidgetItem()
              item2.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(row, 2, item2)
  
              item3 = QTableWidgetItem()
              item3.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(row, 3, item3)
  
              item4 = QTableWidgetItem()
              item4.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(row, 4, item4)
  
              item5 = QTableWidgetItem()
              item5.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(row, 5, item5)
  
          if len(self.image_filename_list) > 0:
              self.left_button.setEnabled(True)
              self.right_button.setEnabled(True)
              self.save_as_e2e_filename_button.setEnabled(True)
  
      def analyze_last_one_image(self):
          if self.current_row > 0:
              self.recognize_one_license_plate(self.current_row-1, 0)
  
      def analyze_next_one_image(self):
          if self.current_row < (len(self.image_filename_list)-1):
              self.recognize_one_license_plate(self.current_row + 1, 0)
  
      def recognize_one_license_plate(self, row, col):
          if col == 0 and row < len(self.image_filename_list):
              self.current_row = row
              self.recognize_and_show_one_image(
                  self.image_filename_list[row], row)
  
      def recognize_and_show_one_image(self, image_filename_text, row):
  
          if image_filename_text.endswith(".jpg"):
  
              print(image_filename_text)
              path = os.path.join(self.hyperlpr_dir_path, image_filename_text)
              image = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
              image, res_set = SimpleRecognizePlateWithGui(image)
              img = QImage(
                  image.data,
                  image.shape[1],
                  image.shape[0],
                  image.shape[1] * image.shape[2],
                  QImage.Format_RGB888)
              self.image_window_view.resetPixmap(img.rgbSwapped())
              self.image_window_view.resetRectText(res_set)
  
              if len(res_set) > 0:
                  curr_rect = res_set[0][2]
                  image_crop = image[int(curr_rect[1]):int(
                      curr_rect[1] + curr_rect[3]), int(curr_rect[0]):int(curr_rect[0] + curr_rect[2])]
                  curr_plate = cv2.resize(image_crop, (204, 108))
                  plate_img = QImage(
                      curr_plate.data,
                      curr_plate.shape[1],
                      curr_plate.shape[0],
                      curr_plate.shape[1] *
                      curr_plate.shape[2],
                      QImage.Format_RGB888)
                  self.license_plate_widget.setPixmap(
                      QPixmap.fromImage(plate_img.rgbSwapped()))
  
                  # print(res_set[0][6])
                  block_crop = image[0:24, 0:(24 * int(res_set[0][6]))]
                  curr_block = cv2.resize(
                      block_crop, (24 * int(res_set[0][6]), 24))
                  block_image = QImage(
                      curr_block.data,
                      curr_block.shape[1],
                      curr_block.shape[0],
                      curr_block.shape[1] *
                      curr_block.shape[2],
                      QImage.Format_RGB888)
                  self.block_plate_widget.setPixmap(
                      QPixmap.fromImage(block_image.rgbSwapped()))
  
                  self.segmentation_recognition_edit.setText(res_set[0][0])
                  if res_set[0][0] in image_filename_text:
                      self.segmentation_recognition_edit.setStyleSheet("color:black")
                  else:
                      self.segmentation_recognition_edit.setStyleSheet("color:red")
  
  
                  self.filename_edit.setText(image_filename_text)
                  self.confidence_edit.setText("%.3f" % (float(res_set[0][1])))
  
                  self.plate_color_edit.setText(res_set[0][3])
                  if res_set[0][3] in image_filename_text:
                      self.plate_color_edit.setStyleSheet("color:black")
                  else:
                      self.plate_color_edit.setStyleSheet("color:red")
  
                  self.e2e_recognization_edit.setText(res_set[0][4])
                  if res_set[0][4] in image_filename_text:
                      self.e2e_recognization_edit.setStyleSheet("color:black")
                  else:
                      self.e2e_recognization_edit.setStyleSheet("color:red")
  
                  self.e2e_confidence_edit.setText(
                      "%.3f" % (float(res_set[0][5])))
              else:
                  self.license_plate_widget.clear()
                  self.block_plate_widget.clear()
                  self.segmentation_recognition_edit.setText("")
                  self.filename_edit.setText(image_filename_text)
                  self.confidence_edit.setText("")
                  self.plate_color_edit.setText("")
                  self.e2e_recognization_edit.setText("")
                  self.e2e_confidence_edit.setText("")
  
              self.fill_table_widget_with_res_info(res_set, row)
  
      def batch_recognize_all_images(self):
          self.segmentation_recognition_correct_number = 0
          self.color_correct_number = 0
          self.e2e_recognization_correct_number = 0
          self.batch_recognization_thread.set_parameter(
              self.image_filename_list, self.hyperlpr_dir_path)
  
      def recognization_done_slot(self, result_list):
          row = result_list[0]
          res_set = result_list[1]
          self.fill_table_widget_with_res_info(res_set, row)
  
          if row == len(self.image_filename_list) - 1:
              total_number = len(self.image_filename_list)
  
              row_count = self.hyperlpr_tableview.rowCount()
              if row_count > total_number:
                  self.hyperlpr_tableview.removeRow(total_number)
  
              self.hyperlpr_tableview.insertRow(total_number)
  
              item0 = QTableWidgetItem()
              item0.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(total_number, 0, item0)
              self.hyperlpr_tableview.item(
                  total_number, 0).setText(
                  "统计结果")
  
              item1 = QTableWidgetItem()
              item1.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(total_number, 1, item1)
              self.hyperlpr_tableview.item(
                  total_number,
                  1).setText(
                  "{0} / {1} = {2: .3f}".format(
                      self.segmentation_recognition_correct_number,
                      total_number,
                      self.segmentation_recognition_correct_number /
                      total_number))
  
              item2 = QTableWidgetItem()
              item2.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(total_number, 2, item2)
  
              item3 = QTableWidgetItem()
              item3.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(total_number, 3, item3)
              self.hyperlpr_tableview.item(
                  total_number, 3).setText(
                  "{0} / {1} = {2: .3f}".format(self.e2e_recognization_correct_number, total_number,
                                                self.e2e_recognization_correct_number / total_number))
  
              item4 = QTableWidgetItem()
              item4.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(total_number, 4, item4)
              self.hyperlpr_tableview.item(
                  total_number, 4).setText(
                  "{0} / {1} = {2: .3f}".format(self.color_correct_number, total_number,
                                                self.color_correct_number / total_number))
  
              item5 = QTableWidgetItem()
              item5.setTextAlignment(Qt.AlignCenter)
              self.hyperlpr_tableview.setItem(total_number, 5, item5)
  
      def fill_table_widget_with_res_info(self, res_set, row):
          image_filename_text = self.image_filename_list[row]
          if len(res_set) > 0:
  
              self.hyperlpr_tableview.item(row, 1).setText(res_set[0][0])
              if res_set[0][0] in image_filename_text:
                  self.hyperlpr_tableview.item(
                      row, 1).setForeground(
                      QBrush(
                          QColor(
                              0, 0, 255)))
                  self.segmentation_recognition_correct_number += 1
              else:
                  self.hyperlpr_tableview.item(
                      row, 1).setForeground(
                      QBrush(
                          QColor(
                              255, 0, 0)))
  
              self.hyperlpr_tableview.item(
                  row, 2).setText(
                  "%.3f" %
                  (float(
                      res_set[0][1])))
  
              self.hyperlpr_tableview.item(row, 3).setText(res_set[0][3])
              if res_set[0][3] in image_filename_text:
                  self.hyperlpr_tableview.item(
                      row, 3).setForeground(
                      QBrush(
                          QColor(
                              0, 0, 255)))
                  self.color_correct_number += 1
              else:
                  self.hyperlpr_tableview.item(
                      row, 3).setForeground(
                      QBrush(
                          QColor(
                              255, 0, 0)))
  
              self.hyperlpr_tableview.item(row, 4).setText(res_set[0][4])
              if res_set[0][4] in image_filename_text:
                  self.hyperlpr_tableview.item(
                      row, 4).setForeground(
                      QBrush(
                          QColor(
                              0, 0, 255)))
                  self.e2e_recognization_correct_number += 1
              else:
                  self.hyperlpr_tableview.item(
                      row, 4).setForeground(
                      QBrush(
                          QColor(
                              255, 0, 0)))
  
              self.hyperlpr_tableview.item(
                  row, 5).setText(
                  "%.3f" %
                  (float(
                      res_set[0][5])))
  
  
  if __name__ == '__main__':
  
      app = QApplication(sys.argv)
  
      hyper_lpr_widow = HyperLprWindow()
  
      hyper_lpr_widow.showMaximized()
  
      sys.exit(app.exec_())
  