From d1bc7f95db8adfddba902902f77a6f801acb117d Mon Sep 17 00:00:00 2001 From: seeebek Date: Mon, 4 May 2015 22:42:14 +0200 Subject: [PATCH] 0.6.0.3 improved learning wizard, small fixes --- EliteOCR.py | 8 +- EliteOCRcmd.py | 12 +- customqlistwidgetitem.py | 35 +-- eliteOCRGUI.py | 4 +- eliteOCRGUI.ui | 2 +- learningUI.py | 233 +++---------------- learningUI.ui | 473 +++++++-------------------------------- learningwizard.py | 142 +++++++++--- settings.py | 1 + settingsUI.py | 12 +- settingsUI.ui | 10 +- settingsdialog.py | 4 +- 12 files changed, 261 insertions(+), 675 deletions(-) diff --git a/EliteOCR.py b/EliteOCR.py index 38a240e..78888d9 100644 --- a/EliteOCR.py +++ b/EliteOCR.py @@ -3,6 +3,7 @@ import logging import traceback import sys +import re import getopt #import time import json @@ -55,15 +56,16 @@ def _translate(context, text, disambig): def _translate(context, text, disambig): return QApplication.translate(context, text, disambig) -appversion = "0.6.0.2" +appversion = "0.6.0.3" gui = False logging.basicConfig(format='%(asctime)s %(levelname)s:\n%(message)s',filename='errorlog.txt',level=logging.WARNING) def exception_handler(ex_cls, ex, tb): fulltb = ''.join(traceback.format_tb(tb)) fulltb = fulltb.replace("", "EliteOCR") - fulltb = fulltb.replace("C:"+ os.sep +"Users"+ os.sep +"SEBAST~1"+ os.sep +"Desktop"+ os.sep +"RFACTO~2"+ os.sep +"build"+ os.sep +"EliteOCR"+ os.sep +"out00-PYZ.pyz"+ os.sep +"", "") - fulltb = fulltb.replace("C:"+ os.sep +"Users"+ os.sep +"SEBAST~1"+ os.sep +"Desktop"+ os.sep +"RFACTO~2"+ os.sep +"build"+ os.sep +"EliteOCRcmd"+ os.sep +"out00-PYZ.pyz"+ os.sep +"", "") + fulltb = re.sub(r"C:.+\.pyz", "", fulltb) + #fulltb = fulltb.replace("C:"+ os.sep +"Users"+ os.sep +"SEBAST~1"+ os.sep +"Desktop"+ os.sep +"RFACTO~2"+ os.sep +"build"+ os.sep +"EliteOCR"+ os.sep +"out00-PYZ.pyz"+ os.sep +"", "") + #fulltb = fulltb.replace("C:"+ os.sep +"Users"+ os.sep +"SEBAST~1"+ os.sep +"Desktop"+ os.sep +"RFACTO~2"+ os.sep +"build"+ os.sep +"EliteOCRcmd"+ os.sep +"out00-PYZ.pyz"+ os.sep +"", "") logging.critical(fulltb+'\n{0}: {1}\n'.format(ex_cls, ex)) print "An error was encountered. Please read errorlog.txt" #print gui diff --git a/EliteOCRcmd.py b/EliteOCRcmd.py index 045deca..78888d9 100644 --- a/EliteOCRcmd.py +++ b/EliteOCRcmd.py @@ -3,6 +3,7 @@ import logging import traceback import sys +import re import getopt #import time import json @@ -55,18 +56,19 @@ def _translate(context, text, disambig): def _translate(context, text, disambig): return QApplication.translate(context, text, disambig) -appversion = "0.6.0.2" +appversion = "0.6.0.3" gui = False logging.basicConfig(format='%(asctime)s %(levelname)s:\n%(message)s',filename='errorlog.txt',level=logging.WARNING) def exception_handler(ex_cls, ex, tb): fulltb = ''.join(traceback.format_tb(tb)) fulltb = fulltb.replace("", "EliteOCR") - fulltb = fulltb.replace("C:"+ os.sep +"Users"+ os.sep +"SEBAST~1"+ os.sep +"Desktop"+ os.sep +"RFACTO~2"+ os.sep +"build"+ os.sep +"EliteOCR"+ os.sep +"out00-PYZ.pyz"+ os.sep +"", "") - fulltb = fulltb.replace("C:"+ os.sep +"Users"+ os.sep +"SEBAST~1"+ os.sep +"Desktop"+ os.sep +"RFACTO~2"+ os.sep +"build"+ os.sep +"EliteOCRcmd"+ os.sep +"out00-PYZ.pyz"+ os.sep +"", "") + fulltb = re.sub(r"C:.+\.pyz", "", fulltb) + #fulltb = fulltb.replace("C:"+ os.sep +"Users"+ os.sep +"SEBAST~1"+ os.sep +"Desktop"+ os.sep +"RFACTO~2"+ os.sep +"build"+ os.sep +"EliteOCR"+ os.sep +"out00-PYZ.pyz"+ os.sep +"", "") + #fulltb = fulltb.replace("C:"+ os.sep +"Users"+ os.sep +"SEBAST~1"+ os.sep +"Desktop"+ os.sep +"RFACTO~2"+ os.sep +"build"+ os.sep +"EliteOCRcmd"+ os.sep +"out00-PYZ.pyz"+ os.sep +"", "") logging.critical(fulltb+'\n{0}: {1}\n'.format(ex_cls, ex)) print "An error was encountered. Please read errorlog.txt" - print gui + #print gui if gui: QMessageBox.critical(None,"Error", "An error was encountered. Please read errorlog.txt") @@ -414,7 +416,7 @@ def addAllScreenshots(self): dir = unicode(self.settings['screenshot_dir']) #gen = (join(dir, file).decode('windows-1252') for file in listdir(dir) if isfile(join(dir, file))) gen = [join(dir, file) for file in listdir(dir) if file.endswith('.bmp') and file[:7]!="HighRes"] - print gen + #print gen files = [] for file in gen: files.append(file) diff --git a/customqlistwidgetitem.py b/customqlistwidgetitem.py index e63e36f..a8ef9c7 100644 --- a/customqlistwidgetitem.py +++ b/customqlistwidgetitem.py @@ -10,8 +10,8 @@ from time import gmtime, localtime, strftime from tzlocal import get_localzone from datetime import datetime, timedelta -from PyQt4.QtGui import QListWidgetItem, QPixmap -from PyQt4.QtCore import QRect +from PyQt4.QtGui import QListWidgetItem, QPixmap, QImage, qRgba, qGray, qAlpha +from PyQt4.QtCore import Qt, QRect from qimage2ndarray import array2qimage from imageprocessing import * #from ocrmethods import OCRAreasFinder @@ -66,14 +66,20 @@ def addTestImage(self, color_image): self.ocr_areas = OCRAreasFinder(color_image, self.settings["contrast"]) self.market_width = self.ocr_areas.market_width self.valid_market = self.ocr_areas.valid - img = QPixmap(self.hiddentext) - width = img.width() - height = img.height() - aspect_ratio = float(width)/height - if aspect_ratio > 1.78: - new_w = int(1.77778*height) - rect = QRect((width-new_w)/2, 0, new_w, height) - img = img.copy(rect) + if self.settings['gray_preview']: + img = cv2.imread(unicode(self.hiddentext).encode(sys.getfilesystemencoding()), 0) + img = array2qimage(img) + pix = QPixmap.fromImage(img) + else: + pix = QPixmap(self.hiddentext) + width = pix.width() + height = pix.height() + if height > 0: + aspect_ratio = float(width)/height + if aspect_ratio > 1.78: + new_w = int(1.77778*height) + rect = QRect((width-new_w)/2, 0, new_w, height) + pix = pix.copy(rect) if self.valid_market: points = self.ocr_areas.market_table @@ -81,15 +87,13 @@ def addTestImage(self, color_image): station = self.ocr_areas.station_name self.station_offset = (station[0][0], station[0][1]) rect = QRect(0, 0, points[1][0] + 20, points[1][1] + 20) - cut = img.copy(rect) + cut = pix.copy(rect) return cut else: self.market_offset = (0, 0) self.station_offset = (0, 0) - - - return img + return pix def addPreviewImage(self, color_image, parent = None): image = color_image @@ -205,4 +209,5 @@ def parseLogFile(self, path, loglist, y, m, d, hour, minute): else: if re.match(matchscreen, line): screenshotfound = True - return "" \ No newline at end of file + return "" + diff --git a/eliteOCRGUI.py b/eliteOCRGUI.py index 73add74..7823624 100644 --- a/eliteOCRGUI.py +++ b/eliteOCRGUI.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'eliteOCRGUI.ui' # -# Created: Mon Apr 27 13:47:22 2015 +# Created: Mon May 04 19:58:58 2015 # by: PyQt4 UI code generator 4.11.2 # # WARNING! All changes made in this file will be lost! @@ -553,7 +553,7 @@ def setupUi(self, MainWindow): def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(_translate("MainWindow", "EliteOCR", None)) - self.label_2.setText(_translate("MainWindow", "

