Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】Google Cloud Vision APIを使った画像の文字認識テクニック

従来、Delphiで画像ファイル内の文字を認識するためには
海外のサードパーティ製コンポーネントを使用する方法が一般的でした。
それらは海外製ということもあり日本語に強くはありませんでした。

一方、文字認識自体はGoogleやLINE等で技術革新が進んでおり、
これらの技術をDelphiから利用することも可能になっています。

今回はGoogleのWeb APIをDelphiから呼び出して、
画像ファイル内の文字認識(OCR = Optical Character Recognition)を行う手順を紹介します。

 

Cloud Vision APIキーの取得

今回はGoogleの「Cloud Vision API」を使用します。
Cloud Vision API では、PC内のローカル画像を対象にして、
RESTで画像をbase64として送信できます。
その後、JSONで返ってきた文字認識の結果を取り出すことができます。

準備として、Cloud Vision APIを使用するためのAPIキーを取得する必要があります。

以下のサイトにアクセスし、Google Cloudのアカウントを作成します。
既にアカウントをお持ちの場合はログインします。

Vision AI: 画像とビジュアル AI ツール | Google Cloud

Cloud Vision API の利用登録を行い、APIキーを作成します。
(詳細な手順は日々変わる可能性があるため、本記事では割愛します。)

 

OCRロジックの実装

Cloud Vision の APIキーを取得できたら、Delphi側の実装に移ります。
今回はローカルの画像を送信して、結果をMemoに表示するサンプルを作成していきます。

Delphiを起動したらプロジェクトを新規作成し、
新規フォームにTEdit・TMemo・TButtonを配置します。
(今回はEdit1・Memo1・Button1)

  • Edit1:送信する画像ファイルのパス指定用。
  • Memo1:受信した結果から取得した文字列セット用。
  • Button1:処理実行ボタン。

処理に必要なユニットを認識させるため、
System.NetEncoding, System.JSON, System.IOUtils, System.Net.HttpClientComponent
の4つをuses節に追加します。

OCRのメイン処理と呼び出し処理として、それぞれ以下のようにロジックを記述します。

メイン処理は「OCR_Image」関数にまとめ、
画面側の処理はButton1のクリック時処理としています。
「OCR_Image」関数の引数にAPIキーも含めています。

{*******************************************************************************
 目的 : OCRメイン処理
 引数 : AFileName - 文字認識させたい画像ファイルのフルパス
        AApiKey   - Cloud VisionのAPIキー
 戻値 : レスポンスJSONから取得した認識後の文字列
*******************************************************************************}
function OCR_Image(const AFileName, AApiKey: string): string;
var
  Http: TNetHTTPClient;
  ReqStream, ResStream: TStringStream;
  ImgBytes: TBytes;
  Base64Img: string;
  JsonReq: TJSONObject;
  JsonRes: TJSONObject;
  Responses: TJSONArray;
  FirstResponse: TJSONObject;
  FullText: TJSONObject;
begin
  Result := '';

  // ファイルをバイト列として読み込む
  ImgBytes := TFile.ReadAllBytes(AFileName);
  Base64Img := TNetEncoding.Base64.EncodeBytesToString(ImgBytes);

  // リクエストJSON作成
  JsonReq := TJSONObject.Create;
  try
    JsonReq.AddPair(
      'requests',
      TJSONArray.Create(
        TJSONObject.Create
          .AddPair(
            'image',
            TJSONObject.Create.AddPair('content', Base64Img)
          )
          .AddPair(
            'features',
            TJSONArray.Create(
              TJSONObject.Create.AddPair('type', 'TEXT_DETECTION')
            )
          )
      )
    );

    ReqStream := TStringStream.Create(JsonReq.ToString, TEncoding.UTF8);
  finally
    JsonReq.Free;
  end;

  ResStream := TStringStream.Create('', TEncoding.UTF8);
  Http := TNetHTTPClient.Create(nil);
  try
    // リクエスト実行
    Http.Post(
      'https://vision.googleapis.com/v1/images:annotate?key=' + AApiKey,
      ReqStream,
      ResStream
    );

    // レスポンスJSON取得
    JsonRes := TJSONObject.ParseJSONValue(ResStream.DataString) as TJSONObject;
    try
      Responses := JsonRes.GetValue<TJSONArray>('responses');
      if (Responses <> nil) and (Responses.Count > 0) then
      begin
        FirstResponse := Responses.Items[0] as TJSONObject;

        FullText := FirstResponse.GetValue<TJSONObject>('fullTextAnnotation');
        if FullText <> nil then
          Result := FullText.GetValue<string>('text');
      end;
    finally
      JsonRes.Free;
    end;
  finally
    Http.Free;
    ReqStream.Free;
    ResStream.Free;
  end;
