|
|
"""
|
|
|
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("HyperLPR车牌识别软件v1.0")
|
|
|
|
|
|
self.start_init_signal.emit()
|
|
|
|
|
|
def read_path_and_show_one_image(self):
|
|
|
|
|
|
hyperlpr_dir_info_filepath = QDir.homePath() + "/hyperlpr_dir_file"
|
|
|
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"
|
|
|
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_())
|