wip: ImagePHashDatabase & SizesV2

This commit is contained in:
283375 2023-09-27 17:16:33 +08:00
parent d701055c74
commit 9c06c6d9f1
Signed by: 283375
SSH Key Fingerprint: SHA256:UcX0qg6ZOSDOeieKPGokA5h7soykG61nz2uxuQgVLSk
7 changed files with 363 additions and 315 deletions

View File

@ -59,11 +59,11 @@
<item> <item>
<widget class="QGroupBox" name="groupBox_4"> <widget class="QGroupBox" name="groupBox_4">
<property name="title"> <property name="title">
<string>siftDatabaseSelector.title</string> <string>phashDatabaseSelector.title</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_5"> <layout class="QVBoxLayout" name="verticalLayout_5">
<item> <item>
<widget class="FileSelector" name="siftDatabaseSelector" native="true"/> <widget class="FileSelector" name="phashDatabaseSelector" native="true"/>
</item> </item>
</layout> </layout>
</widget> </widget>

View File

@ -1,126 +1,126 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################################################################################ ################################################################################
## Form generated from reading UI file 'tabOcr_B30.ui' ## Form generated from reading UI file 'tabOcr_B30.ui'
## ##
## Created by: Qt User Interface Compiler version 6.5.1 ## Created by: Qt User Interface Compiler version 6.5.2
## ##
## WARNING! All changes made in this file will be lost when recompiling UI file! ## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################ ################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect, QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt) QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon, QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter, QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform) QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QComboBox, QGroupBox, QHBoxLayout, from PySide6.QtWidgets import (QApplication, QComboBox, QGroupBox, QHBoxLayout,
QSizePolicy, QVBoxLayout, QWidget) QSizePolicy, QVBoxLayout, QWidget)
from ui.implements.components.fileSelector import FileSelector from ui.implements.components.fileSelector import FileSelector
from ui.implements.components.ocrQueue import OcrQueue from ui.implements.components.ocrQueue import OcrQueue
class Ui_TabOcr_B30(object): class Ui_TabOcr_B30(object):
def setupUi(self, TabOcr_B30): def setupUi(self, TabOcr_B30):
if not TabOcr_B30.objectName(): if not TabOcr_B30.objectName():
TabOcr_B30.setObjectName(u"TabOcr_B30") TabOcr_B30.setObjectName(u"TabOcr_B30")
TabOcr_B30.resize(555, 461) TabOcr_B30.resize(555, 461)
TabOcr_B30.setWindowTitle(u"TabOcr_B30") TabOcr_B30.setWindowTitle(u"TabOcr_B30")
self.verticalLayout_3 = QVBoxLayout(TabOcr_B30) self.verticalLayout_3 = QVBoxLayout(TabOcr_B30)
self.verticalLayout_3.setObjectName(u"verticalLayout_3") self.verticalLayout_3.setObjectName(u"verticalLayout_3")
self.groupBox = QGroupBox(TabOcr_B30) self.groupBox = QGroupBox(TabOcr_B30)
self.groupBox.setObjectName(u"groupBox") self.groupBox.setObjectName(u"groupBox")
self.verticalLayout = QVBoxLayout(self.groupBox) self.verticalLayout = QVBoxLayout(self.groupBox)
self.verticalLayout.setObjectName(u"verticalLayout") self.verticalLayout.setObjectName(u"verticalLayout")
self.b30TypeComboBox = QComboBox(self.groupBox) self.b30TypeComboBox = QComboBox(self.groupBox)
self.b30TypeComboBox.setObjectName(u"b30TypeComboBox") self.b30TypeComboBox.setObjectName(u"b30TypeComboBox")
self.verticalLayout.addWidget(self.b30TypeComboBox) self.verticalLayout.addWidget(self.b30TypeComboBox)
self.verticalLayout_3.addWidget(self.groupBox) self.verticalLayout_3.addWidget(self.groupBox)
self.horizontalLayout = QHBoxLayout() self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName(u"horizontalLayout") self.horizontalLayout.setObjectName(u"horizontalLayout")
self.groupBox_3 = QGroupBox(TabOcr_B30) self.groupBox_3 = QGroupBox(TabOcr_B30)
self.groupBox_3.setObjectName(u"groupBox_3") self.groupBox_3.setObjectName(u"groupBox_3")
self.verticalLayout_4 = QVBoxLayout(self.groupBox_3) self.verticalLayout_4 = QVBoxLayout(self.groupBox_3)
self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.verticalLayout_4.setObjectName(u"verticalLayout_4")
self.knnModelSelector = FileSelector(self.groupBox_3) self.knnModelSelector = FileSelector(self.groupBox_3)
self.knnModelSelector.setObjectName(u"knnModelSelector") self.knnModelSelector.setObjectName(u"knnModelSelector")
self.verticalLayout_4.addWidget(self.knnModelSelector) self.verticalLayout_4.addWidget(self.knnModelSelector)
self.horizontalLayout.addWidget(self.groupBox_3) self.horizontalLayout.addWidget(self.groupBox_3)
self.groupBox_5 = QGroupBox(TabOcr_B30) self.groupBox_5 = QGroupBox(TabOcr_B30)
self.groupBox_5.setObjectName(u"groupBox_5") self.groupBox_5.setObjectName(u"groupBox_5")
self.verticalLayout_6 = QVBoxLayout(self.groupBox_5) self.verticalLayout_6 = QVBoxLayout(self.groupBox_5)
self.verticalLayout_6.setObjectName(u"verticalLayout_6") self.verticalLayout_6.setObjectName(u"verticalLayout_6")
self.b30KnnModelSelector = FileSelector(self.groupBox_5) self.b30KnnModelSelector = FileSelector(self.groupBox_5)
self.b30KnnModelSelector.setObjectName(u"b30KnnModelSelector") self.b30KnnModelSelector.setObjectName(u"b30KnnModelSelector")
self.verticalLayout_6.addWidget(self.b30KnnModelSelector) self.verticalLayout_6.addWidget(self.b30KnnModelSelector)
self.horizontalLayout.addWidget(self.groupBox_5) self.horizontalLayout.addWidget(self.groupBox_5)
self.verticalLayout_3.addLayout(self.horizontalLayout) self.verticalLayout_3.addLayout(self.horizontalLayout)
self.horizontalLayout_3 = QHBoxLayout() self.horizontalLayout_3 = QHBoxLayout()
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.groupBox_4 = QGroupBox(TabOcr_B30) self.groupBox_4 = QGroupBox(TabOcr_B30)
self.groupBox_4.setObjectName(u"groupBox_4") self.groupBox_4.setObjectName(u"groupBox_4")
self.verticalLayout_5 = QVBoxLayout(self.groupBox_4) self.verticalLayout_5 = QVBoxLayout(self.groupBox_4)
self.verticalLayout_5.setObjectName(u"verticalLayout_5") self.verticalLayout_5.setObjectName(u"verticalLayout_5")
self.siftDatabaseSelector = FileSelector(self.groupBox_4) self.phashDatabaseSelector = FileSelector(self.groupBox_4)
self.siftDatabaseSelector.setObjectName(u"siftDatabaseSelector") self.phashDatabaseSelector.setObjectName(u"phashDatabaseSelector")
self.verticalLayout_5.addWidget(self.siftDatabaseSelector) self.verticalLayout_5.addWidget(self.phashDatabaseSelector)
self.horizontalLayout_3.addWidget(self.groupBox_4) self.horizontalLayout_3.addWidget(self.groupBox_4)
self.groupBox_2 = QGroupBox(TabOcr_B30) self.groupBox_2 = QGroupBox(TabOcr_B30)
self.groupBox_2.setObjectName(u"groupBox_2") self.groupBox_2.setObjectName(u"groupBox_2")
self.verticalLayout_2 = QVBoxLayout(self.groupBox_2) self.verticalLayout_2 = QVBoxLayout(self.groupBox_2)
self.verticalLayout_2.setObjectName(u"verticalLayout_2") self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.imageSelector = FileSelector(self.groupBox_2) self.imageSelector = FileSelector(self.groupBox_2)
self.imageSelector.setObjectName(u"imageSelector") self.imageSelector.setObjectName(u"imageSelector")
self.verticalLayout_2.addWidget(self.imageSelector) self.verticalLayout_2.addWidget(self.imageSelector)
self.horizontalLayout_3.addWidget(self.groupBox_2) self.horizontalLayout_3.addWidget(self.groupBox_2)
self.verticalLayout_3.addLayout(self.horizontalLayout_3) self.verticalLayout_3.addLayout(self.horizontalLayout_3)
self.ocrQueue = OcrQueue(TabOcr_B30) self.ocrQueue = OcrQueue(TabOcr_B30)
self.ocrQueue.setObjectName(u"ocrQueue") self.ocrQueue.setObjectName(u"ocrQueue")
sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ocrQueue.sizePolicy().hasHeightForWidth()) sizePolicy.setHeightForWidth(self.ocrQueue.sizePolicy().hasHeightForWidth())
self.ocrQueue.setSizePolicy(sizePolicy) self.ocrQueue.setSizePolicy(sizePolicy)
self.verticalLayout_3.addWidget(self.ocrQueue) self.verticalLayout_3.addWidget(self.ocrQueue)
self.retranslateUi(TabOcr_B30) self.retranslateUi(TabOcr_B30)
QMetaObject.connectSlotsByName(TabOcr_B30) QMetaObject.connectSlotsByName(TabOcr_B30)
# setupUi # setupUi
def retranslateUi(self, TabOcr_B30): def retranslateUi(self, TabOcr_B30):
self.groupBox.setTitle(QCoreApplication.translate("TabOcr_B30", u"b30type", None)) self.groupBox.setTitle(QCoreApplication.translate("TabOcr_B30", u"b30type", None))
self.groupBox_3.setTitle(QCoreApplication.translate("TabOcr_B30", u"knnModelSelector.title", None)) self.groupBox_3.setTitle(QCoreApplication.translate("TabOcr_B30", u"knnModelSelector.title", None))
self.groupBox_5.setTitle(QCoreApplication.translate("TabOcr_B30", u"b30KnnModelSelector.title", None)) self.groupBox_5.setTitle(QCoreApplication.translate("TabOcr_B30", u"b30KnnModelSelector.title", None))
self.groupBox_4.setTitle(QCoreApplication.translate("TabOcr_B30", u"siftDatabaseSelector.title", None)) self.groupBox_4.setTitle(QCoreApplication.translate("TabOcr_B30", u"phashDatabaseSelector.title", None))
self.groupBox_2.setTitle(QCoreApplication.translate("TabOcr_B30", u"imageSelector.title", None)) self.groupBox_2.setTitle(QCoreApplication.translate("TabOcr_B30", u"imageSelector.title", None))
pass pass
# retranslateUi # retranslateUi