end;
{*******************************************************************************
 目的 : 処理実行ボタン押下時処理
 引数 :
 戻値 :
*******************************************************************************}
procedure TForm1.Button1Click(Sender: TObject);
var
  Text: string;
begin
  // エクスプローラからコピペした際の""を除去
  Edit1.Text := StringReplace(Edit1.Text, '"', '', [rfReplaceAll]);
  // ファイルの存在チェック
  if not(FileExists(Edit1.Text)) then
  begin
    ShowMessage('指定されたファイルが存在しません。');
    Abort;
  end;

  // 関数実行
  Text := OCR_Image(Edit1.Text, 'YOUR_API_KEY'); // 取得したAPIキーを引数にセット
  // 戻り値の取得文字列をMemoにセット
  Memo1.Lines.Text := Text;
end;

 

使用イメージ

たとえば例として、
以下の写真データを文字認識させてみたいと思います。
(以前のこちらの記事のサムネイル写真の加工前データです)

(原寸大で見るにはここをクリック

 
アプリケーションをコンパイルして起動したのち、
画像のフルパスを指定して、Button1(取り込みボタン)を押してみると……

この通りです。
日本語もバッチリ取得できています。

画像内の位置より取得結果の文字の順番は順不同ですが、
これぐらいの粗さの活字であれば誤字なく読み取ることが可能です。

 
<取得結果 全文>


MIGARO
TECHNICAL
REPORT
ミガロ テクニカルレポート
No.1
2008年秋
MIGARO.
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.5
2012年秋
MIGARO
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.10
2017年秋
MIGARO.
TECHNICAL
REPORT
She
N
MIGARO.
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.11
2018年秋
MIGARO.
TECHNICAL
REPORT
ミカロテクニカルレポート
No.2
2009年秋
MIGARO
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.7
2014年秋
MIGARO.
TECHNICAL
REPORT
ミガロ、テクニカルレポート
MIGARO.
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.4
2011年秋
No.3
2010:
MIGARO
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.8
2015年秋
MIGARO.
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.9
2016年秋
MIGARO
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.12
2019年秋
MIGARO.
TECHNICAL
REPORT
ミガロ、テクニカルレポート
No.13
2020年秋
MIGARO TECHNICAL REPORT 2024 NO.17 . ALL
MIGARO.
TECHNICAL
REPORT
2021
ミガロ、テクニカルレポート2021年
No.14
株式会社 ミガロ.
MIGARO.
TECHNICAL
REPORT
2022
ミガロ、テクニカルレポート2022年
NO.15
株式会社 ミガロ.
MIGARO.
TECHNICAL
REPORT
2023
NO.16
ミガロ テクニカルレポート2023年
株式会社 ミガロ.
MIGARO.
TECHNICAL
REPORT
2024
ミガロ テクニカルレポート 2024年
NO.17
株式会社 ミガロ.

 

Google APIのトークン消費量は気になりますが、
ヘルプによれば、2026年4月現在、月あたり最初の1,000枚が無料枠になるとのこと)
こちらのロジックを使えばDelphiによる文字認識がぐっと便利になるかと思います。
ぜひご活用ください。

 

補足事項