Add OCREngine class.
This commit is contained in:
parent
6c3c93a39d
commit
08a6d004e7
1 changed files with 78 additions and 0 deletions
78
pixelocr/gui/ocrengine.py
Normal file
78
pixelocr/gui/ocrengine.py
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
# Copyright (C) 2014 Andrey Golovizin
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
from queue import Queue
|
||||||
|
|
||||||
|
from PyQt4.QtCore import (
|
||||||
|
signal,
|
||||||
|
slot,
|
||||||
|
QThread,
|
||||||
|
)
|
||||||
|
|
||||||
|
from ..image import Image
|
||||||
|
from ..page import Page, Letter, Space
|
||||||
|
|
||||||
|
|
||||||
|
class OCREngine(QThread):
|
||||||
|
unknownLetter = signal([Letter])
|
||||||
|
pageChanged = signal([Page])
|
||||||
|
|
||||||
|
def __init__(self, filenames):
|
||||||
|
super().__init__()
|
||||||
|
self.filenames = filenames
|
||||||
|
self.chardb = {}
|
||||||
|
self.help_queue = Queue()
|
||||||
|
|
||||||
|
def load_page(self, filename):
|
||||||
|
return Page(Image.fromfile(filename).unframe(10))
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
for page_text in self.recognize():
|
||||||
|
print(page_text)
|
||||||
|
|
||||||
|
def recognize(self):
|
||||||
|
for filename in self.filenames:
|
||||||
|
page = self.load_page(filename)
|
||||||
|
self.pageChanged.emit(page)
|
||||||
|
yield '\n'.join(self.recognize_page(page))
|
||||||
|
|
||||||
|
def recognize_page(self, page):
|
||||||
|
for line in page.lines:
|
||||||
|
yield ''.join(self.recognize_line(line))
|
||||||
|
|
||||||
|
def recognize_line(self, line):
|
||||||
|
for letter in line.letters:
|
||||||
|
yield self.recognize_letter(letter)
|
||||||
|
|
||||||
|
def recognize_letter(self, letter):
|
||||||
|
if isinstance(letter, Space):
|
||||||
|
return ' '
|
||||||
|
try:
|
||||||
|
return self.chardb[letter.key]
|
||||||
|
except KeyError:
|
||||||
|
text = self.ask_for_help(letter)
|
||||||
|
self.chardb[letter.key] = text
|
||||||
|
return text
|
||||||
|
|
||||||
|
def ask_for_help(self, unknown_letter):
|
||||||
|
self.unknownLetter.emit(unknown_letter)
|
||||||
|
return self.receive_help()
|
||||||
|
|
||||||
|
def give_help(self, text):
|
||||||
|
self.help_queue.put(text)
|
||||||
|
|
||||||
|
def receive_help(self):
|
||||||
|
return self.help_queue.get()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue