1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Delphi から Tesseract OCR エンジンを使う (v5)

1
Last updated at Posted at 2026-09-01

はじめに

以前、Tesseract OCR を使う記事を書きました。

これは v4 用のラッパーを使ったものでした。

リンク先の記事中にも書いていたのですが (現在はこの記事へのリンクへ差し替えました)、v5 用の Delphi 用ラッパーが別にあるので、今回はこちらを使ってみます。

Tesseract OCR v5

Tesseract OCR v5 の Windows 用インストーラーはリリースページにあるのですが、64bit 版しかありません。つまりは Delphi も 64bit コンパイラを使う必要があります。

32bit 版を使いたい場合には、マンハイム大学図書館提供のものを DL できます。

Tesseract OCR のインストール

インストーラーを実行します。

image.png

途中で追加オプションが選択できるので日本語関連を追加しておきます。

image.png

image.png

Tesseract OCR v5 ラッパーの使い方

v5 ラッパーの使い方です。

一式 DL したら、Source フォルダをライブラリパスに加えておきましょう。プロジェクトに追加するのが手っ取り早いかもしれません。

デモプログラムが入っていますが、ビルドするにはどうやら TMS の有償コンポーネントが必要なようです。面倒なので、最小限のコードを次に示します。

ocr_test.dpr
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.

パスの末尾にはパスデリミタが必要です。

実行結果は次のようになります。

image.png

image.png

認識言語の指定方法

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 とそのラッパーを使うのは難しくありません。
難しいのは認識精度を上げる方法です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?