If you have any problems please read "Help". Please send any bug reports, issues or suggestions to eliteocr@gmail.com or post them in the forum.

", None)) + self.label_2.setText(_translate("MainWindow", "

If you have any problems please read "Help". Please send any bug reports, issues or suggestions to eliteocr@gmail.com or post them in the forum.

", None)) self.add_button.setText(_translate("MainWindow", "...", None)) self.add_button.setShortcut(_translate("MainWindow", "Alt+Q", None)) self.remove_button.setText(_translate("MainWindow", "...", None)) diff --git a/eliteOCRGUI.ui b/eliteOCRGUI.ui index 8ea4961..1ec1479 100644 --- a/eliteOCRGUI.ui +++ b/eliteOCRGUI.ui @@ -51,7 +51,7 @@ - <html><head/><body><p>If you have any problems please read &quot;Help&quot;. Please send any bug reports, issues or suggestions to eliteocr@gmail.com or post them in the <a href="https://forums.frontier.co.uk/showthread.php?t=68771"><span style=" text-decoration: underline; color:#0000ff;">forum.</span></a></p></body></html> + <html><head/><body><p>If you have any problems please <span style=" font-weight:600; text-decoration: underline;">read &quot;Help&quot;</span>. Please send any bug reports, issues or suggestions to eliteocr@gmail.com or post them in the <a href="https://forums.frontier.co.uk/showthread.php?t=68771"><span style=" text-decoration: underline; color:#0000ff;">forum.</span></a></p></body></html> Qt::RichText diff --git a/learningUI.py b/learningUI.py index 7559846..6187a68 100644 --- a/learningUI.py +++ b/learningUI.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'learningUI.ui' # -# Created: Mon Apr 27 13:36:34 2015 +# Created: Mon May 04 19:49:32 2015 # by: PyQt4 UI code generator 4.11.2 # # WARNING! All changes made in this file will be lost! @@ -78,11 +78,12 @@ def setupUi(self, Wizard): Wizard.addPage(self.wizardPage1) self.wizardPage2 = CustomQWizardPage() self.wizardPage2.setObjectName(_fromUtf8("wizardPage2")) - self.verticalLayout_3 = QtGui.QVBoxLayout(self.wizardPage2) - self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) + self.verticalLayout_2 = QtGui.QVBoxLayout(self.wizardPage2) + self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.label = QtGui.QLabel(self.wizardPage2) + self.label.setWordWrap(True) self.label.setObjectName(_fromUtf8("label")) - self.verticalLayout_3.addWidget(self.label) + self.verticalLayout_2.addWidget(self.label) self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.file_list = QtGui.QListWidget(self.wizardPage2) @@ -101,198 +102,28 @@ def setupUi(self, Wizard): self.ocr_button.setObjectName(_fromUtf8("ocr_button")) self.verticalLayout.addWidget(self.ocr_button) self.horizontalLayout.addLayout(self.verticalLayout) - self.verticalLayout_3.addLayout(self.horizontalLayout) - self.horizontalLayout_2 = QtGui.QHBoxLayout() - self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - self.verticalLayout_2 = QtGui.QVBoxLayout() - self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) + self.verticalLayout_2.addLayout(self.horizontalLayout) self.label_5 = QtGui.QLabel(self.wizardPage2) self.label_5.setWordWrap(True) self.label_5.setObjectName(_fromUtf8("label_5")) self.verticalLayout_2.addWidget(self.label_5) - self.gridLayout = QtGui.QGridLayout() - self.gridLayout.setObjectName(_fromUtf8("gridLayout")) - self.g18 = QtGui.QGraphicsView(self.wizardPage2) - self.g18.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g18.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g18.setObjectName(_fromUtf8("g18")) - self.gridLayout.addWidget(self.g18, 2, 7, 1, 1) - self.g17 = QtGui.QGraphicsView(self.wizardPage2) - self.g17.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g17.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g17.setObjectName(_fromUtf8("g17")) - self.gridLayout.addWidget(self.g17, 2, 6, 1, 1) - self.g11 = QtGui.QGraphicsView(self.wizardPage2) - self.g11.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g11.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g11.setObjectName(_fromUtf8("g11")) - self.gridLayout.addWidget(self.g11, 2, 0, 1, 1) - self.g9 = QtGui.QGraphicsView(self.wizardPage2) - self.g9.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g9.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g9.setObjectName(_fromUtf8("g9")) - self.gridLayout.addWidget(self.g9, 0, 8, 1, 1) - self.g19 = QtGui.QGraphicsView(self.wizardPage2) - self.g19.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g19.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g19.setObjectName(_fromUtf8("g19")) - self.gridLayout.addWidget(self.g19, 2, 8, 1, 1) - self.g10 = QtGui.QGraphicsView(self.wizardPage2) - self.g10.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g10.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g10.setObjectName(_fromUtf8("g10")) - self.gridLayout.addWidget(self.g10, 0, 9, 1, 1) - self.g13 = QtGui.QGraphicsView(self.wizardPage2) - self.g13.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g13.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g13.setObjectName(_fromUtf8("g13")) - self.gridLayout.addWidget(self.g13, 2, 2, 1, 1) - self.g14 = QtGui.QGraphicsView(self.wizardPage2) - self.g14.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g14.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g14.setObjectName(_fromUtf8("g14")) - self.gridLayout.addWidget(self.g14, 2, 3, 1, 1) - self.g15 = QtGui.QGraphicsView(self.wizardPage2) - self.g15.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g15.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g15.setObjectName(_fromUtf8("g15")) - self.gridLayout.addWidget(self.g15, 2, 4, 1, 1) - self.g16 = QtGui.QGraphicsView(self.wizardPage2) - self.g16.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g16.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g16.setObjectName(_fromUtf8("g16")) - self.gridLayout.addWidget(self.g16, 2, 5, 1, 1) - self.g7 = QtGui.QGraphicsView(self.wizardPage2) - self.g7.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g7.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g7.setObjectName(_fromUtf8("g7")) - self.gridLayout.addWidget(self.g7, 0, 6, 1, 1) - self.g12 = QtGui.QGraphicsView(self.wizardPage2) - self.g12.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g12.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g12.setObjectName(_fromUtf8("g12")) - self.gridLayout.addWidget(self.g12, 2, 1, 1, 1) - self.g8 = QtGui.QGraphicsView(self.wizardPage2) - self.g8.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g8.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g8.setObjectName(_fromUtf8("g8")) - self.gridLayout.addWidget(self.g8, 0, 7, 1, 1) - self.g20 = QtGui.QGraphicsView(self.wizardPage2) - self.g20.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g20.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g20.setObjectName(_fromUtf8("g20")) - self.gridLayout.addWidget(self.g20, 2, 9, 1, 1) - self.g6 = QtGui.QGraphicsView(self.wizardPage2) - self.g6.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g6.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g6.setObjectName(_fromUtf8("g6")) - self.gridLayout.addWidget(self.g6, 0, 5, 1, 1) - self.e3 = QtGui.QLineEdit(self.wizardPage2) - self.e3.setAlignment(QtCore.Qt.AlignCenter) - self.e3.setObjectName(_fromUtf8("e3")) - self.gridLayout.addWidget(self.e3, 1, 2, 1, 1) - self.e2 = QtGui.QLineEdit(self.wizardPage2) - self.e2.setAlignment(QtCore.Qt.AlignCenter) - self.e2.setObjectName(_fromUtf8("e2")) - self.gridLayout.addWidget(self.e2, 1, 1, 1, 1) - self.e4 = QtGui.QLineEdit(self.wizardPage2) - self.e4.setAlignment(QtCore.Qt.AlignCenter) - self.e4.setObjectName(_fromUtf8("e4")) - self.gridLayout.addWidget(self.e4, 1, 3, 1, 1) - self.e5 = QtGui.QLineEdit(self.wizardPage2) - self.e5.setAlignment(QtCore.Qt.AlignCenter) - self.e5.setObjectName(_fromUtf8("e5")) - self.gridLayout.addWidget(self.e5, 1, 4, 1, 1) - self.g1 = QtGui.QGraphicsView(self.wizardPage2) - self.g1.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g1.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g1.setObjectName(_fromUtf8("g1")) - self.gridLayout.addWidget(self.g1, 0, 0, 1, 1) - self.g2 = QtGui.QGraphicsView(self.wizardPage2) - self.g2.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g2.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g2.setObjectName(_fromUtf8("g2")) - self.gridLayout.addWidget(self.g2, 0, 1, 1, 1) - self.e1 = QtGui.QLineEdit(self.wizardPage2) - self.e1.setAlignment(QtCore.Qt.AlignCenter) - self.e1.setObjectName(_fromUtf8("e1")) - self.gridLayout.addWidget(self.e1, 1, 0, 1, 1) - self.g3 = QtGui.QGraphicsView(self.wizardPage2) - self.g3.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g3.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g3.setObjectName(_fromUtf8("g3")) - self.gridLayout.addWidget(self.g3, 0, 2, 1, 1) - self.g4 = QtGui.QGraphicsView(self.wizardPage2) - self.g4.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g4.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g4.setObjectName(_fromUtf8("g4")) - self.gridLayout.addWidget(self.g4, 0, 3, 1, 1) - self.g5 = QtGui.QGraphicsView(self.wizardPage2) - self.g5.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g5.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.g5.setObjectName(_fromUtf8("g5")) - self.gridLayout.addWidget(self.g5, 0, 4, 1, 1) - self.e11 = QtGui.QLineEdit(self.wizardPage2) - self.e11.setAlignment(QtCore.Qt.AlignCenter) - self.e11.setObjectName(_fromUtf8("e11")) - self.gridLayout.addWidget(self.e11, 3, 0, 1, 1) - self.e12 = QtGui.QLineEdit(self.wizardPage2) - self.e12.setAlignment(QtCore.Qt.AlignCenter) - self.e12.setObjectName(_fromUtf8("e12")) - self.gridLayout.addWidget(self.e12, 3, 1, 1, 1) - self.e13 = QtGui.QLineEdit(self.wizardPage2) - self.e13.setAlignment(QtCore.Qt.AlignCenter) - self.e13.setObjectName(_fromUtf8("e13")) - self.gridLayout.addWidget(self.e13, 3, 2, 1, 1) - self.e14 = QtGui.QLineEdit(self.wizardPage2) - self.e14.setAlignment(QtCore.Qt.AlignCenter) - self.e14.setObjectName(_fromUtf8("e14")) - self.gridLayout.addWidget(self.e14, 3, 3, 1, 1) - self.e15 = QtGui.QLineEdit(self.wizardPage2) - self.e15.setAlignment(QtCore.Qt.AlignCenter) - self.e15.setObjectName(_fromUtf8("e15")) - self.gridLayout.addWidget(self.e15, 3, 4, 1, 1) - self.e16 = QtGui.QLineEdit(self.wizardPage2) - self.e16.setAlignment(QtCore.Qt.AlignCenter) - self.e16.setObjectName(_fromUtf8("e16")) - self.gridLayout.addWidget(self.e16, 3, 5, 1, 1) - self.e17 = QtGui.QLineEdit(self.wizardPage2) - self.e17.setAlignment(QtCore.Qt.AlignCenter) - self.e17.setObjectName(_fromUtf8("e17")) - self.gridLayout.addWidget(self.e17, 3, 6, 1, 1) - self.e18 = QtGui.QLineEdit(self.wizardPage2) - self.e18.setAlignment(QtCore.Qt.AlignCenter) - self.e18.setObjectName(_fromUtf8("e18")) - self.gridLayout.addWidget(self.e18, 3, 7, 1, 1) - self.e19 = QtGui.QLineEdit(self.wizardPage2) - self.e19.setAlignment(QtCore.Qt.AlignCenter) - self.e19.setObjectName(_fromUtf8("e19")) - self.gridLayout.addWidget(self.e19, 3, 8, 1, 1) - self.e20 = QtGui.QLineEdit(self.wizardPage2) - self.e20.setAlignment(QtCore.Qt.AlignCenter) - self.e20.setObjectName(_fromUtf8("e20")) - self.gridLayout.addWidget(self.e20, 3, 9, 1, 1) - self.e6 = QtGui.QLineEdit(self.wizardPage2) - self.e6.setAlignment(QtCore.Qt.AlignCenter) - self.e6.setObjectName(_fromUtf8("e6")) - self.gridLayout.addWidget(self.e6, 1, 5, 1, 1) - self.e7 = QtGui.QLineEdit(self.wizardPage2) - self.e7.setAlignment(QtCore.Qt.AlignCenter) - self.e7.setObjectName(_fromUtf8("e7")) - self.gridLayout.addWidget(self.e7, 1, 6, 1, 1) - self.e8 = QtGui.QLineEdit(self.wizardPage2) - self.e8.setAlignment(QtCore.Qt.AlignCenter) - self.e8.setObjectName(_fromUtf8("e8")) - self.gridLayout.addWidget(self.e8, 1, 7, 1, 1) - self.e9 = QtGui.QLineEdit(self.wizardPage2) - self.e9.setAlignment(QtCore.Qt.AlignCenter) - self.e9.setObjectName(_fromUtf8("e9")) - self.gridLayout.addWidget(self.e9, 1, 8, 1, 1) - self.e10 = QtGui.QLineEdit(self.wizardPage2) - self.e10.setAlignment(QtCore.Qt.AlignCenter) - self.e10.setObjectName(_fromUtf8("e10")) - self.gridLayout.addWidget(self.e10, 1, 9, 1, 1) - self.verticalLayout_2.addLayout(self.gridLayout) + self.snippet_preview = QtGui.QGraphicsView(self.wizardPage2) + self.snippet_preview.setMaximumSize(QtCore.QSize(16777215, 45)) + self.snippet_preview.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.snippet_preview.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.snippet_preview.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) + self.snippet_preview.setObjectName(_fromUtf8("snippet_preview")) + self.verticalLayout_2.addWidget(self.snippet_preview) + self.field_holder = QtGui.QHBoxLayout() + self.field_holder.setObjectName(_fromUtf8("field_holder")) + self.grid = QtGui.QGridLayout() + self.grid.setSizeConstraint(QtGui.QLayout.SetMinimumSize) + self.grid.setObjectName(_fromUtf8("grid")) + self.field_holder.addLayout(self.grid) + spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.field_holder.addItem(spacerItem3) + self.field_holder.setStretch(1, 100) + self.verticalLayout_2.addLayout(self.field_holder) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.prev_button = QtGui.QPushButton(self.wizardPage2) @@ -304,21 +135,9 @@ def setupUi(self, Wizard): self.next_button.setObjectName(_fromUtf8("next_button")) self.horizontalLayout_4.addWidget(self.next_button) self.verticalLayout_2.addLayout(self.horizontalLayout_4) - spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.verticalLayout_2.addItem(spacerItem3) - self.verticalLayout_2.setStretch(0, 1) - self.verticalLayout_2.setStretch(1, 1) - self.verticalLayout_2.setStretch(2, 1) - self.verticalLayout_2.setStretch(3, 100) - self.horizontalLayout_2.addLayout(self.verticalLayout_2) - self.horizontalLayout_2.setStretch(0, 2) - self.verticalLayout_3.addLayout(self.horizontalLayout_2) spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.verticalLayout_3.addItem(spacerItem4) - self.verticalLayout_3.setStretch(0, 1) - self.verticalLayout_3.setStretch(1, 1) - self.verticalLayout_3.setStretch(2, 1) - self.verticalLayout_3.setStretch(3, 100) + self.verticalLayout_2.addItem(spacerItem4) + self.verticalLayout_2.setStretch(6, 100) Wizard.addPage(self.wizardPage2) self.wizardPage3 = CustomQWizardPage() self.wizardPage3.setObjectName(_fromUtf8("wizardPage3")) @@ -379,7 +198,7 @@ def retranslateUi(self, Wizard): self.label_4.setText(_translate("Wizard", "User\'s learning images:", None)) self.user_data_label.setText(_translate("Wizard", "-", None)) self.delete_images_button.setText(_translate("Wizard", "Delete user\'s training images", None)) - self.label.setText(_translate("Wizard", "Select Files", None)) + self.label.setText(_translate("Wizard", "Select Files to use for learning and click OCR. The images will be cut in single characters for training. Check every single one if it is recognized properly and correct if needed.", None)) self.add_files_button.setText(_translate("Wizard", "Add Files", None)) self.remove_file_button.setText(_translate("Wizard", "Remove File", None)) self.ocr_button.setText(_translate("Wizard", "OCR", None)) diff --git a/learningUI.ui b/learningUI.ui index 25c2584..a07783d 100644 --- a/learningUI.ui +++ b/learningUI.ui @@ -125,11 +125,14 @@ - + - Select Files + Select Files to use for learning and click OCR. The images will be cut in single characters for training. Check every single one if it is recognized properly and correct if needed. + + + true @@ -173,403 +176,81 @@ - - - - - - - Dot and comma are the same for learning. + + + Dot and comma are the same for learning. If two letters are recognized as one use empty text field so it will be ignored while learning. - - - true - - - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::AlignCenter - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::ScrollBarAlwaysOff - - - Qt::ScrollBarAlwaysOff - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - Qt::AlignCenter - - - - - - - - - - - false - - - Previous - - - - - - - false - - - Next - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - + + + true + + + + + + + + 16777215 + 45 + + + + Qt::ScrollBarAlwaysOff + + + Qt::ScrollBarAlwaysOff + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + QLayout::SetMinimumSize + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + false + + + Previous + + + + + + + false + + + Next + + + diff --git a/learningwizard.py b/learningwizard.py index 54261f3..a175043 100644 --- a/learningwizard.py +++ b/learningwizard.py @@ -11,7 +11,7 @@ from qimage2ndarray import array2qimage from bitarray import bitarray -from PyQt4.QtGui import QWizard, QFileDialog, QListWidgetItem, QGraphicsScene, QPen, QPixmap, QMovie +from PyQt4.QtGui import QWizard, QFileDialog, QListWidgetItem, QGraphicsScene, QPen, QPixmap, QMovie, QGridLayout, QGraphicsView, QLineEdit from PyQt4.QtCore import Qt, QObject, SIGNAL, QSize from learningUI import Ui_Wizard @@ -42,16 +42,21 @@ def __init__(self, settings): self.save_button.clicked.connect(self.saveImgData) self.train_button.clicked.connect(self.trainOCR) self.ocr_button.clicked.connect(self.runOCR) - self.next_button.clicked.connect(self.nextBox) - self.prev_button.clicked.connect(self.previousBox) + self.next_button.clicked.connect(self.nextWord) + self.prev_button.clicked.connect(self.previousWord) #self.add_screenshots.clicked.connect(self.AddFiles) #self.wizardPage2.pageCreated.connect(self.AnalyzeImg) #self.contrast = 0.0 - self.img_fields = [self.g1,self.g2,self.g3,self.g4,self.g5,self.g6,self.g7,self.g8,self.g9,self.g10,self.g11,self.g12,self.g13,self.g14,self.g15,self.g16,self.g17,self.g18,self.g19,self.g20] - self.input_fields = [self.e1,self.e2,self.e3,self.e4,self.e5,self.e6,self.e7,self.e8,self.e9,self.e10,self.e11,self.e12,self.e13,self.e14,self.e15,self.e16,self.e17,self.e18,self.e19,self.e20] + #self.img_fields = [self.g1,self.g2,self.g3,self.g4,self.g5,self.g6,self.g7,self.g8,self.g9,self.g10,self.g11,self.g12,self.g13,self.g14,self.g15,self.g16,self.g17,self.g18,self.g19,self.g20] + #self.input_fields = [self.e1,self.e2,self.e3,self.e4,self.e5,self.e6,self.e7,self.e8,self.e9,self.e10,self.e11,self.e12,self.e13,self.e14,self.e15,self.e16,self.e17,self.e18,self.e19,self.e20] + self.gviews = [] + self.ledits = [] self.boxlist = [] self.imglist = [] self.charlist = [] + self.words = [] + self.boundaries = [] + self.wordcount = 0 self.current = 0 self.scene = None self.ratio_h = 1.0 @@ -63,11 +68,14 @@ def __init__(self, settings): if not self.user is None: self.delete_images_button.setEnabled(True) self.user_data_label.setText(self.getUserData()) - self.resizeElements() + #self.resizeElements() - for index,item in zip(range(20), self.input_fields): - item.textEdited.connect(partial(self.changeText, index)) + #for index,item in zip(range(20), self.input_fields): + # item.textEdited.connect(partial(self.changeText, index)) self.train_button.setEnabled(True) + #self.grid = QGridLayout() + #self.field_holder.addLayout(self.grid) + def deleteUserImages(self): self.user = None @@ -204,8 +212,7 @@ def saveImgData(self): def changeText(self, index): #print index - if len(self.charlist) > (self.current*20)+index: - self.charlist[(self.current*20)+index] = str(self.input_fields[index].text()) + self.words[self.current][index][1] = unicode(self.ledits[index].text()) def getBaseData(self): text = "" @@ -270,7 +277,7 @@ def AddFiles(self): first_item = item self.file_list.addItem(item) counter+=1 - + """ def resizeElements(self): fields = self.input_fields for field in fields: @@ -280,7 +287,7 @@ def resizeElements(self): for canvas in canvases: canvas.setMinimumSize(QSize(0, self.settings['snippet_size'])) canvas.setMaximumSize(QSize(16777215, self.settings['snippet_size'])) - + """ def runOCR(self): self.add_files_button.setEnabled(False) self.remove_file_button.setEnabled(False) @@ -289,15 +296,17 @@ def runOCR(self): self.repaint() self.current_image = 0 self.results = [] - images = [] + self.images = [] self.prev = [] + self.marketoffset = [] + self.stationoffset = [] files = self.file_list.count() for i in xrange(files): self.file_list.setCurrentRow(i) item = self.file_list.currentItem() color_image = item.loadColorImage() preview_image = item.addTestImage(color_image) - images.append(color_image) + self.images.append(color_image) self.prev.append(preview_image) #cv2.imshow("x", color_image) #cv2.waitKey(0) @@ -305,19 +314,58 @@ def runOCR(self): #images.append(preview_image) #self.setPreviewImage(preview_image) #return + self.stationoffset.append(item.ocr_areas.station_name) + self.marketoffset.append(item.ocr_areas.market_table) current_result = OCR(color_image, item.ocr_areas, self.settings["ocr_language"], item, levels = False) self.results.append(current_result) self.allBoxes() - #self.drawSnippet(self.imglist[0]) - #self.setPreviewImage(self.prev[0]) + #print len(self.words) + #print self.words[1] self.next_button.setEnabled(True) self.prev_button.setEnabled(True) self.showSet() - #self.drawOCRPreview() - #self.character_input.setText(self.charlist[self.current]) + def showSet(self): + #self.snippet_preview + + bound = self.boundaries[self.current] + #print self.current + #print bound[1] + image = self.images[bound[0]][bound[1][1]-2:bound[1][3]+3,bound[1][0]-2:bound[1][2]+2] + self.drawSnippet(self.snippet_preview, image) + for gview in self.gviews: + self.grid.removeWidget(gview) + gview.deleteLater() + gview = None + for ledit in self.ledits: + self.grid.removeWidget(ledit) + ledit.deleteLater() + ledit = None + self.gviews = [] + self.ledits = [] + letters = len(self.words[self.current]) + for i in range(letters): + gview = QGraphicsView() + self.grid.addWidget(gview,0,i) + self.gviews.append(gview) + gview.setMaximumSize(50, self.settings['snippet_size']) + gview.setVerticalScrollBarPolicy(1) + gview.setHorizontalScrollBarPolicy(1) + self.drawSnippet(gview, self.words[self.current][i][0]) + + ledit = QLineEdit() + self.grid.addWidget(ledit,1,i) + self.ledits.append(ledit) + ledit.setMaximumSize(50, self.settings['input_size']) + ledit.setAlignment(Qt.AlignHCenter) + ledit.setText(self.words[self.current][i][1]) + + for index,item in zip(range(50), self.ledits): + item.textEdited.connect(partial(self.changeText, index)) + self.repaint() + """ pictures = len(self.img_fields) if pictures < len(self.imglist)-((self.current-1)*20): for i in range(20): @@ -329,16 +377,17 @@ def showSet(self): self.input_fields[i].setText("") self.wizardPage2.fullfilled = True self.wizardPage2.completeChanged.emit() + """ - def previousBox(self): + def previousWord(self): if self.current > 0: self.current -= 1 self.showSet() - def nextBox(self): + def nextWord(self): #print self.maxcount - if self.current < self.maxcount: + if self.current < self.wordcount-1: self.current += 1 self.showSet() @@ -402,14 +451,22 @@ def allBoxes(self): for i in range(self.file_list.count()): self.file_list.setCurrentRow(i) current = self.file_list.currentItem() + res = self.results[i].station.name cres = self.results[i] self.charlist += list(res.value.replace(" ", "")) - #boxlist += - for unit in self.results[i].station.name.units: - self.boxlist.append([unit[0]+current.station_offset[0],unit[1]-unit[0], - unit[2]+current.station_offset[1],unit[3]-unit[2]]) - + + text = res.value.replace(" ", "") + imgcount = len(self.results[i].station.name.units) + charcount = len(text) + word = [] + + for j in range(imgcount): + if j < charcount: + char = text[j] + else: + char = "" + unit = self.results[i].station.name.units[j] image = cres.station_img[unit[2]:unit[3]+1,unit[0]:unit[1]] h = res.h if len(image) > 0: @@ -423,12 +480,30 @@ def allBoxes(self): border = (h - len(image[0]))/2 image = cv2.copyMakeBorder(image,0,0,border,border,cv2.BORDER_CONSTANT,value=(255,255,255)) self.imglist.append(image) - + + word.append([image, char]) + + self.words.append(word) + self.boundaries.append([i, [res.box[0]+self.stationoffset[i][0][0], + res.box[1]+self.stationoffset[i][0][1], + res.box[2]+self.stationoffset[i][0][0], + res.box[3]+self.stationoffset[i][0][1]]]) + for line in self.results[i].commodities: for item in line.items: if not item is None: + text = item.value.replace(" ", "") + imgcount = len(item.units) + charcount = len(text) + word = [] + self.charlist += list(item.value.replace(" ", "")) - for unit in item.units: + for j in range(imgcount): + if j < charcount: + char = text[j] + else: + char = "" + unit = item.units[j] self.boxlist.append([unit[0]+current.market_offset[0],unit[1]-unit[0], unit[2]+current.market_offset[1],unit[3]-unit[2]]) @@ -446,7 +521,16 @@ def allBoxes(self): image = cv2.copyMakeBorder(image,0,0,border,border,cv2.BORDER_CONSTANT,value=(255,255,255)) self.imglist.append(image) - self.maxcount = len(self.imglist)/20 + + word.append([image, char]) + + self.words.append(word) + self.boundaries.append([i, [item.box[0]+self.marketoffset[i][0][0], + item.box[1]+self.marketoffset[i][0][1], + item.box[2]+self.marketoffset[i][0][0], + item.box[3]+self.marketoffset[i][0][1]]]) + self.wordcount = len(self.words) + #self.maxcount = len(self.imglist)/20 def setPreviewImage(self, image): diff --git a/settings.py b/settings.py index 941b7c3..dcd4b67 100644 --- a/settings.py +++ b/settings.py @@ -55,6 +55,7 @@ def loadSettings(self): 'screenshot_dir': self.reg.value('screenshot_dir', type=QString), 'export_dir': self.reg.value('export_dir', type=QString), 'horizontal_exp': self.reg.value('horizontal_exp', type=bool), + 'gray_preview': self.reg.value('gray_preview', False, type=bool), 'last_export_format': self.reg.value('last_export_format', type=QString), 'log_dir': self.reg.value('log_dir', type=QString), 'auto_fill': self.reg.value('auto_fill', type=bool), diff --git a/settingsUI.py b/settingsUI.py index 0de77d0..3e35ffc 100644 --- a/settingsUI.py +++ b/settingsUI.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'settingsUI.ui' # -# Created: Mon Apr 27 11:47:15 2015 +# Created: Mon May 04 20:23:36 2015 # by: PyQt4 UI code generator 4.11.2 # # WARNING! All changes made in this file will be lost! @@ -360,11 +360,9 @@ def setupUi(self, Settings): self.horizontal_exp = QtGui.QCheckBox(self.tab_3) self.horizontal_exp.setObjectName(_fromUtf8("horizontal_exp")) self.verticalLayout_6.addWidget(self.horizontal_exp) - self.create_nn_images = QtGui.QCheckBox(self.tab_3) - self.create_nn_images.setEnabled(False) - self.create_nn_images.setChecked(False) - self.create_nn_images.setObjectName(_fromUtf8("create_nn_images")) - self.verticalLayout_6.addWidget(self.create_nn_images) + self.gray_preview = QtGui.QCheckBox(self.tab_3) + self.gray_preview.setObjectName(_fromUtf8("gray_preview")) + self.verticalLayout_6.addWidget(self.gray_preview) spacerItem6 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout_6.addItem(spacerItem6) self.tabWidget.addTab(self.tab_3, _fromUtf8("")) @@ -422,7 +420,7 @@ def retranslateUi(self, Settings): self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("Settings", "Layout", None)) self.native_dialog.setText(_translate("Settings", "Use native file dialog (might ignore default paths)", None)) self.horizontal_exp.setText(_translate("Settings", "Horizontal export", None)) - self.create_nn_images.setText(_translate("Settings", "Save images for machine learning (not used currently)", None)) + self.gray_preview.setText(_translate("Settings", "Grayscale preview image", None)) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("Settings", "Misc", None)) import res_rc diff --git a/settingsUI.ui b/settingsUI.ui index a0bfeb8..b597e72 100644 --- a/settingsUI.ui +++ b/settingsUI.ui @@ -726,15 +726,9 @@ - - - false - + - Save images for machine learning (not used currently) - - - false + Grayscale preview image diff --git a/settingsdialog.py b/settingsdialog.py index 146ccf4..8e92645 100644 --- a/settingsdialog.py +++ b/settingsdialog.py @@ -18,6 +18,7 @@ def __init__(self, settings): self.exp_dir.setText(self.exportdir) self.horizontal_exp.setChecked(self.settings['horizontal_exp']) self.native_dialog.setChecked(self.settings['native_dialog']) + self.gray_preview.setChecked(self.settings['gray_preview']) self.exp_browse.clicked.connect(self.browseExportDir) self.logdir = self.settings['log_dir'] @@ -29,7 +30,6 @@ def __init__(self, settings): self.remove_dupli.setChecked(self.settings['remove_dupli']) self.delete_files.setChecked(self.settings['delete_files']) self.pause_at_end.setChecked(self.settings['pause_at_end']) - self.create_nn_images.setChecked(self.settings['create_nn_images']) self.input_size.setValue(self.settings['input_size']) self.snippet_size.setValue(self.settings['snippet_size']) self.label_color.setText(self.settings['label_color']) @@ -198,6 +198,7 @@ def accept(self): self.settings.setValue('screenshot_dir', self.screenshotdir) self.settings.setValue('export_dir', self.exportdir) self.settings.setValue('horizontal_exp', self.horizontal_exp.isChecked()) + self.settings.setValue('gray_preview', self.gray_preview.isChecked()) self.settings.setValue('native_dialog', self.native_dialog.isChecked()) self.settings.setValue('log_dir', self.logdir) self.settings.setValue('translate_results', self.translate_results.isChecked()) @@ -207,7 +208,6 @@ def accept(self): self.settings.setValue('pause_at_end', self.pause_at_end.isChecked()) self.settings.setValue('ui_language', self.ui_language.currentText()) self.settings.setValue('ocr_language', self.ocr_language.currentText()) - self.settings.setValue('create_nn_images', self.create_nn_images.isChecked()) self.settings.setValue('theme', self.theme.currentText()) self.settings.setValue('input_size', self.input_size.value()) self.settings.setValue('snippet_size', self.snippet_size.value())