準備する
私は平凡なことを掘り下げないようにしながら、最小限の頭痛でテセラクトを集めるために行う必要があるすべてを説明しようとします。
MinGWをインストールして構成する
プロジェクトの公式サイトから最新の利用可能なインストーラーをダウンロードしてインストールします。C++コンパイラーとMSYS Basicシステムを確認することを忘れないでください。 その後、MinGWシェルに移動し、次のコマンドを使用して、後で必要になる追加パッケージをインストールします。
mingw-get install mingw32-automake mingw32-autoconf mingw32-autotools mingw32-libz
MinGWが/ mingvにインストールされているディレクトリがマウントされていることに注意してください。これは、ライブラリを構築するときにも役立ちます。
Leptonicaライブラリをインストールする
Tesseract-ocrは、 イメージの操作にLeptonicaライブラリを使用します。 公式サイトから取得できるソースコードからビルドおよびインストールする方法について説明しますが、その前にlibJpeg 、 libPngおよびlibTiffライブラリをインストールする必要があります。また、ソースからのアセンブリです)。
LibJpegアセンブリ
公式サイトからソースコードアーカイブをダウンロードし、別のディレクトリに展開します(簡単にするために、これはD:\ lib \ jpegであると仮定します)。 MinGWシェルに戻り、手首を軽く振るだけで、デフォルトでgccが検索するディレクトリにライブラリをインストールします。 デバッグ文字の出力を無効にするためにフラグを再定義します。
cd /D/lib/jpeg
./configure CFLAGS='-O2' CXXFLAGS='-O2' --prefix=/mingw
make
make install
LibPngビルド
また、 プロジェクトページからソースコードアーカイブをダウンロードし、 D:\ lib \ pngディレクトリに展開します(もちろん、別のものを選択できます)。 MinGWシェルに戻り、libJpegの場合と同じことを繰り返します。
LibTiffビルド
推奨されるftpのソースコードを含むアーカイブを取得し、 D:\ lib \ tiffに解凍します。 そして、前の2つと同様に収集します。
レプトニカを構築
ソースコードのアーカイブはすでにあります。D:\ lib \ leptonicaに解凍してください。 そして、ファイルについて思い出す時が来ました。Zlibをサポートするアセンブリは小さなバグのため成功しませんが、それは自分で簡単に修正できます。 これを行うには、Leptonicaソースを解凍したディレクトリにあるsrc / pngio.cファイルを開きます。 そこで、 #include "png.h"行を見つけて、その後にディレクティブを挿入する必要があります。これにより、 次のようになります。
#include "png.h"
#ifdef HAVE_LIBZ
#include "zlib.h"
#endif
/* ----------------Set defaults for read/write options ----------------- */
その後、レプトニカと以前のライブラリを収集します。
Tesseract-ocrの組み立てとインストール
これで、必要な依存関係がすべて揃いました。 今回は、開発者のsvnトランクからソースをダウンロードします。
svn checkout ht tp://tesseract-ocr.googlecode.com/svn/trunk/ tesseract-ocr-read-only
* t間のスペースはHabraparser専用です。削除してください。
その後、再びファイルを取得し、ソースをD:\ lib \ tesseractにエクスポートしました。
tesseractのソースが置かれているディレクトリを基準としたファイルへのパスを記述します(私の場合はD:\ lib \ tesseractであることを思い出します)。
- ファイルccutil / platform.hを編集します。 すでにwinsock2.hにあるBLOB型の再宣言をコメントアウトする必要があります。 次のような結果になるはずです。
/*typedef struct _BLOB {
unsigned int cbSize;
char *pBlobData;
} BLOB, *LPBLOB;*/
- vs2008 / portから、 strtok_r.hおよびstrtok_r.cppファイルをccutilディレクトリにコピーし、 ccutil / Makefile.amファイルのlibtesseract_ccutil_la_SOURCES変数にstrtok_r.cppを追加します。
- api / baseapi.hの PBLOBクラスの宣言についてコメントします。
- api / Makefile.amファイルでは、 AM_CPPFLAGS変数に値-I $(top_srcdir)/ vs2008 / portを追加します
または単にvs2008 / port / version.hファイルをapiディレクトリにコピーします - 値-I $(top_srcdir)/ ccutilを 使用して、ファイルビューアー/ Makefile.amに変数AM_CPPFLAGSを追加します。
これらの操作の後、MinGW Shellに移動して、ライブラリの直接アセンブリを続行できます。
cd /D/lib/tesseract
./runautoconf
./configure CFLAGS='-D__MSW32__ -O2' CXXFLAGS='-D__MSW32__-O2' LIBS='-lws2_32' LIBLEPT_HEADERSDIR='/mingw/include' --prefix=/mingw
make
make install
彼が行く間、私はなんとかお茶を飲むことができ、 / mingw / include / tesseractに大量のヘッダーファイルを発見した後、 Leptonicaヘッダーファイルは/ mingw / include / leptonicaにあり 、すべてのライブラリは/ mingw / libに自然に現れました。
シンプルなアプリケーション
非常に小さいため、コード全体を提供します。
#include <stdio.h>
#include <string.h>
#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
int main(int argc, char* argv[]) {
tesseract::TessBaseAPI tessApi;
tessApi.Init("data", "rus");// data *.traineddata ,
// rus
if(argc > 1) {
PIX *pix = pixRead(argv[1]);// ,
// , Leptonica
tessApi.SetImage(pix);// tesseract,
char *text = tessApi.GetUTF8Text();//
//---
char *fileName = NULL;
long prefixLength;
const char* lastDotPosition = strrchr(argv[1], '.');
if(lastDotPosition != NULL) {
prefixLength = lastDotPosition - argv[1];
fileName = new char[prefixLength + 5];
strncpy(fileName, argv[1], prefixLength);
strcpy(fileName + prefixLength, ".txt\0");
} else {
exit(1);
}
//---
FILE *outF = fopen(fileName, "w");
fprintf(outF, "%s", text);
fclose(outF);
//---
pixDestroy(&pix);
delete [] fileName;
delete [] text;
}
return 0;
}
次のコマンドでアプリケーションをビルドできます。
g++ -O2 test.cpp -o test.exe -ltesseract_api -ltesseract_main -ltesseract_textord -ltesseract_wordrec -ltesseract_ccstruct -ltesseract_ccutil -ltesseract_classify -ltesseract_dict -ltesseract_image -ltesseract_viewer -ltesseract_cutil -ltesseract_cube -ltesseract_neural -llept -lws2_32
tesseractの現在のバージョンはDLLの作成をサポートしていないため、リンクは静的です。
おわりに
私自身の経験から、最も難しいことから始めることがわかっているので、特にTesseractのドキュメントが犯罪的に小さく、主なドキュメントはdoxygenを使用してソース自体から引き出すことができることを考えると、私の話が誰かに役立つことを願っています。
PS: この投稿で修正のためのいくつかのアイデアが収集されました。