From 044a8eb07ad9a85b815fd1fb696966a6b52ebe85 Mon Sep 17 00:00:00 2001 From: 283375 Date: Tue, 15 Aug 2023 15:33:11 +0800 Subject: [PATCH] wip: DeviceV2 ocr support --- ui/designer/components/ocrQueue.ui | 267 +++++++++++++------------- ui/designer/components/ocrQueue_ui.py | 26 +-- ui/designer/tabs/tabOcr.ui | 103 +++++++++- ui/designer/tabs/tabOcr_ui.py | 70 ++++++- ui/implements/tabs/tabOcr.py | 37 +++- 5 files changed, 335 insertions(+), 168 deletions(-) diff --git a/ui/designer/components/ocrQueue.ui b/ui/designer/components/ocrQueue.ui index 7a0ce83..1d17689 100644 --- a/ui/designer/components/ocrQueue.ui +++ b/ui/designer/components/ocrQueue.ui @@ -13,155 +13,146 @@ OcrQueue - + - + - ocr.title + ocr.queue.title - + - - - ocr.queue.title + + + ocr.queue.addImageButton - - - - - ocr.queue.addImageButton - - - - - - - true - - - ocr.queue.removeSelected - - - - - - - true - - - ocr.queue.removeAll - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ocr.queue.startOcrButton - - - - - - - - - QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed - - - QAbstractItemView::MultiSelection - - - QAbstractItemView::SelectRows - - - QAbstractItemView::ScrollPerPixel - - - QAbstractItemView::ScrollPerPixel - - - - - - - 0 - - - 0 - - - 0 - - - Qt::AlignCenter - - - %v/%m - %p% - - - - + + + true + + + ocr.queue.removeSelected + + - - - ocr.results + + + true + + + ocr.queue.removeAll + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + ocr.queue.startOcrButton + + + + + + + + + + + + QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed + + + QAbstractItemView::MultiSelection + + + QAbstractItemView::SelectRows + + + QAbstractItemView::ScrollPerPixel + + + QAbstractItemView::ScrollPerPixel + + + + + + + 0 + + + 0 + + + 0 + + + Qt::AlignCenter + + + %v/%m - %p% + + + + + + + + + ocr.results + + + + + + true + + + ocr.results.acceptSelectedButton + + + + + + + ocr.results.acceptAllButton + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + ocr.results.ignoreValidate - - - - - true - - - ocr.results.acceptSelectedButton - - - - - - - ocr.results.acceptAllButton - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ocr.results.ignoreValidate - - - - diff --git a/ui/designer/components/ocrQueue_ui.py b/ui/designer/components/ocrQueue_ui.py index b6ae814..eba0cb6 100644 --- a/ui/designer/components/ocrQueue_ui.py +++ b/ui/designer/components/ocrQueue_ui.py @@ -25,13 +25,9 @@ class Ui_OcrQueue(object): if not OcrQueue.objectName(): OcrQueue.setObjectName(u"OcrQueue") OcrQueue.resize(741, 372) - self.verticalLayout = QVBoxLayout(OcrQueue) - self.verticalLayout.setObjectName(u"verticalLayout") - self.groupBox_2 = QGroupBox(OcrQueue) - self.groupBox_2.setObjectName(u"groupBox_2") - self.horizontalLayout = QHBoxLayout(self.groupBox_2) - self.horizontalLayout.setObjectName(u"horizontalLayout") - self.groupBox_3 = QGroupBox(self.groupBox_2) + self.horizontalLayout_2 = QHBoxLayout(OcrQueue) + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.groupBox_3 = QGroupBox(OcrQueue) self.groupBox_3.setObjectName(u"groupBox_3") self.verticalLayout_2 = QVBoxLayout(self.groupBox_3) self.verticalLayout_2.setObjectName(u"verticalLayout_2") @@ -62,11 +58,11 @@ class Ui_OcrQueue(object): self.verticalLayout_2.addWidget(self.ocr_startButton) - self.horizontalLayout.addWidget(self.groupBox_3) + self.horizontalLayout_2.addWidget(self.groupBox_3) self.verticalLayout_3 = QVBoxLayout() self.verticalLayout_3.setObjectName(u"verticalLayout_3") - self.tableView = QTableView(self.groupBox_2) + self.tableView = QTableView(OcrQueue) self.tableView.setObjectName(u"tableView") self.tableView.setEditTriggers(QAbstractItemView.DoubleClicked|QAbstractItemView.EditKeyPressed) self.tableView.setSelectionMode(QAbstractItemView.MultiSelection) @@ -76,7 +72,7 @@ class Ui_OcrQueue(object): self.verticalLayout_3.addWidget(self.tableView) - self.progressBar = QProgressBar(self.groupBox_2) + self.progressBar = QProgressBar(OcrQueue) self.progressBar.setObjectName(u"progressBar") self.progressBar.setMinimum(0) self.progressBar.setMaximum(0) @@ -87,9 +83,9 @@ class Ui_OcrQueue(object): self.verticalLayout_3.addWidget(self.progressBar) - self.horizontalLayout.addLayout(self.verticalLayout_3) + self.horizontalLayout_2.addLayout(self.verticalLayout_3) - self.groupBox_5 = QGroupBox(self.groupBox_2) + self.groupBox_5 = QGroupBox(OcrQueue) self.groupBox_5.setObjectName(u"groupBox_5") self.verticalLayout_4 = QVBoxLayout(self.groupBox_5) self.verticalLayout_4.setObjectName(u"verticalLayout_4") @@ -114,10 +110,7 @@ class Ui_OcrQueue(object): self.verticalLayout_4.addWidget(self.ocr_ignoreValidateCheckBox) - self.horizontalLayout.addWidget(self.groupBox_5) - - - self.verticalLayout.addWidget(self.groupBox_2) + self.horizontalLayout_2.addWidget(self.groupBox_5) self.retranslateUi(OcrQueue) @@ -127,7 +120,6 @@ class Ui_OcrQueue(object): def retranslateUi(self, OcrQueue): OcrQueue.setWindowTitle(QCoreApplication.translate("OcrQueue", u"OcrQueue", None)) - self.groupBox_2.setTitle(QCoreApplication.translate("OcrQueue", u"ocr.title", None)) self.groupBox_3.setTitle(QCoreApplication.translate("OcrQueue", u"ocr.queue.title", None)) self.ocr_addImageButton.setText(QCoreApplication.translate("OcrQueue", u"ocr.queue.addImageButton", None)) self.ocr_removeSelectedButton.setText(QCoreApplication.translate("OcrQueue", u"ocr.queue.removeSelected", None)) diff --git a/ui/designer/tabs/tabOcr.ui b/ui/designer/tabs/tabOcr.ui index b03a1f8..f95df60 100644 --- a/ui/designer/tabs/tabOcr.ui +++ b/ui/designer/tabs/tabOcr.ui @@ -37,19 +37,112 @@ - - - tesseractSelector.title + + + + 0 + 0 + - + + + 0 + + + 0 + + + 0 + + + 0 + - + + + knnModelSelector.title + + + + + + + + + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + tesseractSelector.title + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + siftDatabaseSelector.title + + + + + + + + + + + + + + 0 + 0 + + ocr.title diff --git a/ui/designer/tabs/tabOcr_ui.py b/ui/designer/tabs/tabOcr_ui.py index e29f627..1ab57b7 100644 --- a/ui/designer/tabs/tabOcr_ui.py +++ b/ui/designer/tabs/tabOcr_ui.py @@ -16,7 +16,7 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, QImage, QKeySequence, QLinearGradient, QPainter, QPalette, QPixmap, QRadialGradient, QTransform) from PySide6.QtWidgets import (QApplication, QGroupBox, QHBoxLayout, QPushButton, - QSizePolicy, QVBoxLayout, QWidget) + QSizePolicy, QStackedWidget, QVBoxLayout, QWidget) from ui.implements.components import (DevicesComboBox, FileSelector, OcrQueue) @@ -50,7 +50,36 @@ class Ui_TabOcr(object): self.verticalLayout_3.addWidget(self.groupBox) - self.groupBox_4 = QGroupBox(TabOcr) + self.horizontalWidget = QWidget(TabOcr) + self.horizontalWidget.setObjectName(u"horizontalWidget") + sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.horizontalWidget.sizePolicy().hasHeightForWidth()) + self.horizontalWidget.setSizePolicy(sizePolicy) + self.horizontalLayout_2 = QHBoxLayout(self.horizontalWidget) + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) + self.groupBox_6 = QGroupBox(self.horizontalWidget) + self.groupBox_6.setObjectName(u"groupBox_6") + self.verticalLayout_6 = QVBoxLayout(self.groupBox_6) + self.verticalLayout_6.setObjectName(u"verticalLayout_6") + self.knnModelSelector = FileSelector(self.groupBox_6) + self.knnModelSelector.setObjectName(u"knnModelSelector") + + self.verticalLayout_6.addWidget(self.knnModelSelector) + + + self.horizontalLayout_2.addWidget(self.groupBox_6) + + self.deviceDependenciesStackedWidget = QStackedWidget(self.horizontalWidget) + self.deviceDependenciesStackedWidget.setObjectName(u"deviceDependenciesStackedWidget") + self.deviceV1 = QWidget() + self.deviceV1.setObjectName(u"deviceV1") + self.verticalLayout_2 = QVBoxLayout(self.deviceV1) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) + self.groupBox_4 = QGroupBox(self.deviceV1) self.groupBox_4.setObjectName(u"groupBox_4") self.verticalLayout_5 = QVBoxLayout(self.groupBox_4) self.verticalLayout_5.setObjectName(u"verticalLayout_5") @@ -60,10 +89,40 @@ class Ui_TabOcr(object): self.verticalLayout_5.addWidget(self.tesseractFileSelector) - self.verticalLayout_3.addWidget(self.groupBox_4) + self.verticalLayout_2.addWidget(self.groupBox_4) + + self.deviceDependenciesStackedWidget.addWidget(self.deviceV1) + self.deviceV2 = QWidget() + self.deviceV2.setObjectName(u"deviceV2") + self.verticalLayout_4 = QVBoxLayout(self.deviceV2) + self.verticalLayout_4.setObjectName(u"verticalLayout_4") + self.verticalLayout_4.setContentsMargins(0, 0, 0, 0) + self.groupBox_5 = QGroupBox(self.deviceV2) + self.groupBox_5.setObjectName(u"groupBox_5") + self.verticalLayout_7 = QVBoxLayout(self.groupBox_5) + self.verticalLayout_7.setObjectName(u"verticalLayout_7") + self.siftDatabaseSelector = FileSelector(self.groupBox_5) + self.siftDatabaseSelector.setObjectName(u"siftDatabaseSelector") + + self.verticalLayout_7.addWidget(self.siftDatabaseSelector) + + + self.verticalLayout_4.addWidget(self.groupBox_5) + + self.deviceDependenciesStackedWidget.addWidget(self.deviceV2) + + self.horizontalLayout_2.addWidget(self.deviceDependenciesStackedWidget) + + + self.verticalLayout_3.addWidget(self.horizontalWidget) self.groupBox_2 = QGroupBox(TabOcr) self.groupBox_2.setObjectName(u"groupBox_2") + sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) + self.groupBox_2.setSizePolicy(sizePolicy1) self.horizontalLayout = QHBoxLayout(self.groupBox_2) self.horizontalLayout.setObjectName(u"horizontalLayout") self.ocrQueue = OcrQueue(self.groupBox_2) @@ -77,13 +136,18 @@ class Ui_TabOcr(object): self.retranslateUi(TabOcr) + self.deviceDependenciesStackedWidget.setCurrentIndex(0) + + QMetaObject.connectSlotsByName(TabOcr) # setupUi def retranslateUi(self, TabOcr): self.openWizardButton.setText(QCoreApplication.translate("TabOcr", u"openWizardButton", None)) self.groupBox.setTitle(QCoreApplication.translate("TabOcr", u"deviceSelector.title", None)) + self.groupBox_6.setTitle(QCoreApplication.translate("TabOcr", u"knnModelSelector.title", None)) self.groupBox_4.setTitle(QCoreApplication.translate("TabOcr", u"tesseractSelector.title", None)) + self.groupBox_5.setTitle(QCoreApplication.translate("TabOcr", u"siftDatabaseSelector.title", None)) self.groupBox_2.setTitle(QCoreApplication.translate("TabOcr", u"ocr.title", None)) pass # retranslateUi diff --git a/ui/implements/tabs/tabOcr.py b/ui/implements/tabs/tabOcr.py index 5238cfb..aa55473 100644 --- a/ui/implements/tabs/tabOcr.py +++ b/ui/implements/tabs/tabOcr.py @@ -1,14 +1,17 @@ +import cv2 import pytesseract # from arcaea_offline_ocr_device_creation_wizard.implements.wizard import Wizard -from PySide6.QtCore import QModelIndex, Qt, Slot -from PySide6.QtGui import QColor -from PySide6.QtWidgets import QFileDialog, QHeaderView, QWidget +from arcaea_offline_ocr.device.v1.definition import DeviceV1 +from arcaea_offline_ocr.device.v2.definition import DeviceV2 +from arcaea_offline_ocr.sift_db import SIFTDatabase +from PySide6.QtCore import Slot +from PySide6.QtWidgets import QFileDialog, QWidget from ui.designer.tabs.tabOcr_ui import Ui_TabOcr from ui.extends.components.ocrQueue import OcrQueueModel from ui.extends.settings import Settings -from ui.extends.tabs.tabOcr import TabDeviceV2OcrRunnable, ScoreInsertConverter +from ui.extends.tabs.tabOcr import ScoreInsertConverter, TabDeviceV2OcrRunnable class TabOcr(Ui_TabOcr, QWidget): @@ -17,10 +20,16 @@ class TabOcr(Ui_TabOcr, QWidget): self.setupUi(self) self.openWizardButton.setEnabled(False) + self.deviceComboBox.currentIndexChanged.connect( + self.changeDeviceDepStackedWidget + ) + self.deviceFileSelector.filesSelected.connect(self.deviceFileSelected) + self.knnModelSelector.filesSelected.connect(self.knnModelFileSelected) self.tesseractFileSelector.filesSelected.connect( self.tesseractFileSelectorFilesSelected ) + self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseFileSelected) settings = Settings() self.deviceFileSelector.selectFile(settings.devicesJsonFile()) @@ -37,17 +46,32 @@ class TabOcr(Ui_TabOcr, QWidget): # wizard.open() pass + def changeDeviceDepStackedWidget(self): + device = self.deviceComboBox.currentData() + if isinstance(device, (DeviceV1, DeviceV2)): + self.deviceDependenciesStackedWidget.setCurrentIndex(device.version - 1) + def deviceFileSelected(self): selectedFiles = self.deviceFileSelector.selectedFiles() if selectedFiles: file = selectedFiles[0] self.deviceComboBox.loadDevicesJson(file) + def knnModelFileSelected(self): + selectedFiles = self.knnModelSelector.selectedFiles() + if selectedFiles: + self.knnModel = cv2.ml.KNearest.load(selectedFiles[0]) + def tesseractFileSelectorFilesSelected(self): selectedFiles = self.tesseractFileSelector.selectedFiles() if selectedFiles: pytesseract.pytesseract.tesseract_cmd = selectedFiles[0] + def siftDatabaseFileSelected(self): + selectedFiles = self.siftDatabaseSelector.selectedFiles() + if selectedFiles: + self.siftDatabase = SIFTDatabase(selectedFiles[0]) + @Slot() def on_ocr_addImageButton_clicked(self): files, _filter = QFileDialog.getOpenFileNames( @@ -63,7 +87,10 @@ class TabOcr(Ui_TabOcr, QWidget): index = self.ocrQueueModel.index(row, 0) imagePath = index.data(OcrQueueModel.ImagePathRole) runnable = TabDeviceV2OcrRunnable( - imagePath, self.deviceComboBox.currentData(), self.knn, self.siftDb + imagePath, + self.deviceComboBox.currentData(), + self.knnModel, + self.siftDatabase, ) self.ocrQueueModel.setData(index, runnable, OcrQueueModel.OcrRunnableRole) self.ocrQueueModel.setData(