From c2fb42ebbd24d493bffa99efb61736227fcf1e34 Mon Sep 17 00:00:00 2001 From: Albert Cervera i Areny Date: Mon, 29 Dec 2008 01:53:29 +0100 Subject: [PATCH] Renamed: - Unwritable NaNScaN To NanScan. - Capitalized file names. --- NanScan/Analyzer.py | 59 +++++ NanScan/Backends/Common.py | 78 ++++++ NanScan/Backends/SaneBackend.py | 94 +++++++ NanScan/Backends/TwainBackend.py | 122 +++++++++ NanScan/Backends/__init__.py | 18 ++ NanScan/Backends/twain.pyd | Bin 0 -> 90112 bytes NanScan/Barcode.py | 90 +++++++ NanScan/DataMatrix.py | 146 +++++++++++ NanScan/Document.py | 33 +++ NanScan/Hamming.py | 66 +++++ NanScan/Levenshtein.py | 65 +++++ NanScan/Ocr.py | 373 ++++++++++++++++++++++++++ NanScan/Recognizer.py | 437 +++++++++++++++++++++++++++++++ NanScan/ScanDialog.py | 192 ++++++++++++++ NanScan/ScanDialog.ui | 77 ++++++ NanScan/Scanner.py | 25 ++ NanScan/Template.py | 67 +++++ NanScan/TemporaryFile.py | 27 ++ NanScan/Translator.py | 65 +++++ NanScan/Trigram.py | 95 +++++++ NanScan/__init__.py | 18 ++ NanScan/change-resolution.py | 43 +++ NanScan/common.rcc | Bin 0 -> 167687 bytes NanScan/learn.py | 44 ++++ NanScan/test-barcode.py | 24 ++ NanScan/test-learn.py | 33 +++ NanScan/test-ocr.py | 41 +++ NanScan/test-scandialog.py | 18 ++ NanScan/translations.txt | 7 + 29 files changed, 2357 insertions(+) create mode 100644 NanScan/Analyzer.py create mode 100644 NanScan/Backends/Common.py create mode 100644 NanScan/Backends/SaneBackend.py create mode 100644 NanScan/Backends/TwainBackend.py create mode 100644 NanScan/Backends/__init__.py create mode 100644 NanScan/Backends/twain.pyd create mode 100644 NanScan/Barcode.py create mode 100644 NanScan/DataMatrix.py create mode 100644 NanScan/Document.py create mode 100644 NanScan/Hamming.py create mode 100644 NanScan/Levenshtein.py create mode 100755 NanScan/Ocr.py create mode 100644 NanScan/Recognizer.py create mode 100644 NanScan/ScanDialog.py create mode 100644 NanScan/ScanDialog.ui create mode 100644 NanScan/Scanner.py create mode 100644 NanScan/Template.py create mode 100644 NanScan/TemporaryFile.py create mode 100644 NanScan/Translator.py create mode 100755 NanScan/Trigram.py create mode 100644 NanScan/__init__.py create mode 100755 NanScan/change-resolution.py create mode 100644 NanScan/common.rcc create mode 100644 NanScan/learn.py create mode 100755 NanScan/test-barcode.py create mode 100644 NanScan/test-learn.py create mode 100644 NanScan/test-ocr.py create mode 100644 NanScan/test-scandialog.py create mode 100644 NanScan/translations.txt diff --git a/NanScan/Analyzer.py b/NanScan/Analyzer.py new file mode 100644 index 0000000..7599b70 --- /dev/null +++ b/NanScan/Analyzer.py @@ -0,0 +1,59 @@ +# coding=iso-8859-1 +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import subprocess +import tempfile +import codecs +import os + +class Analyzer: + analyzers = {} + + def __init__(self): + self.boxes = [] + + @staticmethod + def registerAnalyzer(name, analyzer): + Analyzer.analyzers[name] = analyzer + + @staticmethod + def unregisterAnalyzer(name): + del Analyzer.analyzers[name] + + @staticmethod + def create(name): + return Analyzer.analyzers[name]() + + def scan(self, image): + pass + + def textInRegion(self, region): + pass + + def featureRectInRegion(self, region): + pass + + # Spawn process and return STDOUT + def spawn(self, command, *args): + print "Started: ", command + command = [ command ] + list( args ) + process = subprocess.Popen( command , stdout=subprocess.PIPE ) + content = process.communicate()[0] + print "Finished: ", command + return content diff --git a/NanScan/Backends/Common.py b/NanScan/Backends/Common.py new file mode 100644 index 0000000..00fdf84 --- /dev/null +++ b/NanScan/Backends/Common.py @@ -0,0 +1,78 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +# Current backend should set ScannerBackend to the class +# implementing the Synchronous interface +ScannerBackend = None + +class ScannerError: + NoDeviceFound = 1 + CouldNotOpenDevice = 2 + AcquisitionError = 3 + UnknownError = 4 + +class Scanner(QObject): + def __init__(self, parent=None): + QObject.__init__(self, parent) + self.resolution = 300 + self.duplex = False + + def listDevices(self): + scan = BlockingScanner(self) + devices = scan.listDevices() + scan.close() + return devices + + def setResolution(self, value): + self.resolution = value + + def setDuplex(self, value): + self.duplex = value + + def startScan(self): + self.thread = ThreadedScan(self) + self.thread.resolution = self.resolution + self.thread.duplex = self.duplex + self.connect( self.thread, SIGNAL('finished()'), self, SIGNAL('finished()') ) + self.connect( self.thread, SIGNAL('scanned(QImage)'), self, SIGNAL('scanned(QImage)') ) + self.connect( self.thread, SIGNAL('error(int)'), self, SIGNAL('error(int)') ) + self.thread.start() + +class ThreadedScan(QThread): + def __init__(self, parent=None): + QThread.__init__(self, parent) + self.resolution = 300 + self.duplex = False + + def run(self): + s = ScannerBackend() + s.setResolution( self.resolution ) + s.setDuplex( self.duplex ) + self.connect( s, SIGNAL('scanned(QImage)'), self.scanned, Qt.QueuedConnection ) + self.connect( s, SIGNAL('error(int)'), self, SIGNAL('error(int)'), Qt.QueuedConnection ) + s.scan() + s.close() + + def scanned(self, image): + # As we're now out of the thread, we create a new QImage + # object, otherwise the application will crash + self.emit( SIGNAL('scanned(QImage)'), QImage( image ) ) + diff --git a/NanScan/Backends/SaneBackend.py b/NanScan/Backends/SaneBackend.py new file mode 100644 index 0000000..6a02960 --- /dev/null +++ b/NanScan/Backends/SaneBackend.py @@ -0,0 +1,94 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +import sane +# PIL Module to convert PIL Image Object to QImage +import ImageQt +import common + +class SynchronousScanner(QObject): + + def __init__(self, parent=None): + QObject.__init__(self, parent) + sane.init() + self.resolution = 300 + self.duplex = False + + # Member of SynchronousScanner Interface + def listDevices(self): + # sane.get_devices() returns an structure like the following + # [('epson:libusb:001:004', 'Epson', 'GT-8300', 'flatbed scanner')] + return [x[0] for x in sane.get_devices()] + + # Member of SynchronousScanner Interface + def setResolution(self, value): + self.resolution = value + + # Member of SynchronousScanner Interface + def setDuplex(self, value): + self.duplex = value + + # Member of SynchronousScanner Interface + def scan(self, name=None): + if not name: + devices = self.listDevices() + if not devices: + self.emit( SIGNAL('error(int)'), common.ScannerError.NoDeviceFound ) + return + name = devices[0] + + try: + print "Trying to open device: ", name + source = sane.open( name ) + print "opened ", name + except: + print "error", name + self.emit( SIGNAL('error(int)'), common.ScannerError.CouldNotOpenDevice ) + return + + source.mode = 'color' + source.resolution = self.resolution + source.depth = 32 + + print "Multi scan" + iterator = source.multi_scan() + print "yea scan" + while True: + try: + print "Obtaining image..." + image = ImageQt.ImageQt( iterator.next() ) + print "Obtain" + res = float(self.resolution) * 1000 / 25.4 + image.setDotsPerMeterX( res ) + image.setDotsPerMeterY( res ) + self.emit( SIGNAL('scanned(QImage)'), image ) + except StopIteration, e: + # If StopIteration is raised, then there are no more images in + # the scanner + pass + except: + self.emit( SIGNAL('error(int)'), common.ScannerError.AcquisitionError ) + + # Member of SynchronousScanner Interface + def close(self): + pass + + +common.ScannerBackend = SynchronousScanner diff --git a/NanScan/Backends/TwainBackend.py b/NanScan/Backends/TwainBackend.py new file mode 100644 index 0000000..3119154 --- /dev/null +++ b/NanScan/Backends/TwainBackend.py @@ -0,0 +1,122 @@ +import twain, struct, string +from PyQt4.QtCore import * +from PyQt4.QtGui import * +#from common import * +import common + +class SynchronousScanner(QObject): + + def __init__(self, parent=None): + QObject.__init__(self, parent) + self.manager = None + self.source = None + self.resolution = 300 + self.duplex = False + + def stripNull(self, s): + offset = string.find(s, '\0') + if s != -1: + s= s[:offset] + return s + + # Member of SynchronousScanner Interface + def setResolution(self, value): + self.resolution = value + + # Member of SynchronousScanner Interface + def setDuplex(self, value): + self.duplex = value + + # Member of SynchronousScanner Interface + def listDevices(self): + manager = twain.SourceManager(0L) + fmtString = "L42sHH4s34s34s34s" + slen = struct.calcsize(fmtString) + self.identity = struct.pack("%ds" % slen, "") + + rv = manager.DSM_Entry(twain.DG_CONTROL, twain.DAT_IDENTITY, twain.MSG_GETFIRST, self.identity) + + l = [] + while rv == twain.TWRC_SUCCESS: + l.append( self.stripNull( self.identity[122:] ) ) + rv = manager.DSM_Entry(twain.DG_CONTROL, twain.DAT_IDENTITY, twain.MSG_GETNEXT, self.identity) + return l + + def open(self, name): + self.manager = twain.SourceManager( 0, ProductName=name ) + if not self.manager: + return + + if self.source: + self.source.destroy() + self.source=None + self.source = self.manager.OpenSource() + if self.source: + print "%s: %s" % ( name, self.source.GetSourceName() ) + + # Member of SynchronousScanner Interface + def scan(self, name=None): + if not name: + l = self.listDevices() + if not l: + print "No device found" + return common.ScannerError.NoDeviceFound + name = l[0] + + try: + self.open(name) + except: + return common.ScannerError.CouldNotOpenDevice + if not self.source: + return common.ScannerError.CouldNotOpenDevice + + try: + self.source.SetCapability( twain.ICAP_YRESOLUTION, twain.TWTY_FIX32, float(self.resolution) ) + self.source.SetCapability( twain.ICAP_XRESOLUTION, twain.TWTY_FIX32, float(self.resolution) ) + except: + print "Could not set resolution to '%s'" % self.resolution + pass + + try: + self.source.SetCapability( twain.CAP_DUPLEXENABLED, twain.TWTY_BOOL, bool(self.duplex) ) + except: + print "Could not set duplex to '%s'" % self.duplex + pass + try: + self.source.RequestAcquire(0, 0) + except: + return common.ScannerError.AcquisitionError + + while self.next(): + image = self.capture() + if not image: + return common.ScannerError.AcquisitionError + self.emit( SIGNAL('scanned(QImage)'), image ) + self.source = None + + def next(self): + try: + self.source.GetImageInfo() + return True + except: + return False + + def capture(self): + fileName = "tmp.tmp" + try: + (handle, more_to_come) = self.source.XferImageNatively() + except: + return None + twain.DIBToBMFile(handle, fileName) + twain.GlobalHandleFree(handle) + image = QImage( fileName ) + res = float( self.resolution ) * 1000 / 25.4 + image.setDotsPerMeterX( res ) + image.setDotsPerMeterY( res ) + return image + + # Member of SynchronousScanner Interface + def close(self): + del self.manager + +common.ScannerBackend = SynchronousScanner diff --git a/NanScan/Backends/__init__.py b/NanScan/Backends/__init__.py new file mode 100644 index 0000000..6d62383 --- /dev/null +++ b/NanScan/Backends/__init__.py @@ -0,0 +1,18 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + diff --git a/NanScan/Backends/twain.pyd b/NanScan/Backends/twain.pyd new file mode 100644 index 0000000000000000000000000000000000000000..917e18b42a01e3f49fc667de9e323744c8a80e32 GIT binary patch literal 90112 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 CE;1zXIpH+^;svnuGKH(>YF|7 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 d^{2v_06M6su literal 0 HcmV?d00001 diff --git a/NanScan/Barcode.py b/NanScan/Barcode.py new file mode 100644 index 0000000..3a26934 --- /dev/null +++ b/NanScan/Barcode.py @@ -0,0 +1,90 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +# Do not import everything as Template is defined in string too +from string import lower +import os +import tempfile +from TemporaryFile import * +from Analyzer import * + +class Box: + def __init__(self): + self.text = None + self.type = None + self.position = None + +class Barcode(Analyzer): + def __init__(self): + self.boxes = [] + + def parseBardecodeOutput(self, content): + # Sample output "818043376500 [type: ean13 at: (1798,936)]" + for line in content.splitlines(): + pieces = line.split( ' ' ) + box = Box() + box.text = lower(pieces[0]) + box.type = pieces[2] + pos = pieces[4].strip( '()]' ).split(',') + + x = float(pos[0]) / self.dotsPerMillimeterX + y = float(pos[1]) / self.dotsPerMillimeterY + box.position = QPointF( x, y ) + self.boxes.append( box ) + + def printBoxes(self): + for x in self.boxes: + print "Text: %s, Type: %s, Position: %f, %f" % (x.text, x.type, x.position.x(), x.position.y()) + + ## @brief Returns all barcode values concatenated for a given region of the image. + def textInRegion(self, region): + for x in self.boxes: + if region.contains(x.position): + return unicode(x.text) + # Always return unicode strings + return u'' + + ## @brief Returns the bounding rectangle of the text returned by textInRegion for + # the given region. + def featureRectInRegion(self, region): + rect = QRectF() + for x in self.boxes: + if region.contains(x.position): + rect = rect.united( QRectF( x.position, x.position ) ) + return rect + + ## @brief Scans the given image (QImage) looking for barcodes. + def scan(self, image): + # Clean boxes so scan() can be called more than once + self.boxes = [] + + # Obtain image resolution + image = QImage( image ) + self.dotsPerMillimeterX = float( image.dotsPerMeterX() ) / 1000.0 + self.dotsPerMillimeterY = float( image.dotsPerMeterY() ) / 1000.0 + + file = TemporaryFile.create() + image.save( file, 'PNG' ) + command = '/home/albert/d/git/exact-image-0.5.0/objdir/frontends/bardecode' + content = self.spawn( command, file ) + self.parseBardecodeOutput( content ) + self.printBoxes() + +Analyzer.registerAnalyzer( 'barcode', Barcode ) diff --git a/NanScan/DataMatrix.py b/NanScan/DataMatrix.py new file mode 100644 index 0000000..8b8a74e --- /dev/null +++ b/NanScan/DataMatrix.py @@ -0,0 +1,146 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +# Do not import everything as Template is defined in string too +from string import lower +import os +import tempfile +from TemporaryFile import * +from Analyzer import * + +class Box: + def __init__(self): + self.text = None + self.position = None + self.size = None + self.dataCodewords = None + self.errorCodewordsd = None + self.dataRegions = None + self.interleavedBlocks = None + self.rotationAngle = None + self.box = None + +class DataMatrix(Analyzer): + def __init__(self): + self.boxes = [] + + # Spawn process and return STDOUT + + def outputTextToPoint(self, text): + pos = text.strip('(').strip(')').split(',') + x = float(pos[0]) / self.dotsPerMillimeterX + y = float(pos[1]) / self.dotsPerMillimeterY + return QPointF( x, y ) + + def parseOutput(self, content): + # Each datamatrix is a line of the output + nextText = False + box = None + lines = content.splitlines() + for x in xrange(len(lines)): + line = lines[x] + if not box and line == ('-' * 50): + continue + + if not box: + box = Box() + self.boxes.append( box ) + + if nextText: + box.text = line + nextText = False + box = None + continue + if line == ('-' * 50): + nextText = True + continue + + key, value = line.split(':') + value = value.strip() + if 'Matrix Size' in key: + box.size = value + elif 'Data Codewords' in key: + box.dataCodewords = value + elif 'Error Codewords' in key: + box.errorCodewords = value + elif 'Data Regions' in key: + box.dataRegions = value + elif 'Interleaved Blocks' in key: + box.interleavedBlocks = value + elif 'Rotation Angle' in key: + box.rotationAngle = value + elif 'Corner 0' in key: + box.corner0 = self.outputTextToPoint( value ) + elif 'Corner 1' in key: + box.corner1 = self.outputTextToPoint( value ) + elif 'Corner 2' in key: + box.corner2 = self.outputTextToPoint( value ) + elif 'Corner 3' in key: + box.corner3 = self.outputTextToPoint( value ) + r1 = QRectF( box.corner0, box.corner1 ) + r2 = QRectF( box.corner2, box.corner3 ) + box.box = r1.united( r2 ) + + def printBoxes(self): + for x in self.boxes: + print "Text: '%s'; Position: %f, %f; Size: %f, %f;" % (x.text, x.box.x(), x.box.y(), x.box.width(), x.box.height() ) + + ## @brief Returns all data matrix values concatenated for a given region of the image. + def textInRegion(self, region): + texts = [] + for x in self.boxes: + if region.intersects(x.box): + texts.append( unicode(x.text) ) + + # Always return unicode strings + return u''.join( texts ) + + ## @brief Returns the bounding rectangle of the text returned by textInRegion for + # the given region. + def featureRectInRegion(self, region): + rect = QRectF() + for x in self.boxes: + if region.intersects(x.box): + rect = rect.united( x.box ) + return rect + + ## @brief Scans the given image (QImage) looking for barcodes. + def scan(self, image): + # Clean boxes so scan() can be called more than once + self.boxes = [] + + # Obtain image resolution + image = QImage( image ) + self.dotsPerMillimeterX = float( image.dotsPerMeterX() ) / 1000.0 + self.dotsPerMillimeterY = float( image.dotsPerMeterY() ) / 1000.0 + + file = TemporaryFile.create() + image.save( file, 'PNG' ) + command = 'dmtxread' + content = self.spawn( command, '-n', '-v', file ) + self.parseOutput( content ) + self.printBoxes() + +Analyzer.registerAnalyzer( 'dataMatrix', DataMatrix ) + +if __name__ == '__main__': + d = DataMatrix() + d.scan( '/tmp/ex3.png' ) + diff --git a/NanScan/Document.py b/NanScan/Document.py new file mode 100644 index 0000000..3f16704 --- /dev/null +++ b/NanScan/Document.py @@ -0,0 +1,33 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +class Document: + def __init__(self): + self.name = '' + self.template = None + self.boxes = [] + self.formatedText = None + + def addBox(self, box): + self.boxes.append( box ) + +class DocumentBox: + def __init__(self): + self.text = '' + self.templateBox = None + diff --git a/NanScan/Hamming.py b/NanScan/Hamming.py new file mode 100644 index 0000000..fe64d5f --- /dev/null +++ b/NanScan/Hamming.py @@ -0,0 +1,66 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from Translator import * + +## @brief This class calculates the Hamming distance between two strings. +# +# When two given characters differ completely they add 2 to the final distance +# between the strings. Two 'similar' characters (defined by the given translator +# or the default translator if none specified) will add 1 and 0 for two +# identical characters. +# +# This distinction of 'similar' and 'different' characters can be useful to +# 'correct' OCR defects. +class Hamming: + + ## @brief Calculates Hamming distance between two strings. Optionally a + # translator can be provieded. A default translator will be used if none + # specified. + @staticmethod + def hamming( text1, text2, translator = None ): + if not translator: + translator = Translator() + + transText1 = translator.translated( text1 ) + transText2 = translator.translated( text2 ) + + value = 0 + size = min(len(text1), len(text2)) + for i in range(size): + if text1[i] == text2[i]: + continue + if transText1[i] == transText2[i]: + value += 1 + continue + value += 2 + # Note that we need to multiply by 2 because 'errors' weight 2 + # and 'semi-errors' weight 1 + value += abs( len(text1) - len(text2) ) * 2 + return value + +if __name__ == '__main__': + print Hamming.hamming( 'si', '$l' ) + print Hamming.hamming( 'abc', 'abc' ) + print Hamming.hamming( 'abcabc', 'abc' ) + print Hamming.hamming( 'abcdef', 'abc' ) + print Hamming.hamming( 'abcdef', 'bcd' ) + print Hamming.hamming( 'bcdef', 'abc' ) + for x in range(10000): + Hamming.hamming( 'text de la plantilla', 'text llarg que pot ser del document que tractem actualment' ) + diff --git a/NanScan/Levenshtein.py b/NanScan/Levenshtein.py new file mode 100644 index 0000000..2dd0c8e --- /dev/null +++ b/NanScan/Levenshtein.py @@ -0,0 +1,65 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +# TODO: If available, wrap levenshtein C implementation + +class Levenshtein: + + @staticmethod + def levenshtein( text1, text2 ): + # Levenshtein distance if one string is empty, is the + # length of the other string, len(text) inserts. + if len(text1) == 0: + return len(text2) + if len(text2) == 0: + return len(text1) + + # Build array of len(text1) * len(text2) + d = [ [0] * len(text2) ] * len(text1) + + for i in range(len(text1)): + d[i][0] = i + + for j in range(len(text2)): + d[0][j] = j + + for i in range(len(text1)-1): + for j in range(len(text2)-1): + ip = i+1 + jp = j+1 + if text1[ip] == text2[jp]: + cost = 0 + else: + cost = 1 + + d[ip][jp] = min( + d[ip-1][jp] + 1, # deletion + d[ip][jp-1] + 1, # insertion + d[ip-1][jp-1] + cost # substitution + ) + return d[len(text1)-1][len(text2)-1] + +if __name__ == '__main__': + print Levenshtein.levenshtein( 'abc', 'abc' ) + print Levenshtein.levenshtein( 'abcabc', 'abc' ) + print Levenshtein.levenshtein( 'abcdef', 'abc' ) + print Levenshtein.levenshtein( 'abcdef', 'bcd' ) + print Levenshtein.levenshtein( 'bcdef', 'abc' ) + for x in range(10000): + Levenshtein.levenshtein( 'text de la plantilla', 'text llarg que pot ser del document que tractem actualment' ) diff --git a/NanScan/Ocr.py b/NanScan/Ocr.py new file mode 100755 index 0000000..01afdb8 --- /dev/null +++ b/NanScan/Ocr.py @@ -0,0 +1,373 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import os +# Do not import everything as Template is defined in string too +from string import lower +import codecs +import tempfile +import shutil +import math + +from TemporaryFile import * +from Analyzer import * + +from gamera.core import * +from PyQt4.QtCore import * +from PyQt4.QtGui import * + +class Character: + def __init__(self): + self.character = None + self.box = None + +def boxComparison(x, y): + if x.box.x() > y.box.x(): + return 1 + elif x.box.x() < y.box.x(): + return -1 + else: + return 0 + +## @breif This class allows using an OCR and provides several convenient functions +# regarding text and image processing such as deskewing or obtaining formated text. +class Ocr(Analyzer): + file = "" + + ## @brief Uses tesseract to recognize text of the current image. + def tesseract(self): + directory = tempfile.mkdtemp() + path = os.path.join( directory, 'tesseract' ) + self.spawn( 'tesseract', self.file, path, '-l', 'spa', 'batch.nochop', 'makebox' ) + f=codecs.open(path + '.txt', 'r', 'utf-8') + content = f.read() + f.close() + shutil.rmtree(directory, True) + return content + + ## @brief Uses cuneiform to recognize text of the current image. + def cuneiform(self): + directory = tempfile.mkdtemp() + path = os.path.join( directory, 'cuneiform' ) + os.spawnlpe(os.P_WAIT, '/home/albert/d/git/cuneiform/bin/cuneiform', '/home/albert/d/git/cuneiform/bin/cuneiform', self.file, path, '-l', 'spa', 'batch.nochop', {'LD_LIBRARY_PATH': '/home/albert/d/git/cuneiform/lib'} ) + f=codecs.open(path + '.txt', 'r', 'utf-8') + content = f.read() + f.close() + shutil.rmtree(directory, True) + return content + + ## @brief Parses tesseract output creating a list of Character objects. + def parseTesseractOutput(self, input): + output = [] + # Output example line: "w 116 1724 133 1736" + # Coordinates start at bottom left corner but we convert this into top left. + # Convert pixel coordinates into millimeters too. + for x in input.split('\n'): + if not x: + continue + line = x.split(' ') + x1 = int(line[1]) + x2 = int(line[3]) + y1 = self.height - int(line[2]) + y2 = self.height - int(line[4]) + width = x2 - x1 + height = y1 - y2 + + c = Character() + c.character = line[0] + + x1 = float(x1) / self.dotsPerMillimeterX + width = float(width) / self.dotsPerMillimeterX + y2 = float(y2) / self.dotsPerMillimeterY + height = float(height) / self.dotsPerMillimeterY + c.box = QRectF( x1, y2, width, height ) + output.append( c ) + return output + + ## @brief Returns the text of a given region of the image. + # It's the same as calling formatedText(). + def textInRegion(self, region): + return self.formatedText( region ) + + ## @brief Returns the bounding rectangle of the text returned by textInRegion for + # the given region. + def featureRectInRegion(self, region): + lines = self.textLinesWithSpaces( region ) + rect = QRectF() + for line in lines: + for c in line: + rect = rect.united( c.box ) + return rect + + ## @brief Uses ImageMagick's 'convert' application to convert the given image + # (QImage) into gray scale + def convertToGrayScale(self, image, output): + input = TemporaryFile.create( '.tif' ) + image.save( input, 'TIFF' ) + os.spawnlp(os.P_WAIT, 'convert', 'convert', '-type', 'grayscale', '-depth', '8', input, output) + + ## @brief Uses Gamera OTSU threashold algorithm to convert into binary + def convertToBinary(self, input, output): + image = load_image(input) + # Converting + img = image.to_greyscale() + # Thresholding + onebit = img.otsu_threshold() + # Saving for tesseract processing + onebit.save_tiff(output) + + ## @brief Scans the given image (QImage) with the OCR. + def scan(self, image): + self.image = image + self.width = self.image.width() + self.height = self.image.height() + self.dotsPerMillimeterX = float( self.image.dotsPerMeterX() ) / 1000.0 + self.dotsPerMillimeterY = float( self.image.dotsPerMeterY() ) / 1000.0 + + self.file = TemporaryFile.create('.tif') + self.convertToGrayScale(image, self.file) + + txt = lower( self.tesseract() ) + + self.boxes = self.parseTesseractOutput(txt) + + ## @brief Obtains top most box of the given list + def topMostBox(self, boxes): + top = None + for x in boxes: + if not top or x.box.y() < top.box.y(): + top = x + return top + + ## @brief Obtain text lines in a list of lines where each line is a list + # of ordered characters. + # Note that no spaces are added in this function and each character is a + # Character class instance. + # The algorithm used is pretty simple: + # 1- Put all boxes in a list ('boxes') + # 2- Search top most box, remove from pending 'boxes' and add in a new line + # 3- Search all boxes that vertically intersect with current box, remove from + # pending and add in the current line + # 4- Go to number 2 until all boxes have been processed. + # 5- Sort the characters of each line by the y coordinate. + def textLines(self, region=None): + # If we use 'if region:' instead of comparing with None + # rects with top (or left) >= bottom (or right), will return + # False and thus return _all_ boxes instead of _none_. + # Indeed, 'if region:' is equivalent to 'if region.isValid():' + if region != None: + # Filter out boxes not in the given region + boxes = [] + for x in self.boxes: + if region.intersects(x.box): + boxes.append(x) + else: + # Copy as we'll remove items from the list + boxes = self.boxes[:] + + lines = [] + while boxes: + box = self.topMostBox( boxes ) + boxes.remove( box ) + line = [] + line.append( box ) + toRemove = [] + for x in boxes: + if x.box.top() > box.box.bottom(): + continue + elif x.box.bottom() < box.box.top(): + continue + line.append( x ) + toRemove.append( x ) + + for x in toRemove: + boxes.remove( x ) + lines.append( line ) + + # Now that we have all boxes in its line. Sort each of + # them + for line in lines: + line.sort( boxComparison ) + return lines + + ## @brief This function is similar to textLines() but adds spaces between words. + # The result is also a list of lines each line being a list of Character objects. + def textLinesWithSpaces(self, region=None): + + lines = self.textLines( region ) + + # Now we have all lines with their characters in their positions. + # Here we write and add spaces appropiately. + # In order not to be distracted with character widths of letters + # like 'm' or 'i' (which are very wide and narrow), we average + # width of the letters on a per line basis. This shows good + # results, by now, on text with the same char size in the line, + # which is quite usual. + + for line in lines: + width = 0 + count = 0 + left = None + spacesToAdd = [] + words = [] + for c in line: + if left: + # If separtion between previous and current char + # is greater than a third of the average character + # width we'll add a space. + if c.box.left() - left > ( width / count ) / 3: + if spacesToAdd: + words.append( line[spacesToAdd[-1]:count] ) + spacesToAdd.append( count ) + + # c.character is already a unicode string + left = c.box.right() + width += c.box.width() + count += 1 + + # Try to find out if they are fixed sized characters + # We've got some problems with fixed size fonts. In some cases the 'I' letter will + # have the width of a pipe but the distance between characters will be fixed. In these + # cases it's very probable our algorithm will add incorrect spaces before and/or after + # the 'I' letter. This should be fixed by somehow determining if it's a fixed sized + # font. The commented code below tries to do just that by calculating distances within + # the letters of each word. We need to find out if something like this can work and + # use it. + #for x in words: + #dist = [] + #for c in range( len(x)-1 ): + #dist.append( x[c+1].box.center().x() - x[c].box.center().x() ) + #print 'Paraula: ', (u''.join( [i.character for i in x] )).encode( 'ascii', 'ignore') + #print 'Distancies: ', dist + + + # Reverse so indexes are still valid after insertions + spacesToAdd.reverse() + previousIdx = None + for idx in spacesToAdd: + c = Character() + c.character = u' ' + c.box = QRectF() + c.box.setTop( line[idx - 1].box.top() ) + c.box.setBottom( line[idx - 1].box.bottom() ) + c.box.setLeft( line[idx - 1].box.right() ) + c.box.setRight( line[idx].box.left() ) + line.insert( idx, c ) + return lines + + + ## @brief Returns the text in the given region as a string. Spaces included. + def formatedText(self, region=None): + lines = self.textLinesWithSpaces( region ) + texts = [] + text = u'' + for line in lines: + for c in line: + text += c.character + texts.append(text) + return u'\n'.join( texts ) + + ## @brief Calculates slope of text lines + # This value is used by deskew() function to rotate image and + # align text horitzontally. Note that the slope can be calculated + # by the text of only a region of the image. + # + # Algorithm: + # 1- Calculate textLines() + # 2- For each line with more than three characters calculate the linear + # regression (pick up slope) given by the x coordinate of the box and + # y as the middle point of the box. + # 3- Calculate the average of all slopes. + def slope(self, region=None): + # TODO: We should probably discard values that highly differ + # from the average for the final value to be used to rotate. + lines = self.textLines( region ) + slopes = [] + for line in lines: + if len(line) < 3: + continue + x = [b.box.x() for b in line] + y = [b.box.y()+ (b.box.height()/2) for b in line] + slope, x, y = linearRegression(x, y) + slopes.append( slope ) + if len(slopes) == 0: + return 0 + + average = 0 + for x in slopes: + average += x + average = average / len(slopes) + return average + + def deskewOnce(self, region=None): + slope = self.slope( region ) + transform = QTransform() + transform.rotateRadians( -math.atan( slope ) ) + self.image = self.image.transformed( transform, Qt.SmoothTransformation ) + + def deskew(self, region=None): + slope = self.slope( region ) + if slope > 0.001: + self.deskewOnce( self, region ) + slope = self.slope( region ) + if slope > 0.001: + self.deskewOnce( self, region ) + +Analyzer.registerAnalyzer( 'text', Ocr ) + +## @brief Initializes OCR functions that need to be executed once before the library +# can work. Currently only initiates Gamera which is not being used by now. +def initOcrSystem(): + init_gamera() + + +## @brief This function calculates the linearRegression from a list of points. +# Linear regression of y = ax + b +# Usage +# real, real, real = linearRegression(list, list) +# Returns coefficients to the regression line "y=ax+b" from x[] and y[], and R^2 Value +def linearRegression(X, Y): + if len(X) != len(Y): + raise ValueError, 'unequal length' + N = len(X) + if N <= 2: + raise ValueError, 'three or more values needed' + Sx = Sy = Sxx = Syy = Sxy = 0.0 + for x, y in map(None, X, Y): + Sx = Sx + x + Sy = Sy + y + Sxx = Sxx + x*x + Syy = Syy + y*y + Sxy = Sxy + x*y + det = Sxx * N - Sx * Sx + a, b = (Sxy * N - Sy * Sx)/det, (Sxx * Sy - Sx * Sxy)/det + meanerror = residual = 0.0 + for x, y in map(None, X, Y): + meanerror = meanerror + (y - Sy/N)**2 + residual = residual + (y - a * x - b)**2 + RR = 1 - residual/meanerror + ss = residual / (N-2) + Var_a, Var_b = ss * N / det, ss * Sxx / det + #print "y=ax+b" + #print "N= %d" % N + #print "a= %g \pm t_{%d;\alpha/2} %g" % (a, N-2, math.sqrt(Var_a)) + #print "b= %g \pm t_{%d;\alpha/2} %g" % (b, N-2, math.sqrt(Var_b)) + #print "R^2= %g" % RR + #print "s^2= %g" % ss + return a, b, RR + diff --git a/NanScan/Recognizer.py b/NanScan/Recognizer.py new file mode 100644 index 0000000..ab61fac --- /dev/null +++ b/NanScan/Recognizer.py @@ -0,0 +1,437 @@ +# coding=iso-8859-1 +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from PyQt4.QtCore import * +from Barcode import * +from Ocr import * +from DataMatrix import * + +from Analyzer import * +from Template import * +from Document import * +from Trigram import * +from Hamming import * +from Levenshtein import * +from Translator import * + +import tempfile + +class Analyze(QThread): + def __init__(self, analyzer, image, parent=None): + QThread.__init__(self, parent) + self.analyzer = analyzer + self.image = image + + def run(self): + self.analyzer.scan( self.image ) + +class Recognizer(QObject): + def __init__(self, parent=None): + QObject.__init__(self, parent) + self.analyzers = {} + for x in Analyzer.analyzers: + self.analyzers[x] = Analyzer.create(x) + self.ocr = self.analyzers['text'] + self.image = None + self.threads = [] + + ## @brief Returns the text of a given region of the image. + def textInRegion(self, region, type=None): + if type in self.analyzers.keys(): + return self.analyzers[type].textInRegion( region ) + else: + return None + + ## @brief Returns the bounding rectangle of the text returned by textInRegion for + # the given region. + def featureRectInRegion(self, region, type=None): + if type in self.analyzers: + return self.analyzers[type].featureRectInRegion( region ) + else: + return None + + def boxes(self, type): + if type in self.analyzers: + return self.analyzers[type].boxes + else: + return None + + def analyzersAvailable(self): + return self.analyzers.keys() + + # Synchronous + def recognize(self, image): + self.image = image + for analyzer in self.analyzers.values(): + analyzer.scan( image ) + #self.barcode.scan( image ) + #self.ocr.scan( image ) + + ## @brief Asynchronous: Starts analyzers in background threads. Emits finished() at the end + def startRecognition(self, image): + self.image = image + self.threads = [] + for analyzer in self.analyzers.values(): + thread = Analyze( analyzer, image, self ) + self.connect( thread, SIGNAL('finished()'), self.recognitionFinished ) + self.threads.append( thread ) + thread.start() + + def recognitionFinished(self): + print "THREAD FINISHED" + for thread in self.threads: + if thread.isRunning(): + return + self.emit( SIGNAL('finished()') ) + self.threads = [] + + def filter(self, value, filterType): + numeric = '0123456789' + alphabetic = 'abcçdefghijklmnñopqrstuvwxyz' + if filterType == 'numeric': + return u''.join( [x for x in value if x in numeric] ) + elif filterType == 'alphabetic': + return u''.join( [x for x in value if x in alphabetic] ) + elif filterType == 'alphanumeric': + return u''.join( [x for x in value if x in numeric+alphabetic] ) + elif filterType == 'none': + return value + else: + print "Filter type '%s' not implemented" % filterType + return value + + ## @brief Extracts the information of the recognized image using the + # given template. + # Optionally an x and y offset can be applied to the template before + # extracting data. + # Note that the image must have been scanned (using scan() or startScan()) + # before using this function. + def extractWithTemplate(self, template, xOffset = 0, yOffset = 0): + if not template: + return None + document = Document() + for templateBox in template.boxes: + if not templateBox.text: + continue + + rect = QRectF( templateBox.rect ) + rect.translate( xOffset, yOffset ) + + text = self.textInRegion( rect, templateBox.recognizer ) + text = self.filter( text, templateBox.filter ) + documentBox = DocumentBox() + documentBox.text = text + documentBox.templateBox = templateBox + document.addBox( documentBox ) + return document + + ## @brief Tries to find out the best template in 'templates' for the current + # image. + # Use the optional parameter 'offset' to specify up to how many millimeters + # the template should be translated to find the best match. Setting this to + # 5 (the default) will make the template move 5 millimeter to the right, + # 5 to the left, 5 to the top and 5 to the bottom. This means 121 positions + # per template. + # Note that the image must have been scanned (using scan() or startScan()) + # before using this function. + # + # TODO: Using offsets to find the best template is easy but highly inefficient. + # a smarter solution should be implemented. + def findMatchingTemplateByOffset( self, templates, offset = 5 ): + max = 0 + best = { + 'template': None, + 'document': Document(), + 'xOffset' : 0, + 'yOffset' : 0 + } + for template in templates: + if not template.boxes: + continue + # Consider up to 5 millimeter offset + for xOffset in range(-5,6): + for yOffset in range(-5,6): + score = 0 + matcherBoxes = 0 + currentDocument = self.extractWithTemplate( template, xOffset, yOffset ) + for documentBox in currentDocument.boxes: + templateBox = documentBox.templateBox + if documentBox.templateBox.type != 'matcher': + print "Jumping %s due to type %s" % ( templateBox.name, templateBox.type ) + continue + matcherBoxes += 1 + similarity = Trigram.trigram( documentBox.text, templateBox.text ) + score += similarity + score = score / matcherBoxes + if score > max: + max = score + best = { + 'template': template, + 'document': currentDocument, + 'xOffset' : xOffset, + 'yOffset' : yOffset + } + print "Template %s has score %s with offset (%s,%s)" % (template.name, score, xOffset, yOffset) + return best + + + ## @brief Tries to find out the best template in 'templates' for the current + # image. + # This algorithm starts by looking for template boxes of type 'matching' in the + # text and then looks if the relative positions of the new document and template + # boxes are similar. This is intended to be faster than exhaustive algorithm used + # in findMatchingTemplateByOffset(). + # + # Note that the image must have been scanned (using scan() or startScan()) + # before using this function. + # + # TODO: Using offsets to find the best template is easy but highly inefficient. + # a smarter solution should be implemented. + def findMatchingTemplateByText( self, templates ): + max = 0 + best = { + 'template': None, + 'document': Document(), + 'xOffset' : 0, + 'yOffset' : 0 + } + for template in templates: + if not template.boxes: + continue + # Find out template's offset + offset = self.findTemplateOffset( template ) + if not offset: + continue + + score = 0 + matcherBoxes = 0 + # Apply template with offset found + currentDocument = self.extractWithTemplate( template, offset.x(), offset.y() ) + for documentBox in currentDocument.boxes: + print "Applying..." + if documentBox.templateBox.type != 'matcher': + continue + templateBox = documentBox.templateBox + matcherBoxes += 1 + similarity = Trigram.trigram( documentBox.text, templateBox.text ) + score += similarity + score = score / matcherBoxes + print "Score: ", score + if score > max: + max = score + best = { + 'template': template, + 'document': currentDocument, + 'xOffset' : offset.x(), + 'yOffset' : offset.y() + } + return best + + ## @brief Returns a QPoint with the offset that needs to be applied to the given + # template to best fit the current image. + def findTemplateOffset( self, template ): + if not template.boxes: + return QPoint( 0, 0 ) + + lines = self.ocr.textLinesWithSpaces() + print "FORMATED: ", self.ocr.formatedText().encode( 'ascii', 'replace' ) + + # Create a default translator only once + translator = Translator() + + # This list will keep a pointer to each template box of type 'matcher' + matchers = [] + for templateBox in template.boxes: + if templateBox.type != 'matcher': + continue + + templateBoxText = templateBox.text.strip() + templateBox.ranges = Range.extractAllRangesFromDocument( lines, len(templateBoxText), templateBox.featureRect.width() + 2 ) + for ran in templateBox.ranges: + text = ran.text() + #value = Hamming.hamming( text, templateBoxText, translator ) + #value = 1.0 - Trigram.trigram( text, templateBoxText ) + value = Levenshtein.levenshtein( text, templateBoxText ) + ran.distance = value + #print "Comparison: '%s', '%s', '%f'" % (text.encode('ascii','ignore'), templateBoxText, value) + + #five = u'|'.join( [ x.text().encode('ascii','ignore') for x in templateBox.ranges[0:200] ]) + #print 'First five ranges: ', five + + templateBox.ranges.sort( rangeDistanceComparison ) + + for x in templateBox.ranges[0:20]: + print "Comparison: '%s', '%s', '%f'" % (x.text().encode('ascii','replace'), templateBoxText, x.distance) + + #five = u'|'.join( [ x.text().encode('ascii','ignore') for x in templateBox.ranges[0:10] ]) + #print 'First five ranges: ', five + + if templateBox.ranges: + bestRange = templateBox.ranges[0] + print "The best match for template box '%s' is '%s' with distance %d" % (templateBoxText, bestRange.text().encode('ascii','replace'), bestRange.distance ) + matchers.append( templateBox ) + + # Once we have all ranges sorted for each template box we search which + # range combination matches the template. + iterator = TemplateBoxRangeIterator( matchers ) + i = 0 + for ranges in iterator: + documentBoxCenter = ranges[0].rect().center() + templateBoxCenter = matchers[0].featureRect.center() + diff = documentBoxCenter - templateBoxCenter + #print "Difference: ", diff + #print "Document: ", documentBoxCenter + #print "Template: ", templateBoxCenter + found = True + for pos in range(1,len(ranges)): + documentBoxCenter = ranges[pos].rect().center() + templateBoxCenter = matchers[pos].featureRect.center() + d = documentBoxCenter - templateBoxCenter + # If difference of relative positions of boxes between + # template and document are bigger than 5mm we discard + # the ranges + #print "Difference in loop: ", d + #print "Document: %s, %s" % ( documentBoxCenter, ranges[pos].rect() ) + #print "Template: ", templateBoxCenter + #print "Comparison: %s --- %s" % (abs(d.x()) + 5.0, abs(diff.x() ) ) + if abs(d.x() - diff.x()) > 5: + found = False + break + if abs(d.y() - diff.y()) > 5: + found = False + break + if found: + break + i += 1 + if i > 1000: + break + if found: + return diff + else: + return None + + +class TemplateBoxRangeIterator: + def __init__(self, boxes): + self.boxes = boxes + self.pos = [0] * len(self.boxes) + self.loopPos = [0] * len(self.boxes) + self.added = None + + def __iter__(self): + return self + + def next(self): + result = [] + for x in range(len(self.boxes)): + result.append( self.boxes[x].ranges[ self.loopPos[x] ] ) + + #print '----' + #print (u', '.join( [x.text() for x in result] )).encode('ascii', 'replace') + #print self.pos + #print self.loopPos + if self.loopPos == self.pos: + # Search next value to add + value = float('infinity') + pos = 0 + for x in range(len(self.pos)): + if self.pos[x] >= len(self.boxes[x].ranges) - 1: + continue + if self.boxes[x].ranges[ self.pos[x] + 1 ].distance < value: + value = self.boxes[x].ranges[ self.pos[x] + 1 ].distance + self.added = x + # If value is Infinity it means that we reached the end + # of all possible iterations + if value == float('infinity'): + raise StopIteration + + self.pos[self.added] += 1 + self.loopPos = [0] * len(self.boxes) + self.loopPos[self.added] = self.pos[self.added] + else: + for x in range(len(self.loopPos)): + if x == self.added: + continue + if self.loopPos[x] < self.pos[x]: + self.loopPos[x] += 1 + break + return result + +def rangeDistanceComparison(x, y): + if x.distance > y.distance: + return 1 + elif x.distance < y.distance: + return -1 + else: + return 0 + +## @brief This class represents a group of characters in a document. +class Range: + def __init__(self): + self.line = 0 + self.pos = 0 + self.length = 0 + self.document = None + + ## @brief Returns a unicode string with the text of the current range + def text(self): + line = self.document[self.line] + chars = line[self.pos:self.pos + self.length] + return u''.join( [x.character for x in chars] ) + + ## @brief Returns the bounding rectangle of the text in the range + def rect(self): + line = self.document[self.line] + chars = line[self.pos:self.pos + self.length] + rect = QRectF() + for c in chars: + rect = rect.united( c.box ) + return rect + + ## @brief Returns a list with all possible ranges of size length of the + # given document + @staticmethod + def extractAllRangesFromDocument(lines, length, width=0): + if length <= 0: + return [] + ranges = [] + for line in range(len(lines)): + if length >= len(lines[line]): + ran = Range() + ran.line = line + ran.pos = 0 + ran.length = len(lines[line]) + ran.document = lines + #if width: + # while ran.rect().width() > width: + # ran.length -= 1 + ranges.append( ran ) + continue + for pos in range(len(lines[line]) - length + 1): + ran = Range() + ran.line = line + ran.pos = pos + ran.length = length + ran.document = lines + #if width: + # while ran.rect().width() > width: + # ran.length -= 1 + ranges.append( ran ) + return ranges + diff --git a/NanScan/ScanDialog.py b/NanScan/ScanDialog.py new file mode 100644 index 0000000..9fa59e4 --- /dev/null +++ b/NanScan/ScanDialog.py @@ -0,0 +1,192 @@ +from Scanner import * +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from PyQt4.uic import * +import gettext +import locale +import gc + +locale.setlocale(locale.LC_ALL, '') +gettext.bindtextdomain('nanscan', '.') +gettext.textdomain('nanscan') +gettext.install('nanscan', '.', unicode=1) + + + +class ImageItem(QListWidgetItem): + def __init__(self, parent=None): + QListWidgetItem.__init__(self, parent) + self.image = None + self.name = None + self.mark = None + + def setName(self, name): + self.name = name + + # Image should be a QImage + def setImage(self, image): + self.image = image + self.updateIcon() + + # Mark should be a QImage + def setMark(self, mark): + self.mark = mark + self.updateIcon() + + def updateIcon(self): + if not self.image or not self.mark: + return + + image = self.image.scaled( self.listWidget().iconSize(), Qt.KeepAspectRatio, Qt.SmoothTransformation ) + painter = QPainter( image ) + painter.drawImage( 5, 5, self.mark ) + painter.end() + self.setIcon( QIcon( QPixmap.fromImage( image ) ) ) + +class ScanDialog(QDialog): + def __init__(self, parent=None): + QDialog.__init__(self, parent) + + dir = os.path.abspath( os.path.dirname(__file__) ) + QResource.registerResource( os.path.join(dir,'common.rcc') ) + loadUi( os.path.join(dir,'ScanDialog.ui'), self ) + + self.connect( self.pushAccept, SIGNAL('clicked()'), self.accept ) + self.connect( self.pushScan, SIGNAL('clicked()'), self.scan ) + self.connect( self.pushDuplexScan, SIGNAL('clicked()'), self.duplexScan ) + self.uiList.setIconSize( QSize( 128, 128 ) ) + self.saving = QSemaphore() + self.setScanning( False ) + + # By default images are stored as files in + # the temporary directory. The application + # may choose to override the 'thread' propery + # with an appropiate SaveThreaded() subclass + self.saveClass = FileSaveThreaded + + def closeEvent(self, event): + if self.hasFinished: + event.accept() + else: + event.ignore() + + def setScanning(self, value): + self.scanning = value + self.updateAccept() + + def addSaving(self): + self.saving.release() + self.updateAccept() + + def removeSaving(self): + self.saving.acquire() + self.updateAccept() + + def updateAccept(self): + if self.scanning or self.saving.available(): + self.hasFinished = False + self.pushAccept.setEnabled( False ) + self.pushScan.setEnabled( False ) + self.pushDuplexScan.setEnabled( False ) + self.setCursor( Qt.BusyCursor ) + else: + self.hasFinished = True + self.pushAccept.setEnabled( True ) + self.pushScan.setEnabled( True ) + self.pushDuplexScan.setEnabled( True ) + self.unsetCursor() + + def scan(self): + self.setScanning( True ) + self.scan = Scanner(self) + self.scan.setDuplex( False ) + self.connect( self.scan, SIGNAL('scanned(QImage)'), self.scanned ) + self.connect( self.scan, SIGNAL('error(int)'), self.error ) + self.connect( self.scan, SIGNAL('finished()'), self.finished ) + self.scan.startScan() + + def duplexScan(self): + self.setScanning( True ) + self.scan = Scanner(self) + self.scan.setDuplex( True ) + self.connect( self.scan, SIGNAL('scanned(QImage)'), self.scanned ) + self.connect( self.scan, SIGNAL('error(int)'), self.error ) + self.connect( self.scan, SIGNAL('finished()'), self.finished ) + self.scan.startScan() + + def error(self, code): + if code == ScannerError.NoDeviceFound: + message = 'No device found' + elif code == ScannerError.CouldNotOpenDevice: + message = 'Could not open device' + elif code == ScannerError.AcquisitionError: + message = 'Error acquiring image' + else: + message = 'Unknown error' + self.setScanning( False ) + QMessageBox.critical( self, 'Scanning Error', message ) + + def scanned(self, image): + item = ImageItem( self.uiList ) + item.setImage( image ) + item.setMark( QImage( ':/images/images/save.png' ) ) + item.setName( 'scanned image ' + unicode( QDateTime.currentDateTime().toString() ) ) + item.setToolTip( _('Saving image...') ) + + self.uiList.addItem( item ) + + self.addSaving() + if self.saveClass: + thread = self.saveClass( self ) + thread.item = item + self.connect( thread, SIGNAL('finished()'), self.saved ) + thread.start() + + def finished(self): + self.setScanning( False ) + + def saved(self): + self.removeSaving() + thread = self.sender() + + if not thread.error: + thread.item.setMark( QImage( ':/images/images/ok.png' ) ) + thread.item.setToolTip( _('Image stored successfully') ) + else: + thread.item.setMark( QImage( ':/images/images/cancel.png' ) ) + thread.item.setToolTip( _('Error storing image') ) + + # Free memory used by the BIG image + thread.item.image = None + gc.collect() + + + +## @brief Base class for saving the image once scanned. +class SaveThreaded(QThread): + def __init__(self, parent=None): + QThread.__init__(self, parent) + self.item = None + self.error = True + +## @brief This class stores an image into a file in the directory +# specified by 'directory' (temporary directory by default). +class FileSaveThreaded(SaveThreaded): + directory = unicode( QDir.tempPath() ) + + def run(self): + self.error = True + d = QDir( FileSaveThreaded.directory ) + d.setSorting( QDir.Name ) + l = d.entryList( ['*.png'] ) + if l: + last = l[-1] + last = last.split('.')[0] + last = int(last) + else: + last = 0 + next = "%06d.png" % (last + 1) + next = os.path.join( FileSaveThreaded.directory, next ) + print "saving: ", next + if self.item.image.save( next, 'PNG' ): + self.error = False diff --git a/NanScan/ScanDialog.ui b/NanScan/ScanDialog.ui new file mode 100644 index 0000000..648a5b4 --- /dev/null +++ b/NanScan/ScanDialog.ui @@ -0,0 +1,77 @@ + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Scanner + + + + + + + 128 + 128 + + + + QListView::LeftToRight + + + true + + + QListView::Adjust + + + + + + + + + &Scan + + + + + + + Scan &Duplex + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + &Accept + + + + + + + + + + diff --git a/NanScan/Scanner.py b/NanScan/Scanner.py new file mode 100644 index 0000000..8482cd6 --- /dev/null +++ b/NanScan/Scanner.py @@ -0,0 +1,25 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +import os +from backends.common import * + +if os.name == 'nt': + from backends.twain_backend import * +else: + from backends.sane_backend import * + diff --git a/NanScan/Template.py b/NanScan/Template.py new file mode 100644 index 0000000..df1ed57 --- /dev/null +++ b/NanScan/Template.py @@ -0,0 +1,67 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from PyQt4.QtGui import * +from PyQt4.QtCore import * + +class Template(QObject): + def __init__(self, name): + QObject.__init__(self) + self.id = 0 + self.name = name + self.boxes = [] + + def addBox(self, box): + self.boxes.append( box ) + self.emit(SIGNAL('boxAdded(PyQt_PyObject)'), box) + + def removeBox(self, box): + self.boxes.remove( box ) + self.emit(SIGNAL('boxRemoved(PyQt_PyObject)'), box) + +class TemplateBox: + recognizers = ['text', 'barcode', 'dataMatrix'] + types = ['matcher','input'] + filters = ['none','numeric','alphabetic','alphanumeric'] + + def __init__(self): + self.rect = QRectF() + # Holds the rect where the actual text/barcode/whatever + # is found in the template + self.featureRect = QRectF() + self.recognizer = 'text' + self.type = 'matcher' + self.filter = 'none' + self.name = '' + self.text = '' + + def setType(self, value): + if value not in TemplateBox.types: + raise "Type '%s' not valid" % value + self._type = value + def getType(self): + return self._type + type=property(getType,setType) + + def setFilter(self, value): + if value not in TemplateBox.filters: + raise "Filter '%s' not valid" % value + self._filter = value + def getFilter(self): + return self._filter + filter=property(getFilter,setFilter) diff --git a/NanScan/TemporaryFile.py b/NanScan/TemporaryFile.py new file mode 100644 index 0000000..aab0bc6 --- /dev/null +++ b/NanScan/TemporaryFile.py @@ -0,0 +1,27 @@ +import tempfile +import os + +## @brief Simplify the task of creating and managing temporary files in a +# secure manner. +# +# Although python already provides functions for creating temporary files +# in nanscan we usually need only the filename and this is passed as a parameter +# to external applications such as convert or tesseract. Using those file names +# in this cases would still make the application vulnerable to race conditions +# so we need a temporary directory in which all such files are created. +# This class ensures this directory is created and one can savely manage temporary +# files. +class TemporaryFile: + directory = None + + ## @brief Creates a temporary file securely. + # If the temporary directory doesn't exist or has been deleted it's created. + # This will allow the user to remove the directory at 'almost' any time + # without breaking the application, though a way to easily remove temp files + # should be provided, probably. + @staticmethod + def create( suffix='' ): + if not TemporaryFile.directory or not os.path.exists( TemporaryFile.directory ): + TemporaryFile.directory = tempfile.mkdtemp() + fd, name = tempfile.mkstemp( suffix=suffix, dir=TemporaryFile.directory ) + return name diff --git a/NanScan/Translator.py b/NanScan/Translator.py new file mode 100644 index 0000000..219542a --- /dev/null +++ b/NanScan/Translator.py @@ -0,0 +1,65 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +import codecs +import os + +## @brief This class provides a simple way of converting similar characters +# to the same one. +# +# This can proof useful to overcome OCR errors and is used in Hamming class, +# for example. Default translation file provides families of characters. For +# example 's', 'S', '$' are in the same one because the OCR may sometimes +# recognize an 'S' as '$'. 'l', 'i' and '|' are in another family. +# +# The text 'eli a sa|de$' will be converted to 'ell a saldes'. The translator +# replaces any element of a family by the first character of the family it is in. +class Translator: + def __init__(self): + self.translations = None + + ## @brief Sets the translation list. + # + # The list should follow the following structure: [ 'sS$', 'li|', ... ] + def setTranslations(self, translations): + self.translations = translations + + ## @brief Loads the translation list from the given file. + # + # Each character family must be in a different line. See the default + # translations.txt file if you need an example. + def load(self, fileName): + f=codecs.open(fileName, 'r', 'utf-8') + if not f: + print "File not found" + return txt + self.translations = f.readlines() + f.close() + + ## @brief Returns the given text replacing each character with the first + # character of its family or itself if it's not in any character family. + def translated(self, text): + if self.translations == None: + self.load( os.path.join( os.path.abspath(os.path.dirname(__file__)), 'translations.txt' ) ) + + result = text + for x in self.translations: + for y in x[1:]: + result = result.replace( y, x[0] ) + return result + diff --git a/NanScan/Trigram.py b/NanScan/Trigram.py new file mode 100755 index 0000000..ea94663 --- /dev/null +++ b/NanScan/Trigram.py @@ -0,0 +1,95 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +class Trigram: + + # Returns a list of the trigrams of a sentence. That is, the list of + # all trigrams of each of the words in a string. Words are currently + # splitted by the space character only. + # Note that more than a list it's a sorted set. So there are no repeated items. + @staticmethod + def trigramList( text ): + words = text.split( ' ' ) + l = set() + for x in words: + for y in Trigram.wordTrigramList( x ): + l.add( y ) + l = list( l ) + l.sort() + return l + + # Calculates the list of trigrams contained in a word. If you feed + # this function with an string with spaces they'll be treated like + # normal characters. The usual trigram function is trigramList() which + # returns trigrams for all of it's words. + # Note that more than a list it's a sorted set. So there are no repeated items. + @staticmethod + def wordTrigramList( text ): + l = set() + size = len(text) + 1 + text = ' ' + text + ' ' + for x in range(size): + l.add( text[x:x+3] ) + l = list( l ) + l.sort() + return l + + # Calculates similarity between two strings using a trigram algorithm. + # This is based in PostgreSQL pg_trgm implementation. + # There's also a commented alternative for the final calculation of the + # distance. + @staticmethod + def trigram( text1, text2 ): + l1 = Trigram.trigramList( text1.lower() ) + l2 = Trigram.trigramList( text2.lower() ) + size1 = len(l1) + size2 = len(l2) + p1 = 0 + p2 = 0 + count = 0 + while p1 < size1 and p2 < size2: + if l1[p1] < l2[p2]: + p1 += 1 + elif l1[p1] > l2[p2]: + p2 += 1 + else: + p1 += 1 + p2 += 1 + count += 1 + + return float(count) / float( size1 + size2 - count ) + + # Here another way of calculating the similarity + #if size1 > size2: + #return float(count) / float( size1 ) + #else: + #return float(count) / float( size2 ) + + +if __name__ == '__main__': + print Trigram.trigramList( 'abc' ) + print Trigram.trigramList( 'abcabc' ) + print Trigram.trigramList( 'hola' ) + print Trigram.trigramList( 'adeu manelet' ) + + print Trigram.trigram( 'abc', 'abc' ) + print Trigram.trigram( 'abcabc', 'abc' ) + print Trigram.trigram( 'abcdef', 'abc' ) + print Trigram.trigram( 'abcdef', 'bcd' ) + print Trigram.trigram( 'bcdef', 'abc' ) diff --git a/NanScan/__init__.py b/NanScan/__init__.py new file mode 100644 index 0000000..6d62383 --- /dev/null +++ b/NanScan/__init__.py @@ -0,0 +1,18 @@ +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + diff --git a/NanScan/change-resolution.py b/NanScan/change-resolution.py new file mode 100755 index 0000000..e973e7b --- /dev/null +++ b/NanScan/change-resolution.py @@ -0,0 +1,43 @@ +#!/usr/bin/python +# Copyright (C) 2008 by Albert Cervera i Areny +# albert@nan-tic.com +# +# 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 2 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, write to the +# Free Software Foundation, Inc., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +import sys + +if len(sys.argv) != 3: + print "change-resolution.py resolution image" + print + print "Sets the resolution of the given image to the given value" + print "Example: ./change-resolution.py 300 image.png" + print + print "This utility has been created because images obtained with" + print "scanimage and scanadf sane utilities don't set resolution" + print "correctly." + sys.exit() + +# Convert resolution to dots per meter +resolution = float(sys.argv[1]) * 1000 / 25.4 +file = sys.argv[2] + +image = QImage( file ) +image.setDotsPerMeterX( resolution ) +image.setDotsPerMeterY( resolution ) +image.save( file ) diff --git a/NanScan/common.rcc b/NanScan/common.rcc new file mode 100644 index 0000000000000000000000000000000000000000..9891668020e6ce908b55bafe32571402a931d5af GIT binary patch literal 167687 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

occ$a$QGC_Sk-ia}&6lK&ZZCnEL6BdgiEruZ5w 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