View File

@ -28,11 +28,22 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QCheckBox" name="deviceUseAutoFactorCheckBox"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="text"> <item>
<string>deviceSelector.useAutoFactor</string> <widget class="QCheckBox" name="deviceUseAutoFactorCheckBox">
</property> <property name="text">
</widget> <string>deviceSelector.useAutoFactor</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="deviceSizesV2CheckBox">
<property name="text">
<string notr="true">SizesV2</string>
</property>
</widget>
</item>
</layout>
</item> </item>
<item> <item>
<widget class="FileSelector" name="deviceFileSelector" native="true"/> <widget class="FileSelector" name="deviceFileSelector" native="true"/>
@ -126,11 +137,11 @@
<item> <item>
<widget class="QGroupBox" name="groupBox_5"> <widget class="QGroupBox" name="groupBox_5">
<property name="title"> <property name="title">
<string>siftDatabaseSelector.title</string> <string>phashDatabaseSelector.title</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_7"> <layout class="QVBoxLayout" name="verticalLayout_7">
<item> <item>
<widget class="FileSelector" name="siftDatabaseSelector" native="true"/> <widget class="FileSelector" name="phashDatabaseSelector" native="true"/>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -161,17 +172,17 @@
<header>ui.implements.components.fileSelector</header> <header>ui.implements.components.fileSelector</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>DevicesComboBox</class>
<extends>QComboBox</extends>
<header>ui.implements.components.devicesComboBox</header>
</customwidget>
<customwidget> <customwidget>
<class>OcrQueue</class> <class>OcrQueue</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>ui.implements.components.ocrQueue</header> <header>ui.implements.components.ocrQueue</header>
<container>1</container> <container>1</container>
</customwidget> </customwidget>
<customwidget>
<class>DevicesComboBox</class>
<extends>QComboBox</extends>
<header>ui.implements.components.devicesComboBox</header>
</customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>
<connections/> <connections/>

