mirror of
https://github.com/283375/arcaea-offline-pyside-ui.git
synced 2025-04-11 13:40:17 +00:00
feat: ImagePHashDatabase
This commit is contained in:
parent
9c06c6d9f1
commit
34e56395ab
@ -25,7 +25,9 @@ DEVICES_JSON_FILE = "Ocr/DevicesJsonFile"
|
||||
DEVICE_UUID = "Ocr/DeviceUuid"
|
||||
TESSERACT_FILE = "Ocr/TesseractFile"
|
||||
KNN_MODEL_FILE = "Ocr/KnnModelFile"
|
||||
B30_KNN_MODEL_FILE = "Ocr/B30KnnModelFile"
|
||||
SIFT_DATABASE_FILE = "Ocr/SiftDatabaseFile"
|
||||
PHASH_DATABASE_FILE = "Ocr/PHashDatabaseFile"
|
||||
|
||||
ANDREAL_FOLDER = "Andreal/AndrealFolder"
|
||||
ANDREAL_EXECUTABLE = "Andreal/AndrealExecutable"
|
||||
@ -104,6 +106,15 @@ class Settings(QSettings, metaclass=QObjectSingleton):
|
||||
def resetKnnModelFile(self):
|
||||
self._resetStrItem(KNN_MODEL_FILE)
|
||||
|
||||
def b30KnnModelFile(self):
|
||||
return self._strItem(B30_KNN_MODEL_FILE)
|
||||
|
||||
def setB30KnnModelFile(self, value: str):
|
||||
self._setStrItem(B30_KNN_MODEL_FILE, value)
|
||||
|
||||
def resetB30KnnModelFile(self):
|
||||
self._resetStrItem(B30_KNN_MODEL_FILE)
|
||||
|
||||
def siftDatabaseFile(self):
|
||||
return self._strItem(SIFT_DATABASE_FILE)
|
||||
|
||||
@ -113,6 +124,15 @@ class Settings(QSettings, metaclass=QObjectSingleton):
|
||||
def resetSiftDatabaseFile(self):
|
||||
self._resetStrItem(SIFT_DATABASE_FILE)
|
||||
|
||||
def phashDatabaseFile(self):
|
||||
return self._strItem(PHASH_DATABASE_FILE)
|
||||
|
||||
def setPHashDatabaseFile(self, value: str):
|
||||
self._setStrItem(PHASH_DATABASE_FILE, value)
|
||||
|
||||
def resetPHashDatabaseFile(self):
|
||||
self._resetStrItem(PHASH_DATABASE_FILE)
|
||||
|
||||
def andrealFolder(self):
|
||||
return self._strItem(ANDREAL_FOLDER)
|
||||
|
||||
|
@ -45,6 +45,17 @@ class SettingsOcr(SettingsBaseWidget):
|
||||
self.knnModelFileResetButton,
|
||||
)
|
||||
|
||||
if self.settings.b30KnnModelFile():
|
||||
self.b30KnnModelFileValueWidget.selectFile(self.settings.b30KnnModelFile())
|
||||
self.b30KnnModelFileValueWidget.filesSelected.connect(self.setB30KnnModelFile)
|
||||
self.b30KnnModelFileResetButton.clicked.connect(self.resetB30KnnModelFile)
|
||||
self.insertItem(
|
||||
"b30KnnModelFile",
|
||||
self.b30KnnModelFileLabel,
|
||||
self.b30KnnModelFileValueWidget,
|
||||
self.b30KnnModelFileResetButton,
|
||||
)
|
||||
|
||||
if self.settings.siftDatabaseFile():
|
||||
self.siftDatabaseFileValueWidget.selectFile(
|
||||
self.settings.siftDatabaseFile()
|
||||
@ -58,6 +69,21 @@ class SettingsOcr(SettingsBaseWidget):
|
||||
self.siftDatabaseFileResetButton,
|
||||
)
|
||||
|
||||
if self.settings.phashDatabaseFile():
|
||||
self.phashDatabaseFileValueWidget.selectFile(
|
||||
self.settings.phashDatabaseFile()
|
||||
)
|
||||
self.phashDatabaseFileValueWidget.filesSelected.connect(
|
||||
self.setPHashDatabaseFile
|
||||
)
|
||||
self.phashDatabaseFileResetButton.clicked.connect(self.resetPHashDatabaseFile)
|
||||
self.insertItem(
|
||||
"phashDatabaseFile",
|
||||
self.phashDatabaseFileLabel,
|
||||
self.phashDatabaseFileValueWidget,
|
||||
self.phashDatabaseFileResetButton,
|
||||
)
|
||||
|
||||
def setDevicesJson(self):
|
||||
selectedFile = self.devicesJsonValueWidget.selectedFiles()
|
||||
if selectedFile and selectedFile[0]:
|
||||
@ -79,8 +105,7 @@ class SettingsOcr(SettingsBaseWidget):
|
||||
self.settings.resetDevicesJsonFile()
|
||||
|
||||
def setDeviceUuid(self):
|
||||
device = self.deviceUuidValueWidget.currentData()
|
||||
if device:
|
||||
if device := self.deviceUuidValueWidget.currentData():
|
||||
self.settings.setDeviceUuid(device.uuid)
|
||||
|
||||
def resetDeviceUuid(self):
|
||||
@ -97,6 +122,16 @@ class SettingsOcr(SettingsBaseWidget):
|
||||
self.knnModelFileValueWidget.reset()
|
||||
self.settings.resetKnnModelFile()
|
||||
|
||||
def setB30KnnModelFile(self):
|
||||
selectedFile = self.b30KnnModelFileValueWidget.selectedFiles()
|
||||
if selectedFile and selectedFile[0]:
|
||||
file = selectedFile[0]
|
||||
self.settings.setB30KnnModelFile(file)
|
||||
|
||||
def resetB30KnnModelFile(self):
|
||||
self.b30KnnModelFileValueWidget.reset()
|
||||
self.settings.resetB30KnnModelFile()
|
||||
|
||||
def setSiftDatabaseFile(self):
|
||||
selectedFile = self.siftDatabaseFileValueWidget.selectedFiles()
|
||||
if selectedFile and selectedFile[0]:
|
||||
@ -107,6 +142,16 @@ class SettingsOcr(SettingsBaseWidget):
|
||||
self.siftDatabaseFileValueWidget.reset()
|
||||
self.settings.resetSiftDatabaseFile()
|
||||
|
||||
def setPHashDatabaseFile(self):
|
||||
selectedFile = self.phashDatabaseFileValueWidget.selectedFiles()
|
||||
if selectedFile and selectedFile[0]:
|
||||
file = selectedFile[0]
|
||||
self.settings.setPHashDatabaseFile(file)
|
||||
|
||||
def resetPHashDatabaseFile(self):
|
||||
self.phashDatabaseFileValueWidget.reset()
|
||||
self.settings.resetPHashDatabaseFile()
|
||||
|
||||
def setupUi(self, *args):
|
||||
self.devicesJsonLabel = QLabel(self)
|
||||
self.devicesJsonValueWidget = FileSelector(self)
|
||||
@ -120,10 +165,18 @@ class SettingsOcr(SettingsBaseWidget):
|
||||
self.knnModelFileValueWidget = FileSelector(self)
|
||||
self.knnModelFileResetButton = QPushButton(self)
|
||||
|
||||
self.b30KnnModelFileLabel = QLabel(self)
|
||||
self.b30KnnModelFileValueWidget = FileSelector(self)
|
||||
self.b30KnnModelFileResetButton = QPushButton(self)
|
||||
|
||||
self.siftDatabaseFileLabel = QLabel(self)
|
||||
self.siftDatabaseFileValueWidget = FileSelector(self)
|
||||
self.siftDatabaseFileResetButton = QPushButton(self)
|
||||
|
||||
self.phashDatabaseFileLabel = QLabel(self)
|
||||
self.phashDatabaseFileValueWidget = FileSelector(self)
|
||||
self.phashDatabaseFileResetButton = QPushButton(self)
|
||||
|
||||
super().setupUi(self)
|
||||
self.retranslateUi()
|
||||
|
||||
@ -142,6 +195,12 @@ class SettingsOcr(SettingsBaseWidget):
|
||||
self.knnModelFileLabel.setText(QCoreApplication.translate("Settings", "ocr.knnModelFile.label"))
|
||||
self.knnModelFileResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
|
||||
|
||||
self.b30KnnModelFileLabel.setText(QCoreApplication.translate("Settings", "ocr.b30KnnModelFile.label"))
|
||||
self.b30KnnModelFileResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
|
||||
|
||||
self.siftDatabaseFileLabel.setText(QCoreApplication.translate("Settings", "ocr.siftDatabaseFile.label"))
|
||||
self.siftDatabaseFileResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
|
||||
|
||||
self.phashDatabaseFileLabel.setText(QCoreApplication.translate("Settings", "ocr.phashDatabaseFile.label"))
|
||||
self.phashDatabaseFileResetButton.setText(QCoreApplication.translate("Settings", "resetButton"))
|
||||
# fmt: on
|
||||
|
@ -12,7 +12,11 @@ from ui.designer.tabs.tabOcr.tabOcr_B30_ui import Ui_TabOcr_B30
|
||||
from ui.extends.components.ocrQueue import OcrQueueModel
|
||||
from ui.extends.shared.cv2_utils import cv2BgrMatToQImage, qImageToCvMatBgr
|
||||
from ui.extends.shared.language import LanguageChangeEventFilter
|
||||
from ui.extends.shared.settings import KNN_MODEL_FILE, SIFT_DATABASE_FILE, Settings
|
||||
from ui.extends.shared.settings import (
|
||||
B30_KNN_MODEL_FILE,
|
||||
KNN_MODEL_FILE,
|
||||
PHASH_DATABASE_FILE,
|
||||
)
|
||||
from ui.extends.tabs.tabOcr.tabOcr_B30 import ChieriV4OcrRunnable, b30ResultToScore
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -35,12 +39,8 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
|
||||
self.imageSelector.filesSelected.connect(self.imageSelected)
|
||||
self.knnModelSelector.filesSelected.connect(self.knnModelSelected)
|
||||
self.b30KnnModelSelector.filesSelected.connect(self.b30KnnModelSelected)
|
||||
# self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseSelected)
|
||||
self.phashDatabaseSelector.filesSelected.connect(self.phashDatabaseSelected)
|
||||
|
||||
self.knnModelSelector.connectSettings(KNN_MODEL_FILE)
|
||||
# self.siftDatabaseSelector.connectSettings(SIFT_DATABASE_FILE)
|
||||
|
||||
self.imagePath = None # for checking only
|
||||
self.img = None
|
||||
self.paddleFolder = None
|
||||
@ -54,10 +54,10 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
|
||||
|
||||
self.tryPrepareOcr.connect(self.prepareOcr)
|
||||
|
||||
settings = Settings()
|
||||
logger.info("Applying default settings...")
|
||||
self.knnModelSelector.selectFile(settings.knnModelFile())
|
||||
# self.siftDatabaseSelector.selectFile(settings.siftDatabaseFile())
|
||||
self.knnModelSelector.connectSettings(KNN_MODEL_FILE)
|
||||
self.b30KnnModelSelector.connectSettings(B30_KNN_MODEL_FILE)
|
||||
self.phashDatabaseSelector.connectSettings(PHASH_DATABASE_FILE)
|
||||
|
||||
self.ocrQueueModel = OcrQueueModel(self)
|
||||
self.ocrQueue.setModel(self.ocrQueueModel)
|
||||
@ -81,12 +81,6 @@ class TabOcr_B30(Ui_TabOcr_B30, QWidget):
|
||||
self.b30KnnModel = cv2.ml.KNearest.load(b30KnnModelPath)
|
||||
self.tryPrepareOcr.emit()
|
||||
|
||||
def siftDatabaseSelected(self):
|
||||
if selectedFiles := self.siftDatabaseSelector.selectedFiles():
|
||||
siftDatabasePath = selectedFiles[0]
|
||||
self.siftDatabase = SIFTDatabase(siftDatabasePath)
|
||||
self.tryPrepareOcr.emit()
|
||||
|
||||
def phashDatabaseSelected(self):
|
||||
if selectedFiles := self.phashDatabaseSelector.selectedFiles():
|
||||
phashDatabasePath = selectedFiles[0]
|
||||
|
@ -5,8 +5,8 @@ import cv2
|
||||
# from arcaea_offline_ocr_device_creation_wizard.implements.wizard import Wizard
|
||||
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 arcaea_offline_ocr.phash_db import ImagePHashDatabase
|
||||
from arcaea_offline_ocr.sift_db import SIFTDatabase
|
||||
from PySide6.QtCore import Qt, Slot
|
||||
from PySide6.QtWidgets import QApplication, QFileDialog, QWidget
|
||||
|
||||
@ -16,7 +16,8 @@ from ui.extends.shared.language import LanguageChangeEventFilter
|
||||
from ui.extends.shared.settings import (
|
||||
DEVICES_JSON_FILE,
|
||||
KNN_MODEL_FILE,
|
||||
SIFT_DATABASE_FILE,
|
||||
PHASH_DATABASE_FILE,
|
||||
TESSERACT_FILE,
|
||||
Settings,
|
||||
)
|
||||
from ui.extends.tabs.tabOcr.tabOcr_Device import (
|
||||
@ -39,20 +40,15 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget):
|
||||
|
||||
self.deviceFileSelector.filesSelected.connect(self.deviceFileSelected)
|
||||
self.knnModelSelector.filesSelected.connect(self.knnModelFileSelected)
|
||||
# self.siftDatabaseSelector.filesSelected.connect(self.siftDatabaseFileSelected)
|
||||
self.phashDatabaseSelector.filesSelected.connect(self.phashDatabaseFileSelected)
|
||||
|
||||
logger.info("Applying settings...")
|
||||
self.deviceFileSelector.connectSettings(DEVICES_JSON_FILE)
|
||||
self.knnModelSelector.connectSettings(KNN_MODEL_FILE)
|
||||
# self.siftDatabaseSelector.connectSettings(SIFT_DATABASE_FILE)
|
||||
|
||||
self.tesseractFileSelector.connectSettings(TESSERACT_FILE)
|
||||
self.phashDatabaseSelector.connectSettings(PHASH_DATABASE_FILE)
|
||||
settings = Settings()
|
||||
logger.info("Applying default settings...")
|
||||
self.deviceFileSelector.selectFile(settings.devicesJsonFile())
|
||||
self.tesseractFileSelector.selectFile(settings.tesseractPath())
|
||||
self.deviceComboBox.selectDevice(settings.deviceUuid())
|
||||
self.knnModelSelector.selectFile(settings.knnModelFile())
|
||||
# vself.siftDatabaseSelector.selectFile(settings.siftDatabaseFile())
|
||||
|
||||
self.ocrQueueModel = OcrQueueModel(self)
|
||||
self.ocrQueue.setModel(self.ocrQueueModel)
|
||||
@ -94,10 +90,6 @@ class TabOcr_Device(Ui_TabOcr_Device, QWidget):
|
||||
if selectedFiles := self.knnModelSelector.selectedFiles():
|
||||
self.knnModel = cv2.ml.KNearest.load(selectedFiles[0])
|
||||
|
||||
def siftDatabaseFileSelected(self):
|
||||
if selectedFiles := self.siftDatabaseSelector.selectedFiles():
|
||||
self.siftDatabase = SIFTDatabase(selectedFiles[0])
|
||||
|
||||
def phashDatabaseFileSelected(self):
|
||||
if selectedFiles := self.phashDatabaseSelector.selectedFiles():
|
||||
self.phashDatabase = ImagePHashDatabase(selectedFiles[0])
|
||||
|
@ -477,10 +477,12 @@ validation</translation>
|
||||
<location filename="../../implements/settings/settingsAndreal.py" line="82"/>
|
||||
<location filename="../../implements/settings/settingsAndreal.py" line="85"/>
|
||||
<location filename="../../implements/settings/settingsGeneral.py" line="107"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="137"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="140"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="143"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="146"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="190"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="193"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="196"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="199"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="202"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="205"/>
|
||||
<source>resetButton</source>
|
||||
<translation>Reset</translation>
|
||||
</message>
|
||||
@ -515,30 +517,40 @@ validation</translation>
|
||||
<translation>Database URL</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="134"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="187"/>
|
||||
<source>ocr.title</source>
|
||||
<translation>OCR</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="136"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="189"/>
|
||||
<source>ocr.devicesJson.label</source>
|
||||
<translation>Default devices.json</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="139"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="192"/>
|
||||
<source>ocr.deviceUuid.label</source>
|
||||
<translation>Default device</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="142"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="195"/>
|
||||
<source>ocr.knnModelFile.label</source>
|
||||
<translation>Default KNearest model</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="145"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="198"/>
|
||||
<source>ocr.b30KnnModelFile.label</source>
|
||||
<translation>Default B30 KNearest model</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="201"/>
|
||||
<source>ocr.siftDatabaseFile.label</source>
|
||||
<translation>Default SIFT database file</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="204"/>
|
||||
<source>ocr.phashDatabaseFile.label</source>
|
||||
<translation>Default image PHash database</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SongIdSelector</name>
|
||||
@ -570,7 +582,7 @@ validation</translation>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabAbout.ui" line="86"/>
|
||||
<source>Version Info</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Version Info</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -704,8 +716,8 @@ validation</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_B30.ui" line="62"/>
|
||||
<source>siftDatabaseSelector.title</source>
|
||||
<translation>Select Image SIFT Database</translation>
|
||||
<source>phashDatabaseSelector.title</source>
|
||||
<translation>Select Image PHash Database</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_B30.ui" line="74"/>
|
||||
@ -726,32 +738,31 @@ validation</translation>
|
||||
<translation>Select Device</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="33"/>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="35"/>
|
||||
<source>deviceSelector.useAutoFactor</source>
|
||||
<translation>Auto calculate factor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="70"/>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="81"/>
|
||||
<source>knnModelSelector.title</source>
|
||||
<translation>Select KNearest Model</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="101"/>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="112"/>
|
||||
<source>tesseractSelector.title</source>
|
||||
<translation>Select tesseract Path</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="129"/>
|
||||
<source>siftDatabaseSelector.title</source>
|
||||
<translation>Select Image SIFT Database</translation>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="140"/>
|
||||
<source>phashDatabaseSelector.title</source>
|
||||
<translation>Select Image PHash Database</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TabOverview</name>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOverview.ui" line="23"/>
|
||||
<location filename="../../implements/tabs/tabOverview.py" line="43"/>
|
||||
<source>databaseDescribeLabel {} {} {} {} {} {}</source>
|
||||
<extracomment>This database now have {} packs, {} songs, {} difficulties, {} chart info ({} complete) and {} scores.</extracomment>
|
||||
<translation>There are {} packs, {} songs, {} difficulties, {} chart info ({} complete) and {} scores in database.</translation>
|
||||
</message>
|
||||
</context>
|
||||
@ -841,7 +852,7 @@ validation</translation>
|
||||
<translation>Generate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/tabs/tabTools/tabTools_Andreal.py" line="82"/>
|
||||
<location filename="../../implements/tabs/tabTools/tabTools_Andreal.py" line="138"/>
|
||||
<source>imageWhatIsThisDialog.description</source>
|
||||
<translation>Generate image of...<ul><li>/a - the most recent score</li><li>/a b30 - best30 image</li><li>/a info - best score of the selected chart</li></ul></translation>
|
||||
</message>
|
||||
|
@ -476,10 +476,12 @@
|
||||
<location filename="../../implements/settings/settingsAndreal.py" line="82"/>
|
||||
<location filename="../../implements/settings/settingsAndreal.py" line="85"/>
|
||||
<location filename="../../implements/settings/settingsGeneral.py" line="107"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="137"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="140"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="143"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="146"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="190"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="193"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="196"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="199"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="202"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="205"/>
|
||||
<source>resetButton</source>
|
||||
<translation>重置</translation>
|
||||
</message>
|
||||
@ -514,30 +516,40 @@
|
||||
<translation>数据库 URL</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="134"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="187"/>
|
||||
<source>ocr.title</source>
|
||||
<translation>OCR</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="136"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="189"/>
|
||||
<source>ocr.devicesJson.label</source>
|
||||
<translation>默认设备定义文件</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="139"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="192"/>
|
||||
<source>ocr.deviceUuid.label</source>
|
||||
<translation>默认设备</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="142"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="195"/>
|
||||
<source>ocr.knnModelFile.label</source>
|
||||
<translation>默认 KNearest 模型</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="145"/>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="198"/>
|
||||
<source>ocr.b30KnnModelFile.label</source>
|
||||
<translation>默认 B30 KNearest 模型</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="201"/>
|
||||
<source>ocr.siftDatabaseFile.label</source>
|
||||
<translation>默认 SIFT 特征值数据库</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/settings/settingsOcr.py" line="204"/>
|
||||
<source>ocr.phashDatabaseFile.label</source>
|
||||
<translation>默认图像 PHash 数据库</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SongIdSelector</name>
|
||||
@ -569,7 +581,7 @@
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabAbout.ui" line="86"/>
|
||||
<source>Version Info</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>版本信息</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
@ -703,8 +715,8 @@
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_B30.ui" line="62"/>
|
||||
<source>siftDatabaseSelector.title</source>
|
||||
<translation>选择图像 SIFT 特征值数据库</translation>
|
||||
<source>phashDatabaseSelector.title</source>
|
||||
<translation>选择图像 PHash 数据库</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_B30.ui" line="74"/>
|
||||
@ -725,32 +737,31 @@
|
||||
<translation>选择设备</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="33"/>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="35"/>
|
||||
<source>deviceSelector.useAutoFactor</source>
|
||||
<translation>自动计算 factor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="70"/>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="81"/>
|
||||
<source>knnModelSelector.title</source>
|
||||
<translation>选择 KNearest 模型</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="101"/>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="112"/>
|
||||
<source>tesseractSelector.title</source>
|
||||
<translation>选择 tesseract 路径</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="129"/>
|
||||
<source>siftDatabaseSelector.title</source>
|
||||
<translation>选择图像 SIFT 特征值数据库</translation>
|
||||
<location filename="../../designer/tabs/tabOcr/tabOcr_Device.ui" line="140"/>
|
||||
<source>phashDatabaseSelector.title</source>
|
||||
<translation>选择图像 PHash 数据库</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>TabOverview</name>
|
||||
<message>
|
||||
<location filename="../../designer/tabs/tabOverview.ui" line="23"/>
|
||||
<location filename="../../implements/tabs/tabOverview.py" line="43"/>
|
||||
<source>databaseDescribeLabel {} {} {} {} {} {}</source>
|
||||
<extracomment>This database now have {} packs, {} songs, {} difficulties, {} chart info ({} complete) and {} scores.</extracomment>
|
||||
<translation>数据库中有 {} 个曲包,{} 首歌曲,{} 个难度,{} 个谱面信息({} 个完整),{} 个分数记录。</translation>
|
||||
</message>
|
||||
</context>
|
||||
@ -840,7 +851,7 @@
|
||||
<translation>生成</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../implements/tabs/tabTools/tabTools_Andreal.py" line="82"/>
|
||||
<location filename="../../implements/tabs/tabTools/tabTools_Andreal.py" line="138"/>
|
||||
<source>imageWhatIsThisDialog.description</source>
|
||||
<translation>生成……<ul><li>/a - 最近一次成绩</li><li>/a b30 - /a b30</li><li>/a info - 所选谱面的最好成绩</li></ul></translation>
|
||||
</message>
|
||||
|
Loading…
x
Reference in New Issue
Block a user