|
@@ -0,0 +1,656 @@ |
|
|
|
|
|
""" |
|
|
|
|
|
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, |
|
|
|
|
|
QGraphicsSimpleTextItem, |
|
|
|
|
|
qApp, |
|
|
|
|
|
QApplication) |
|
|
|
|
|
from PyQt5.QtGui import QIcon, QColor, QPainter, QImage, QPixmap, QPen, QBrush, QFont, QPalette |
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def SimpleRecognizePlateWithGui(image): |
|
|
|
|
|
t0 = time.time() |
|
|
|
|
|
|
|
|
|
|
|
images = pp.detect.detectPlateRough( |
|
|
|
|
|
image, image.shape[0], top_bottom_padding_rate=0.1) |
|
|
|
|
|
|
|
|
|
|
|
res_set = [] |
|
|
|
|
|
for j, plate in enumerate(images): |
|
|
|
|
|
plate, rect, origin_plate = plate |
|
|
|
|
|
plate = cv2.resize(plate, (136, 36 * 2)) |
|
|
|
|
|
t1 = time.time() |
|
|
|
|
|
|
|
|
|
|
|
plate_color = "钃" |
|
|
|
|
|
plate_type = pp.td.SimplePredict(plate) |
|
|
|
|
|
|
|
|
|
|
|
if (plate_type > 0) and (plate_type < 5): |
|
|
|
|
|
plate = cv2.bitwise_not(plate) |
|
|
|
|
|
plate_color = "榛" |
|
|
|
|
|
|
|
|
|
|
|
image_rgb = pp.fm.findContoursAndDrawBoundingBox(plate) |
|
|
|
|
|
|
|
|
|
|
|
image_rgb = pp.fv.finemappingVertical(image_rgb) |
|
|
|
|
|
pp.cache.verticalMappingToFolder(image_rgb) |
|
|
|
|
|
|
|
|
|
|
|
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") |
|
|
|
|
|
|
|
|
|
|
|
if len(val) == 3: |
|
|
|
|
|
blocks, res, confidence = val |
|
|
|
|
|
if confidence / 7 > 0.7: |
|
|
|
|
|
|
|
|
|
|
|
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(time.time() - t0, "s") |
|
|
|
|
|
|
|
|
|
|
|
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("榛戜綋", 32)) |
|
|
|
|
|
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][0] + " " + 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.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.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.bottom_layout = QVBoxLayout() |
|
|
|
|
|
self.bottom_layout.addLayout(self.location_layout) |
|
|
|
|
|
self.bottom_layout.addLayout(self.update_file_path_layout) |
|
|
|
|
|
bottom_widget = QWidget() |
|
|
|
|
|
bottom_widget.setLayout(self.bottom_layout) |
|
|
|
|
|
|
|
|
|
|
|
license_plate_iamge_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("缃俊搴") |
|
|
|
|
|
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() |
|
|
|
|
|
info_gridlayout.addWidget(filename_label, 0, 0) |
|
|
|
|
|
info_gridlayout.addWidget(self.filename_edit, 0, 1) |
|
|
|
|
|
info_gridlayout.addWidget(license_plate_iamge_label, 1, 0) |
|
|
|
|
|
info_gridlayout.addWidget(self.license_plate_widget, 1, 1) |
|
|
|
|
|
info_gridlayout.addWidget(block_image_label, 2, 0) |
|
|
|
|
|
info_gridlayout.addWidget(self.block_plate_widget, 2, 1) |
|
|
|
|
|
info_gridlayout.addWidget(segmentation_recognition_label, 3, 0) |
|
|
|
|
|
info_gridlayout.addWidget(self.segmentation_recognition_edit, 3, 1) |
|
|
|
|
|
info_gridlayout.addWidget(confidence_label, 4, 0) |
|
|
|
|
|
info_gridlayout.addWidget(self.confidence_edit, 4, 1) |
|
|
|
|
|
info_gridlayout.addWidget(plate_color_label, 5, 0) |
|
|
|
|
|
info_gridlayout.addWidget(self.plate_color_edit, 5, 1) |
|
|
|
|
|
info_gridlayout.addWidget(e2e_recognization_label, 6, 0) |
|
|
|
|
|
info_gridlayout.addWidget(self.e2e_recognization_edit, 6, 1) |
|
|
|
|
|
info_gridlayout.addWidget(e2e_confidence_label, 7, 0) |
|
|
|
|
|
info_gridlayout.addWidget(self. e2e_confidence_edit, 7, 1) |
|
|
|
|
|
|
|
|
|
|
|
info_widget = QWidget() |
|
|
|
|
|
|
|
|
|
|
|
info_widget.setLayout(info_gridlayout) |
|
|
|
|
|
|
|
|
|
|
|
right_splitter = QSplitter(Qt.Vertical) |
|
|
|
|
|
right_splitter.addWidget(bottom_widget) |
|
|
|
|
|
right_splitter.addWidget(self.hyperlpr_tableview) |
|
|
|
|
|
right_splitter.addWidget(info_widget) |
|
|
|
|
|
right_splitter.setStretchFactor(1, 3) |
|
|
|
|
|
right_splitter.setStretchFactor(2, 2) |
|
|
|
|
|
|
|
|
|
|
|
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.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 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) |
|
|
|
|
|
|
|
|
|
|
|
def recognize_one_license_plate(self, row, col): |
|
|
|
|
|
if col == 0 and row < len(self.image_filename_list): |
|
|
|
|
|
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"): |
|
|
|
|
|
|
|
|
|
|
|
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, (136, 72)) |
|
|
|
|
|
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]) |
|
|
|
|
|
|
|
|
|
|
|
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]) |
|
|
|
|
|
self.e2e_recognization_edit.setText(res_set[0][4]) |
|
|
|
|
|
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("") |
|
|
|
|
|
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_()) |