View File

@ -1,155 +1,166 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
################################################################################ ################################################################################
## Form generated from reading UI file 'tabOcr_Device.ui' ## Form generated from reading UI file 'tabOcr_Device.ui'
## ##
## Created by: Qt User Interface Compiler version 6.5.2 ## Created by: Qt User Interface Compiler version 6.5.2
## ##
## WARNING! All changes made in this file will be lost when recompiling UI file! ## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################ ################################################################################
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
QMetaObject, QObject, QPoint, QRect, QMetaObject, QObject, QPoint, QRect,
QSize, QTime, QUrl, Qt) QSize, QTime, QUrl, Qt)
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
QFont, QFontDatabase, QGradient, QIcon, QFont, QFontDatabase, QGradient, QIcon,
QImage, QKeySequence, QLinearGradient, QPainter, QImage, QKeySequence, QLinearGradient, QPainter,
QPalette, QPixmap, QRadialGradient, QTransform) QPalette, QPixmap, QRadialGradient, QTransform)
from PySide6.QtWidgets import (QApplication, QCheckBox, QGroupBox, QHBoxLayout, from PySide6.QtWidgets import (QApplication, QCheckBox, QGroupBox, QHBoxLayout,
QPushButton, QSizePolicy, QStackedWidget, QVBoxLayout, QPushButton, QSizePolicy, QStackedWidget, QVBoxLayout,
QWidget) QWidget)
from ui.implements.components.devicesComboBox import DevicesComboBox from ui.implements.components.devicesComboBox import DevicesComboBox
from ui.implements.components.fileSelector import FileSelector from ui.implements.components.fileSelector import FileSelector
from ui.implements.components.ocrQueue import OcrQueue from ui.implements.components.ocrQueue import OcrQueue
class Ui_TabOcr_Device(object): class Ui_TabOcr_Device(object):
def setupUi(self, TabOcr_Device): def setupUi(self, TabOcr_Device):
if not TabOcr_Device.objectName(): if not TabOcr_Device.objectName():
TabOcr_Device.setObjectName(u"TabOcr_Device") TabOcr_Device.setObjectName(u"TabOcr_Device")
TabOcr_Device.resize(632, 527) TabOcr_Device.resize(632, 527)
TabOcr_Device.setWindowTitle(u"TabOcr_Device") TabOcr_Device.setWindowTitle(u"TabOcr_Device")
self.verticalLayout_3 = QVBoxLayout(TabOcr_Device) self.verticalLayout_3 = QVBoxLayout(TabOcr_Device)
self.verticalLayout_3.setObjectName(u"verticalLayout_3") self.verticalLayout_3.setObjectName(u"verticalLayout_3")
self.openWizardButton = QPushButton(TabOcr_Device) self.openWizardButton = QPushButton(TabOcr_Device)
self.openWizardButton.setObjectName(u"openWizardButton") self.openWizardButton.setObjectName(u"openWizardButton")
self.verticalLayout_3.addWidget(self.openWizardButton) self.verticalLayout_3.addWidget(self.openWizardButton)
self.groupBox = QGroupBox(TabOcr_Device) self.groupBox = QGroupBox(TabOcr_Device)
self.groupBox.setObjectName(u"groupBox") self.groupBox.setObjectName(u"groupBox")
self.verticalLayout = QVBoxLayout(self.groupBox) self.verticalLayout = QVBoxLayout(self.groupBox)
self.verticalLayout.setObjectName(u"verticalLayout") self.verticalLayout.setObjectName(u"verticalLayout")
self.deviceUseAutoFactorCheckBox = QCheckBox(self.groupBox) self.horizontalLayout = QHBoxLayout()
self.deviceUseAutoFactorCheckBox.setObjectName(u"deviceUseAutoFactorCheckBox") self.horizontalLayout.setObjectName(u"horizontalLayout")
self.deviceUseAutoFactorCheckBox = QCheckBox(self.groupBox)
self.verticalLayout.addWidget(self.deviceUseAutoFactorCheckBox) self.deviceUseAutoFactorCheckBox.setObjectName(u"deviceUseAutoFactorCheckBox")
self.deviceFileSelector = FileSelector(self.groupBox) self.horizontalLayout.addWidget(self.deviceUseAutoFactorCheckBox)
self.deviceFileSelector.setObjectName(u"deviceFileSelector")
self.deviceSizesV2CheckBox = QCheckBox(self.groupBox)
self.verticalLayout.addWidget(self.deviceFileSelector) self.deviceSizesV2CheckBox.setObjectName(u"deviceSizesV2CheckBox")
self.deviceSizesV2CheckBox.setText(u"SizesV2")
self.deviceComboBox = DevicesComboBox(self.groupBox)
self.deviceComboBox.setObjectName(u"deviceComboBox") self.horizontalLayout.addWidget(self.deviceSizesV2CheckBox)
self.verticalLayout.addWidget(self.deviceComboBox)
self.verticalLayout.addLayout(self.horizontalLayout)
self.verticalLayout_3.addWidget(self.groupBox) self.deviceFileSelector = FileSelector(self.groupBox)
self.deviceFileSelector.setObjectName(u"deviceFileSelector")
self.horizontalWidget = QWidget(TabOcr_Device)
self.horizontalWidget.setObjectName(u"horizontalWidget") self.verticalLayout.addWidget(self.deviceFileSelector)
sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0) self.deviceComboBox = DevicesComboBox(self.groupBox)
sizePolicy.setVerticalStretch(0) self.deviceComboBox.setObjectName(u"deviceComboBox")
sizePolicy.setHeightForWidth(self.horizontalWidget.sizePolicy().hasHeightForWidth())
self.horizontalWidget.setSizePolicy(sizePolicy) self.verticalLayout.addWidget(self.deviceComboBox)
self.horizontalLayout_2 = QHBoxLayout(self.horizontalWidget)
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_3.addWidget(self.groupBox)
self.groupBox_6 = QGroupBox(self.horizontalWidget)
self.groupBox_6.setObjectName(u"groupBox_6") self.horizontalWidget = QWidget(TabOcr_Device)
self.verticalLayout_6 = QVBoxLayout(self.groupBox_6) self.horizontalWidget.setObjectName(u"horizontalWidget")
self.verticalLayout_6.setObjectName(u"verticalLayout_6") sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
self.knnModelSelector = FileSelector(self.groupBox_6) sizePolicy.setHorizontalStretch(0)
self.knnModelSelector.setObjectName(u"knnModelSelector") sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.horizontalWidget.sizePolicy().hasHeightForWidth())
self.verticalLayout_6.addWidget(self.knnModelSelector) self.horizontalWidget.setSizePolicy(sizePolicy)
self.horizontalLayout_2 = QHBoxLayout(self.horizontalWidget)
self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
self.horizontalLayout_2.addWidget(self.groupBox_6) self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.groupBox_6 = QGroupBox(self.horizontalWidget)
self.deviceDependenciesStackedWidget = QStackedWidget(self.horizontalWidget) self.groupBox_6.setObjectName(u"groupBox_6")
self.deviceDependenciesStackedWidget.setObjectName(u"deviceDependenciesStackedWidget") self.verticalLayout_6 = QVBoxLayout(self.groupBox_6)
self.deviceV1 = QWidget() self.verticalLayout_6.setObjectName(u"verticalLayout_6")
self.deviceV1.setObjectName(u"deviceV1") self.knnModelSelector = FileSelector(self.groupBox_6)
self.verticalLayout_2 = QVBoxLayout(self.deviceV1) self.knnModelSelector.setObjectName(u"knnModelSelector")
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_6.addWidget(self.knnModelSelector)
self.groupBox_4 = QGroupBox(self.deviceV1)
self.groupBox_4.setObjectName(u"groupBox_4")
self.verticalLayout_5 = QVBoxLayout(self.groupBox_4) self.horizontalLayout_2.addWidget(self.groupBox_6)
self.verticalLayout_5.setObjectName(u"verticalLayout_5")
self.tesseractFileSelector = FileSelector(self.groupBox_4) self.deviceDependenciesStackedWidget = QStackedWidget(self.horizontalWidget)
self.tesseractFileSelector.setObjectName(u"tesseractFileSelector") self.deviceDependenciesStackedWidget.setObjectName(u"deviceDependenciesStackedWidget")
self.deviceV1 = QWidget()
self.verticalLayout_5.addWidget(self.tesseractFileSelector) self.deviceV1.setObjectName(u"deviceV1")
self.verticalLayout_2 = QVBoxLayout(self.deviceV1)
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.verticalLayout_2.addWidget(self.groupBox_4) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.groupBox_4 = QGroupBox(self.deviceV1)
self.deviceDependenciesStackedWidget.addWidget(self.deviceV1) self.groupBox_4.setObjectName(u"groupBox_4")
self.deviceV2 = QWidget() self.verticalLayout_5 = QVBoxLayout(self.groupBox_4)
self.deviceV2.setObjectName(u"deviceV2") self.verticalLayout_5.setObjectName(u"verticalLayout_5")
self.verticalLayout_4 = QVBoxLayout(self.deviceV2) self.tesseractFileSelector = FileSelector(self.groupBox_4)
self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.tesseractFileSelector.setObjectName(u"tesseractFileSelector")
self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
self.groupBox_5 = QGroupBox(self.deviceV2) self.verticalLayout_5.addWidget(self.tesseractFileSelector)
self.groupBox_5.setObjectName(u"groupBox_5")
self.verticalLayout_7 = QVBoxLayout(self.groupBox_5)
self.verticalLayout_7.setObjectName(u"verticalLayout_7") self.verticalLayout_2.addWidget(self.groupBox_4)
self.siftDatabaseSelector = FileSelector(self.groupBox_5)
self.siftDatabaseSelector.setObjectName(u"siftDatabaseSelector") self.deviceDependenciesStackedWidget.addWidget(self.deviceV1)
self.deviceV2 = QWidget()
self.verticalLayout_7.addWidget(self.siftDatabaseSelector) self.deviceV2.setObjectName(u"deviceV2")
self.verticalLayout_4 = QVBoxLayout(self.deviceV2)
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
self.verticalLayout_4.addWidget(self.groupBox_5) self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
self.groupBox_5 = QGroupBox(self.deviceV2)
self.deviceDependenciesStackedWidget.addWidget(self.deviceV2) self.groupBox_5.setObjectName(u"groupBox_5")
self.verticalLayout_7 = QVBoxLayout(self.groupBox_5)
self.horizontalLayout_2.addWidget(self.deviceDependenciesStackedWidget) self.verticalLayout_7.setObjectName(u"verticalLayout_7")
self.phashDatabaseSelector = FileSelector(self.groupBox_5)
self.phashDatabaseSelector.setObjectName(u"phashDatabaseSelector")
self.verticalLayout_3.addWidget(self.horizontalWidget)
self.verticalLayout_7.addWidget(self.phashDatabaseSelector)
self.ocrQueue = OcrQueue(TabOcr_Device)
self.ocrQueue.setObjectName(u"ocrQueue")
sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) self.verticalLayout_4.addWidget(self.groupBox_5)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0) self.deviceDependenciesStackedWidget.addWidget(self.deviceV2)
sizePolicy1.setHeightForWidth(self.ocrQueue.sizePolicy().hasHeightForWidth())
self.ocrQueue.setSizePolicy(sizePolicy1) self.horizontalLayout_2.addWidget(self.deviceDependenciesStackedWidget)
self.verticalLayout_3.addWidget(self.ocrQueue)
self.verticalLayout_3.addWidget(self.horizontalWidget)
self.retranslateUi(TabOcr_Device) self.ocrQueue = OcrQueue(TabOcr_Device)
self.ocrQueue.setObjectName(u"ocrQueue")
self.deviceDependenciesStackedWidget.setCurrentIndex(0) sizePolicy1 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
QMetaObject.connectSlotsByName(TabOcr_Device) sizePolicy1.setHeightForWidth(self.ocrQueue.sizePolicy().hasHeightForWidth())
# setupUi self.ocrQueue.setSizePolicy(sizePolicy1)
def retranslateUi(self, TabOcr_Device): self.verticalLayout_3.addWidget(self.ocrQueue)
self.openWizardButton.setText(QCoreApplication.translate("TabOcr_Device", u"openWizardButton", None))
self.groupBox.setTitle(QCoreApplication.translate("TabOcr_Device", u"deviceSelector.title", None))
self.deviceUseAutoFactorCheckBox.setText(QCoreApplication.translate("TabOcr_Device", u"deviceSelector.useAutoFactor", None)) self.retranslateUi(TabOcr_Device)
self.groupBox_6.setTitle(QCoreApplication.translate("TabOcr_Device", u"knnModelSelector.title", None))
self.groupBox_4.setTitle(QCoreApplication.translate("TabOcr_Device", u"tesseractSelector.title", None)) self.deviceDependenciesStackedWidget.setCurrentIndex(0)
self.groupBox_5.setTitle(QCoreApplication.translate("TabOcr_Device", u"siftDatabaseSelector.title", None))
pass
# retranslateUi QMetaObject.connectSlotsByName(TabOcr_Device)
# setupUi
def retranslateUi(self, TabOcr_Device):
self.openWizardButton.setText(QCoreApplication.translate("TabOcr_Device", u"openWizardButton", None))
self.groupBox.setTitle(QCoreApplication.translate("TabOcr_Device", u"deviceSelector.title", None))
self.deviceUseAutoFactorCheckBox.setText(QCoreApplication.translate("TabOcr_Device", u"deviceSelector.useAutoFactor", None))
self.groupBox_6.setTitle(QCoreApplication.translate("TabOcr_Device", u"knnModelSelector.title", None))
self.groupBox_4.setTitle(QCoreApplication.translate("TabOcr_Device", u"tesseractSelector.title", None))
self.groupBox_5.setTitle(QCoreApplication.translate("TabOcr_Device", u"phashDatabaseSelector.title", None))
pass
# retranslateUi

View File

@ -5,8 +5,8 @@ from typing import Tuple
from arcaea_offline.database import Database from arcaea_offline.database import Database
from arcaea_offline.models import Chart, Score from arcaea_offline.models import Chart, Score
from arcaea_offline_ocr.device.shared import DeviceOcrResult from arcaea_offline_ocr.device.shared import DeviceOcrResult
from arcaea_offline_ocr.device.v2.ocr import DeviceV2Ocr from arcaea_offline_ocr.device.v2 import DeviceV2AutoRois, DeviceV2Ocr, DeviceV2Rois
from arcaea_offline_ocr.device.v2.rois import DeviceV2AutoRois, DeviceV2Rois from arcaea_offline_ocr.device.v2.sizes import SizesV1, SizesV2
from arcaea_offline_ocr.utils import imread_unicode from arcaea_offline_ocr.utils import imread_unicode
from PySide6.QtCore import QDateTime, QFileInfo from PySide6.QtCore import QDateTime, QFileInfo
@ -18,17 +18,23 @@ import exif
class TabDeviceV2OcrRunnable(OcrRunnable): class TabDeviceV2OcrRunnable(OcrRunnable):
def __init__(self, imagePath, device, knnModel, siftDb): def __init__(self, imagePath, device, knnModel, phashDb, *, sizesV2: bool):
super().__init__() super().__init__()
self.imagePath = imagePath self.imagePath = imagePath
self.device = device self.device = device
self.knnModel = knnModel self.knnModel = knnModel
self.siftDb = siftDb self.phashDb = phashDb
self.sizesV2 = sizesV2
def run(self): def run(self):
try: try:
rois = DeviceV2Rois(self.device, imread_unicode(self.imagePath)) rois = DeviceV2Rois(self.device, imread_unicode(self.imagePath))
ocr = DeviceV2Ocr(self.knnModel, self.siftDb) rois.sizes = (
SizesV2(self.device.factor)
if self.sizesV2
else SizesV1(self.device.factor)
)
ocr = DeviceV2Ocr(self.knnModel, self.phashDb)
result = ocr.ocr(rois) result = ocr.ocr(rois)
self.signals.resultReady.emit(result) self.signals.resultReady.emit(result)
except Exception: except Exception:
@ -38,16 +44,19 @@ class TabDeviceV2OcrRunnable(OcrRunnable):
class TabDeviceV2AutoRoisOcrRunnable(OcrRunnable): class TabDeviceV2AutoRoisOcrRunnable(OcrRunnable):
def __init__(self, imagePath, knnModel, siftDb): def __init__(self, imagePath, knnModel, phashDb, *, sizesV2: bool):
super().__init__() super().__init__()
self.imagePath = imagePath self.imagePath = imagePath
self.knnModel = knnModel self.knnModel = knnModel
self.siftDb = siftDb self.phashDb = phashDb
self.sizesV2 = sizesV2
def run(self): def run(self):
try: try:
rois = DeviceV2AutoRois(imread_unicode(self.imagePath)) rois = DeviceV2AutoRois(imread_unicode(self.imagePath))
ocr = DeviceV2Ocr(self.knnModel, self.siftDb) factor = rois.sizes.factor
rois.sizes = SizesV2(factor) if self.sizesV2 else SizesV1(factor)
ocr = DeviceV2Ocr(self.knnModel, self.phashDb)
result = ocr.ocr(rois) result = ocr.ocr(rois)
self.signals.resultReady.emit(result) self.signals.resultReady.emit(result)
except Exception: except Exception:

View File

@ -2,6 +2,7 @@ import logging
import cv2 import cv2
from arcaea_offline_ocr.b30.chieri.v4.ocr import ChieriBotV4Ocr from arcaea_offline_ocr.b30.chieri.v4.ocr import ChieriBotV4Ocr
from arcaea_offline_ocr.phash_db import ImagePHashDatabase
from arcaea_offline_ocr.sift_db import SIFTDatabase from arcaea_offline_ocr.sift_db import SIFTDatabase
from arcaea_offline_ocr.utils import imread_unicode from arcaea_offline_ocr.utils import imread_unicode
from PySide6.QtCore import Signal, Slot from PySide6.QtCore import Signal, Slot
@ -34,10 +35,11 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
self.imageSelector.filesSelected.connect(self.imageSelected) self.imageSelector.filesSelected.connect(self.imageSelected)
self.knnModelSelector.filesSelected.connect(self.knnModelSelected) self.knnModelSelector.filesSelected.connect(self.knnModelSelected)
self.b30KnnModelSelector.filesSelected.connect(self.b30KnnModelSelected) self.b30KnnModelSelector.filesSelected.connect(self.b30KnnModelSelected)
self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseSelected) # self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseSelected)
self.phashDatabaseSelector.filesSelected.connect(self.phashDatabaseSelected)
self.knnModelSelector.connectSettings(KNN_MODEL_FILE) self.knnModelSelector.connectSettings(KNN_MODEL_FILE)
self.siftDatabaseSelector.connectSettings(SIFT_DATABASE_FILE) # self.siftDatabaseSelector.connectSettings(SIFT_DATABASE_FILE)
self.imagePath = None # for checking only self.imagePath = None # for checking only
self.img = None self.img = None
@ -45,7 +47,8 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
self.paddle = None self.paddle = None
self.knnModel = None self.knnModel = None
self.b30KnnModel = None self.b30KnnModel = None
self.siftDatabase = None # self.siftDatabase = None
self.phashDatabase = None
self.ocr = None self.ocr = None
@ -54,7 +57,7 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
settings = Settings() settings = Settings()
logger.info("Applying default settings...") logger.info("Applying default settings...")
self.knnModelSelector.selectFile(settings.knnModelFile()) self.knnModelSelector.selectFile(settings.knnModelFile())
self.siftDatabaseSelector.selectFile(settings.siftDatabaseFile()) # self.siftDatabaseSelector.selectFile(settings.siftDatabaseFile())
self.ocrQueueModel = OcrQueueModel(self) self.ocrQueueModel = OcrQueueModel(self)
self.ocrQueue.setModel(self.ocrQueueModel) self.ocrQueue.setModel(self.ocrQueueModel)
@ -84,6 +87,12 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
self.siftDatabase = SIFTDatabase(siftDatabasePath) self.siftDatabase = SIFTDatabase(siftDatabasePath)
self.tryPrepareOcr.emit() self.tryPrepareOcr.emit()
def phashDatabaseSelected(self):
if selectedFiles := self.phashDatabaseSelector.selectedFiles():
phashDatabasePath = selectedFiles[0]
self.phashDatabase = ImagePHashDatabase(phashDatabasePath)
self.tryPrepareOcr.emit()
def prepareOcr(self): def prepareOcr(self):
b30Type = self.b30TypeComboBox.currentData() b30Type = self.b30TypeComboBox.currentData()
if not b30Type: if not b30Type:
@ -94,13 +103,13 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
not self.imagePath not self.imagePath
or not self.knnModel or not self.knnModel
or not self.b30KnnModel or not self.b30KnnModel
or not self.siftDatabase or not self.phashDatabase
): ):
return return
self.ocrQueueModel.clear() self.ocrQueueModel.clear()
ocr = ChieriBotV4Ocr(self.knnModel, self.b30KnnModel, self.siftDatabase) ocr = ChieriBotV4Ocr(self.knnModel, self.b30KnnModel, self.phashDatabase)
ocr.set_factor(self.img) ocr.set_factor(self.img)
self.ocr = ocr self.ocr = ocr
@ -116,7 +125,7 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
not self.imagePath not self.imagePath
or not self.knnModel or not self.knnModel
or not self.b30KnnModel or not self.b30KnnModel
or not self.siftDatabase or not self.phashDatabase
): ):
return return

