Python から OCRソフト Tesseract を利用する

Python から Tesseract を利用するための python モジュールが以下のサイトにおいて公開されている。
python wrapper class for tesseract OCR (Linux & Mac & Cygwin)
http://code.google.com/p/python-tesseract/

プログラム例はこんなに短い!

# -*- coding: utf-8 -*-
#from __future__ import print_function

import tesseract
api = tesseract.TessBaseAPI()
api.SetOutputName("outputName");
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)

mImgFile = "eurotext.jpg"
mBuffer=open(mImgFile).read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result

Tesseract のバージョン

tesseract 3.00 の環境において python-tesseract モジュールを build すると,「publictypes.h (だったかな?) が見つからない」と怒られる。このファイルは tesseract 3.01 (まだリリース前?)に含まれているため,svn を用いて取得しなければならない。具体的には,http://code.google.com/p/tesseract-ocr/wiki/ReadMe にて説明されているように,以下のコマンドで取ってこれる。

svn checkout http://tesseract-ocr.googlecode.com/svn/trunk/ tesseract-ocr-read-only

また,以下に述べるように,Ubuntu ではレポジトリ "ppa:nutznboltz/tesseract" を設定することで,3.01 相当の tesseract を入手可能なようだ。

python-tesseract モジュールのインストール

python-tesseract のコンパイル方法を説明しているページ http://code.google.com/p/python-tesseract/wiki/HowToCompilePythonTesseract に沿ってインストール作業を進める。

以下はインストール時のログである。

最初に,パッケージを利用した tesseract のインストール:

$ sudo add-apt-repository ppa:nutznboltz/tesseract
$ sudo apt-get update
$ sudo apt-get install tesseract-ocr-dev leptonica python-all-dev swig
........................
........................
........................
python-all-dev (2.7.1-0ubuntu5) を設定しています ...
leptonica (1.68-1~ppa3~natty1) を設定しています ...
tesseract-ocr-eng (3.0.0+svn581-1~ppa2~natty1) を設定しています ...
tesseract-ocr (3.0.0+svn581-1~ppa2~natty1) を設定しています ...
tesseract-ocr-dev (3.0.0+svn581-1~ppa2~natty1) を設定しています ...

上記で明らかなように,言語データは "english" のみインストールされる "jpn (Japan)" 言語データは 3.00のソースから引っ張ってくればよいのかな?(未調査)

(忘れないようにメモ) leptonica は,tesseract にて JPG や PNG を扱えるようにするために必要なソフトウェアである。

次に python-tesseract のコンパイルとインストール:

$ python config.py
$ python setup.py clean
include path=/usr/include
Current Version : 0.6
running clean
$ python setup.py build
include path=/usr/include
Current Version : 0.6
running build
running build_py
file tesseract.py (for module tesseract) not found
file tesseract.py (for module tesseract) not found
running build_ext
building '_tesseract' extension
swigging tesseract.i to tesseract_wrap.cpp
swig -python -c++ -I/usr/include/tesseract -I/usr/include -I/usr/include/leptonica -o tesseract_wrap.cpp tesseract.i
/usr/include/tesseract/publictypes.h:73: Warning(462): Unable to set dimensionless array variable
creating build
creating build/temp.linux-i686-2.7
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I. -I/usr/include/tesseract -I/usr/include -I/usr/include/leptonica -I/usr/include/python2.7 -c tesseract_wrap.cpp -o build/temp.linux-i686-2.7/tesseract_wrap.o
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I. -I/usr/include/tesseract -I/usr/include -I/usr/include/leptonica -I/usr/include/python2.7 -c main_dummy.cpp -o build/temp.linux-i686-2.7/main_dummy.o
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
main_dummy.cpp: In function ‘int readBuf(const char*, l_uint8*)’:
main_dummy.cpp:51:21: warning: ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’, declared with attribute warn_unused_result
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I. -I/usr/include/tesseract -I/usr/include -I/usr/include/leptonica -I/usr/include/python2.7 -c fmemopen.c -o build/temp.linux-i686-2.7/fmemopen.o
creating build/lib.linux-i686-2.7
g++ -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions build/temp.linux-i686-2.7/tesseract_wrap.o build/temp.linux-i686-2.7/main_dummy.o build/temp.linux-i686-2.7/fmemopen.o -lstdc++ -ltesseract_api -llept -o build/lib.linux-i686-2.7/_tesseract.so
$ 
$ sudo python setup.py install
include path=/usr/include
Current Version : 0.6
running install
running build
running build_py
copying tesseract.py -> build/lib.linux-i686-2.7
running build_ext
running install_lib
copying build/lib.linux-i686-2.7/tesseract.py -> /usr/local/lib/python2.7/dist-packages
copying build/lib.linux-i686-2.7/_tesseract.so -> /usr/local/lib/python2.7/dist-packages
byte-compiling /usr/local/lib/python2.7/dist-packages/tesseract.py to tesseract.pyc
running install_egg_info
Writing /usr/local/lib/python2.7/dist-packages/python_tesseract-0.6.egg-info
$ 

(メモ) tesseract パッケージの install 時に「python2.6-dev が要る」と言われてインストールしたが,python-tesseract のインストール 先は python2.7 の dist-package だった(python のシンボリックリンク先が python2.7 になっているから?)。まぁ,いいか。

とりあえず,上記の方法で python-tesseracrt モジュールをインストールでき,サンプルプログラムも動いた。付属の eurotext.jpg (ユーロ圏の文字集合)の読み取りも良好(これは tesseract の能力だが・・・)。

残された課題は,日本語の言語データは tesseract 3.00 のやつを持ってくればよいのか? という問題のみ。