はじめに
以前、Tesseract OCR を使う記事を書きました。
これは v4 用のラッパーを使ったものでした。
リンク先の記事中にも書いていたのですが (現在はこの記事へのリンクへ差し替えました)、v5 用の Delphi 用ラッパーが別にあるので、今回はこちらを使ってみます。
Tesseract OCR v5
Tesseract OCR v5 の Windows 用インストーラーはリリースページにあるのですが、64bit 版しかありません。つまりは Delphi も 64bit コンパイラを使う必要があります。
32bit 版を使いたい場合には、マンハイム大学図書館提供のものを DL できます。
Tesseract OCR のインストール
インストーラーを実行します。
途中で追加オプションが選択できるので日本語関連を追加しておきます。
Tesseract OCR v5 ラッパーの使い方
v5 ラッパーの使い方です。
一式 DL したら、Source フォルダをライブラリパスに加えておきましょう。プロジェクトに追加するのが手っ取り早いかもしれません。
デモプログラムが入っていますが、ビルドするにはどうやら TMS の有償コンポーネントが必要なようです。面倒なので、最小限のコードを次に示します。
program ocr_test;
{$APPTYPE CONSOLE}
uses
System.Classes, System.SysUtils, System.IOUtils,
TesseractOCR, TesseractOCR.capi;
begin
var TesseractPath := 'C:\Program Files (x86)\Tesseract-OCR\';
var OCR := TTesseractOCR5.Create(TesseractPath); // Tesseract (DLL) へのパス
try
if OCR.Initialize( // 初期化
TPath.Combine(TesseractPath, 'tessdata' + PathDelim), // 学習データへのパス
'eng') then // 認識言語 (学習データ)
begin
OCR.SetImage('eng-text.png'); // ファイル名 (TBitmap や TStream からも読み込める)
Write(OCR.RecognizeAsText); // 認識した文字列を返す
ReadLn;
end;
finally
OCR.Free;
end;
end.
パスの末尾にはパスデリミタが必要です。
実行結果は次のようになります。
認識言語の指定方法
Initialize() で eng を指定していますが、日本語が必要な場合には jpn を、さらに縦書きも認識させたい場合には jpn+jpn_vert を指定してください。インストーラーで学習済みデータを取得していなければ使えません。
ページセグメンテーションモード(PSM: Page Segmentation Mode)の指定
ページセグメンテーションモード(PSM: Page Segmentation Mode)の定数は tesseractocr.capi で定義されています。
| 定数 | 値 | 説明 |
|---|---|---|
| PSM_OSD_ONLY | 0 | 向きおよび文字体系の検出(OSD)のみ。 |
| PSM_AUTO_OSD | 1 | OSD による自動ページ分割。 |
| PSM_AUTO_ONLY | 2 | 自動ページ分割(OSD および OCR なし)。(未実装) |
| PSM_AUTO | 3 | 完全自動ページ分割(OSD なし)。(デフォルト) |
| PSM_SINGLE_COLUMN | 4 | サイズが変動する単一のテキスト列とみなす。 |
| PSM_SINGLE_BLOCK_VERT_TEXT | 5 | 縦方向に揃えられた単一の均一なテキストブロックとみなす。 |
| PSM_SINGLE_BLOCK | 6 | 単一の均一なテキストブロックとみなす。 |
| PSM_SINGLE_LINE | 7 | 画像を単一のテキスト行として扱う。 |
| PSM_SINGLE_WORD | 8 | 画像を単一の単語として扱う。 |
| PSM_CIRCLE_WORD | 9 | 画像を円の中に収まった単一の単語として扱う。 |
| PSM_SINGLE_CHAR | 10 | 画像を単一の文字として扱う。 |
| PSM_SPARSE_TEXT | 11 | 散在するテキスト。順不同で可能な限り多くのテキストを検出する。 |
| PSM_SPARSE_TEXT_OSD | 12 | OSD を含む散在するテキスト。 |
| PSM_RAW_LINE | 13 | 生の行。Tesseract 固有のハックをバイパスして、画像を単一のテキスト行として扱う。 |
設定するには PageSegMode プロパティを使います。
OCR.PageSegMode := PSM_SINGLE_CHAR; // 単一文字モード
OCR.PageSegMode := PSM_SINGLE_BLOCK; // 単一ブロックモード
OCR エンジンの指定
OCR エンジンを必要に応じて切り替えることが出来ます。
| 値 | 説明 |
|---|---|
| 0 | オリジナルの Tesseract のみ |
| 1 | ニューラルネット LSTM のみ |
| 2 | Tesseract + LSTM |
| 3 | デフォルト。状況に応じて使い分ける |
設定するには SetVariable メソッドを使います。
OCR.SetVariable('tessedit_ocr_engine_mode', '0');
ホワイトリストの指定
ホワイトリストを設定するには SetVariable メソッドを使います。下記の例では数字のみを認識します。
OCR.SetVariable('tessedit_char_whitelist', '0123456789');
「数字のみ認識する」というのは、例えば olz345 のように誤認識されたものは 345 になってしまいます。つまり、誤認識を除外する設定であり、「必ず 0~9 のいずれかで認識させる」というものではありません。
ブラックリストもあります。
OCR.SetVariable('tessedit_char_blacklist', '@|');
おわりに
v5 であっても Tesseract OCR とそのラッパーを使うのは難しくありません。
難しいのは認識精度を上げる方法です。