View File

@ -6,6 +6,7 @@ import cv2
from arcaea_offline_ocr.device.v1.definition import DeviceV1 from arcaea_offline_ocr.device.v1.definition import DeviceV1
from arcaea_offline_ocr.device.v2.definition import DeviceV2 from arcaea_offline_ocr.device.v2.definition import DeviceV2
from arcaea_offline_ocr.sift_db import SIFTDatabase from arcaea_offline_ocr.sift_db import SIFTDatabase
from arcaea_offline_ocr.phash_db import ImagePHashDatabase
from PySide6.QtCore import Qt, Slot from PySide6.QtCore import Qt, Slot
from PySide6.QtWidgets import QApplication, QFileDialog, QWidget from PySide6.QtWidgets import QApplication, QFileDialog, QWidget
@ -38,11 +39,12 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget):
self.deviceFileSelector.filesSelected.connect(self.deviceFileSelected) self.deviceFileSelector.filesSelected.connect(self.deviceFileSelected)
self.knnModelSelector.filesSelected.connect(self.knnModelFileSelected) self.knnModelSelector.filesSelected.connect(self.knnModelFileSelected)
self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseFileSelected) # self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseFileSelected)
self.phashDatabaseSelector.filesSelected.connect(self.phashDatabaseFileSelected)
self.deviceFileSelector.connectSettings(DEVICES_JSON_FILE) self.deviceFileSelector.connectSettings(DEVICES_JSON_FILE)
self.knnModelSelector.connectSettings(KNN_MODEL_FILE) self.knnModelSelector.connectSettings(KNN_MODEL_FILE)
self.siftDatabaseSelector.connectSettings(SIFT_DATABASE_FILE) # self.siftDatabaseSelector.connectSettings(SIFT_DATABASE_FILE)
settings = Settings() settings = Settings()
logger.info("Applying default settings...") logger.info("Applying default settings...")
@ -50,7 +52,7 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget):
self.tesseractFileSelector.selectFile(settings.tesseractPath()) self.tesseractFileSelector.selectFile(settings.tesseractPath())
self.deviceComboBox.selectDevice(settings.deviceUuid()) self.deviceComboBox.selectDevice(settings.deviceUuid())
self.knnModelSelector.selectFile(settings.knnModelFile()) self.knnModelSelector.selectFile(settings.knnModelFile())
self.siftDatabaseSelector.selectFile(settings.siftDatabaseFile()) # vself.siftDatabaseSelector.selectFile(settings.siftDatabaseFile())
self.ocrQueueModel = OcrQueueModel(self) self.ocrQueueModel = OcrQueueModel(self)
self.ocrQueue.setModel(self.ocrQueueModel) self.ocrQueue.setModel(self.ocrQueueModel)
@ -96,6 +98,10 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget):
if selectedFiles := self.siftDatabaseSelector.selectedFiles(): if selectedFiles := self.siftDatabaseSelector.selectedFiles():
self.siftDatabase = SIFTDatabase(selectedFiles[0]) self.siftDatabase = SIFTDatabase(selectedFiles[0])
def phashDatabaseFileSelected(self):
if selectedFiles := self.phashDatabaseSelector.selectedFiles():
self.phashDatabase = ImagePHashDatabase(selectedFiles[0])
@Slot() @Slot()
def on_ocr_addImageButton_clicked(self): def on_ocr_addImageButton_clicked(self):
files, _filter = QFileDialog.getOpenFileNames( files, _filter = QFileDialog.getOpenFileNames(
@ -115,14 +121,16 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget):
runnable = TabDeviceV2AutoRoisOcrRunnable( runnable = TabDeviceV2AutoRoisOcrRunnable(
imagePath, imagePath,
self.knnModel, self.knnModel,
self.siftDatabase, self.phashDatabase,
sizesV2=self.deviceSizesV2CheckBox.isChecked(),
) )
else: else:
runnable = TabDeviceV2OcrRunnable( runnable = TabDeviceV2OcrRunnable(
imagePath, imagePath,
self.deviceComboBox.currentData(), self.deviceComboBox.currentData(),
self.knnModel, self.knnModel,
self.siftDatabase, self.phashDatabase,
sizesV2=self.deviceSizesV2CheckBox.isChecked(),
) )
self.ocrQueueModel.setData(index, runnable, OcrQueueModel.OcrRunnableRole) self.ocrQueueModel.setData(index, runnable, OcrQueueModel.OcrRunnableRole)
self.ocrQueueModel.setData( self.ocrQueueModel.setData(