Implement basic learning mode.

This commit is contained in:
Andrey Golovizin 2014-08-15 18:10:49 +02:00
parent a537f2140c
commit c5cb68f063
3 changed files with 62 additions and 15 deletions

View file

@ -16,17 +16,22 @@
import sys import sys
import signal import signal
from threading import Thread
import sip import sip
sip.setapi('QString', 2) sip.setapi('QString', 2)
from .window import MainWindow from PyQt4 import QtCore
QtCore.signal = QtCore.pyqtSignal
QtCore.slot = QtCore.pyqtSlot
from PyQt4.QtGui import ( from PyQt4.QtGui import (
QApplication, QApplication,
) )
from .window import MainWindow
from .ocrengine import OCREngine
def main(): def main():
app = QApplication(sys.argv) app = QApplication(sys.argv)
@ -37,9 +42,11 @@ def main():
win = MainWindow() win = MainWindow()
win.show() win.show()
from ..page import Page ocr = OCREngine(sys.argv[1:])
from ..image import Image ocr.pageChanged.connect(win.pageScene.setPage)
win.pageScene.setPage(Page(Image.fromfile(sys.argv[1]).unframe(10))) ocr.unknownLetter.connect(win.unknownLetter)
win.letterEntered.connect(ocr.give_help)
ocr.start()
signal.signal(signal.SIGINT, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL)
sys.exit(app.exec_()) sys.exit(app.exec_())

View file

@ -14,12 +14,17 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from PyQt4.QtCore import Qt from PyQt4.QtCore import (
signal,
slot,
)
from PyQt4.QtGui import ( from PyQt4.QtGui import (
QBrush, QBrush,
QColor, QColor,
QFrame, QFrame,
QGraphicsDropShadowEffect, QGraphicsDropShadowEffect,
QGraphicsItem,
QGraphicsScene, QGraphicsScene,
QGraphicsView, QGraphicsView,
QImage, QImage,
@ -45,11 +50,21 @@ class PageScene(QGraphicsScene):
page = None page = None
pageItem = None pageItem = None
letterPen = QColor(0, 0, 0, 80)
letterBrush = QColor(255, 255, 0, 80)
spacePen = QColor(0, 0, 0, 80)
spaceBrush = QColor(0, 0, 255, 20)
linePen = QColor(255, 50, 50, 100)
pageItemChanged = signal([QGraphicsItem])
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.highlightedLetters = {}
self.setBackgroundBrush(self.palette().window()) self.setBackgroundBrush(self.palette().window())
def setPage(self, page): def setPage(self, page):
self.highlightedLetters.clear()
for item in self.items(): for item in self.items():
self.remoteItem(item) self.remoteItem(item)
self.page = page self.page = page
@ -59,27 +74,36 @@ class PageScene(QGraphicsScene):
shadow.setBlurRadius(20) shadow.setBlurRadius(20)
shadow.setOffset(2, 2) shadow.setOffset(2, 2)
self.pageItem.setGraphicsEffect(shadow) self.pageItem.setGraphicsEffect(shadow)
self.pageItemChanged.emit(self.pageItem)
letterPen = QColor(0, 0, 0, 80) def highlightAll(self):
letterBrush = QColor(255, 255, 0, 80)
spacePen = QColor(0, 0, 0, 80)
spaceBrush = QColor(0, 0, 255, 20)
linePen = QColor(255, 50, 50, 100)
for line in page: for line in page:
for letter in line: for letter in line:
if not letter.image.isspace: if not letter.image.isspace:
self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, letterPen, letterBrush) self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, self.letterPen, self.letterBrush)
else: else:
self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, spacePen, spaceBrush) self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, self.spacePen, self.spaceBrush)
self.addLine(line.left, line.baseline, line.right, line.baseline, linePen) self.addLine(line.left, line.baseline, line.right, line.baseline, self.linePen)
def addPage(self, page): def addPage(self, page):
qimage = ndimage2qimage(page.image.data) qimage = ndimage2qimage(page.image.data)
graphicsitem = self.addPixmap(QPixmap.fromImage(qimage)) graphicsitem = self.addPixmap(QPixmap.fromImage(qimage))
return graphicsitem return graphicsitem
def highlightLetter(self, letter):
rect = self.addRect(letter.x - 1, letter.y - 1, letter.width + 1, letter.height + 1, self.letterPen, self.letterBrush)
self.highlightedLetters[letter] = rect
def clearHighlight(self):
for item in self.highlightedLetters.values():
self.removeItem(item)
self.highlightedLetters.clear()
class PageView(QGraphicsView): class PageView(QGraphicsView):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.setFrameShape(self.NoFrame) self.setFrameShape(self.NoFrame)
def centerOnPage(self, pageItem):
self.centerOn(pageItem)

View file

@ -15,6 +15,8 @@
from PyQt4.QtCore import ( from PyQt4.QtCore import (
signal,
slot,
Qt, Qt,
QSettings, QSettings,
QSize, QSize,
@ -28,9 +30,12 @@ from PyQt4.QtGui import (
) )
from .pageview import PageScene, PageView from .pageview import PageScene, PageView
from .glyphedit import GlyphEdit
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
letterEntered = signal([str])
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.setWindowTitle('PixelOCR') self.setWindowTitle('PixelOCR')
@ -39,10 +44,16 @@ class MainWindow(QMainWindow):
self.setCentralWidget(centralWidget) self.setCentralWidget(centralWidget)
self.pageScene = PageScene(self) self.pageScene = PageScene(self)
self.page = PageView(self.pageScene, centralWidget) self.page = PageView(self.pageScene, centralWidget)
self.pageScene.pageItemChanged.connect(self.page.centerOnPage)
self.glyphEdit = GlyphEdit(centralWidget)
self.glyphEdit.letterEntered.connect(self.letterEntered)
self.glyphEdit.letterEntered.connect(self.pageScene.clearHighlight)
layout = QVBoxLayout(centralWidget) layout = QVBoxLayout(centralWidget)
layout.addWidget(self.page) layout.setSpacing(0)
layout.setContentsMargins(0, 0, 0, 0) layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.page)
layout.addWidget(self.glyphEdit)
self.readSettings() self.readSettings()
@ -63,3 +74,8 @@ class MainWindow(QMainWindow):
self.restoreGeometry(settings.value("windowGeometry") or b'') self.restoreGeometry(settings.value("windowGeometry") or b'')
self.restoreState(settings.value("windowState") or b'') self.restoreState(settings.value("windowState") or b'')
def unknownLetter(self, letter):
self.pageScene.highlightLetter(letter)
self.glyphEdit.setEnabled(True)
self.glyphEdit.text.clear()
self.glyphEdit.text.setFocus()