4.3.1 Text OCR ("tocr")
説明
Text OCRメソッド(コードThe Text OCR method (code "tocr")を使用すると、外部の光学式文字認識(OCR)エンジンを呼び出して、リモートデスクトップ画像からテキストを抽出できます。使用するOCRエンジンは、事前に環境設定で選択・設定しておく必要があります。Robot 5.xでは以下がサポートされています:
-
Tesseract OCRがデフォルトのエンジンです。無償で、主要なプラットフォーム(MS Windows、Linux/Unix、Mac OS X)すべてに対応しています。デメリットは、パフォーマンス(速度)と精度がやや劣る点です。
-
ABBYY Fine Readerは、追加費用が必要な商用のOCRエンジンです。Tesseractより高速かつ高精度ですが、MS Windowsのみに対応しています。
-
Google Visionは、OCRを実行するクラウドサービスです。デスクトップ画像は安全な接続(HTTPS)を介してGoogleのサイトにアップロードされるため、この方式を選択する前にプライバシーとセキュリティについてご検討ください。OCR処理は概して高速かつ高精度です。全体のパフォーマンスを左右する最大の要因はネットワーク速度です。
認識されたテキストは、text"(プレーンテキスト検索)、"text"、"distance"(あいまいテキスト検索)、または"pattern"(正規表現によるマッチング)の各パラメータを使用して、フレーズの有無を任意でテストできます。
正規表現マッチングは、認識されたテキストを指定されたjava.util.regex.Pattern準拠の正規表現と照合します。バージョン4.1.3までは、式はテキスト全体と一致する必要があり、部分文字列の検索は行われません。バージョン4.1.4では、一致する箇所を検索できるようになり、textパラメータと同様にその位置とテキストが返されるようになりました。
あいまい(ファジー)テキスト検索はレーベンシュタイン距離に基づいています。これは、ある文字列を別の文字列に変換するために必要な、挿入・削除・置換(1文字単位)の編集操作の最小回数として定義されます。この指標は"distance"パラメータによって有効になります。これは整数値で、"text"パラメータで指定されたサンプルテキストと同等とみなすために許容される、省略または誤認識される文字数の最大値を指定します。正規表現とは異なり、あいまいマッチングでは、指定されたテキストと距離に一致する文字列の出現箇所を、認識されたテキスト全体から常に検索します。その文字列の前後に他のテキストが続くかどうかを指定する必要はありません。
このメソッドは、OCRの結果をTOCRプレフィックス付きの変数群に格納します。内容は以下のとおりです:
|
変数名 |
説明 |
|---|---|
|
_TOCR_ERROR=<errorText> |
OCRエンジンがスローしたエラーテキストが格納されます。 |
|
_TOCR_TEXT=<text> |
認識されたテキスト(すべての行は改行文字で区切られます)。 |
|
_TOCR_TEXT_X=<X-coordinate>
|
認識されたテキストの境界矩形(バージョン3.4以降)。 |
|
_TOCR_LINE_COUNT=<number> |
認識されたテキストの行数。 |
|
_TOCR_LINE<n>=<lineText> |
n番目の行のテキストです。<n>は1から_TOCR_LINE_COUNTまでの値を取ります。 |
|
_TOCR_LINE_X<n>=<X-coordinate>
|
n番目の行の境界矩形(バージョン3.4以降)。 |
textまたはpatternパラメータを指定して認識されたテキストから該当する文字列を検索すると、このメソッドは次のような結果変数を作成します:
|
変数名 |
説明 |
|---|---|
|
_TOCR_MATCH_COUNT=<number> |
認識されたテキストの中でpattern
|
|
_TOCR_MATCH=<matchingString> |
最初に一致した文字列です。text が使用され、distanceが0に設定されている、または指定されていない場合、
|
|
_TOCR_MATCH_<n>=<matchingString> |
n番目に一致した文字列です。<n>は1から_TOCR_MATCH_COUNTまでの値です。
|
|
_TOCR_MATCH_INDEX=<index> |
認識されたテキスト内での最初の一致位置(インデックス)です。インデックスは0から始まり、
|
|
_TOCR_MATCH_INDEX_<n>=<index> |
n番目に一致した位置のインデックスです。<n>は1から_TOCR_MATCH_COUNTまでの値です。
|
|
_TOCR_MATCH_X=<X-coordinate>
|
最初に一致した文字列の境界矩形(バージョン3.4以降)。 |
|
_TOCR_MATCH_X_<n>=<X-coordinate>
|
n番目に一致した文字列の境界矩形です。<n>は1から
|
|
_TOCR_MATCH_CLICK_X=<X-coordinate>
|
最初に一致した文字列の中心座標です(バージョン3.4以降)。これは
|
|
_TOCR_MATCH_CLICK_X_<n>=<X-coordinate>
|
n番目に一致した文字列の中心座標です。<n>は1から
|
オプション
このメソッドはテンプレート画像を使用しません。「passrate」パラメータはOCRのコンテキストでは適用されず、無視されます。「cmparea」パラメータは省略可能で、省略した場合は画面全体がデフォルトになります。
サポートされるOCRパラメータ:
text=<textToSearchFor>
認識されたテキスト内で検索する対象の文字列を任意で指定します。指定した場合、OCRが正しく実行され、認識されたテキストに指定した文字列が含まれていれば0を、それ以外の場合は1を、呼び出し元のコマンドが返します。一致した位置のインデックスと画面座標は、_TOCRスクリプト変数に格納され、以降の処理に利用できます。このパラメータはpatternパラメータと同時に使用できません。
distance=<0-[textLength]>
「text」パラメータと組み合わせて使用する、任意のレーベンシュタイン距離です。これによりあいまいテキストマッチングが実行されます。詳細はメソッド仕様を参照してください。
pattern=<regularExpression>
任意で、java.util.regex.Pattern準拠の正規表現を指定し、認識されたテキストと照合します。このパラメータはtextパラメータと同時に使用できません。
-
-
バージョン4.1.3までは、この式はテキスト全体と一致する必要があります(部分文字列の検索は行われません)。
-
バージョン4.1.4以降では、このパラメータはtextパラメータと同様に一致箇所をテキスト内で検索します。一致したテキストの位置のインデックスと画面座標は_TOCRスクリプト変数に格納され、以降の処理に利用できます。この機能強化により、単一の「Click ocr」コマンド内で「一致するテキストの位置を検出してクリックする」といった処理を作成できるようになりました。
-
固有のパラメータの詳細については、Tesseract OCRのヘルプページを参照してください。
戻り値
このメソッドは、設定に誤りがある場合やI/Oエラーが発生した場合、呼び出し元のコマンドで実行時エラーをスローします。エラーの内容は_TOCR_ERROR変数で確認できます。
それ以外の場合、戻り値は入力パラメータによって異なります。結果のテストを行わずOCRのみを実行するようにメソッドが呼び出された場合、テキストが認識されなかった場合でも常に0を返します。メソッドが"text"または"pattern"パラメータを指定して呼び出された場合、認識されたテキストが指定した文字列または正規表現に一致すれば0を、一致しなければ1を返します。
使用例
Var _TOCR_LINE_COUNT=0
Compareto method="tocr" cmparea="x:33,y:2,w:200,h:22"
for (i=1; {i}<{_TOCR_LINE_COUNT}+1; i={i}+1) {
Typeline "{_TOCR_LINE{i}}"
}
- 指定したデスクトップ領域内のテキストを認識し、デスクトップに入力します。
Compareto method="tocr" cmparea="x:33,y:2,w:200,h:22" pattern="[aA]pplication"
if ({_EXIT_CODE} > 0) {
Exit 1
}
- 認識されたテキストが「Application」または「application」という単語と一致しない場合にスクリプトを終了します。
Compareto method="tocr" cmparea="x:33,y:2,w:200,h:22" pattern=".*[aA]pplication.*"
if ({_EXIT_CODE} > 0) {
Exit 1
}
- 前の例を変更し、認識されたテキストに「Application」または「application」が含まれない場合にスクリプトを終了するようにしたものです。
Compareto method="tocr" cmparea="x:33,y:2,w:200,h:22" text="apple" distance="2"
- 画面上のテキストを認識し、「apple」に類似した文字列を含んでいるかどうかを検証します:
-
OCRが「There is an apple」のようなテキストを認識した場合、完全に一致する文字列が見つかるため、コマンドは成功(終了コード0)を報告します。
-
OCRが「There is an Apple」のようなテキストを認識した場合、単語「Apple」は1文字の置換(A→a)で「apple」に変換でき、これは許容距離2の範囲内であるため、コマンドは成功を報告します。
-
OCRが「There are Appls」のようなテキストを認識した場合、単語「Appls」は(1)置換(A→a)と(2)追加(+e)または置換(s→e)の2操作で「apple」に変換でき、これは許容距離2の範囲内であるため、コマンドは成功を報告します。
-
OCRが「There is Doppler」のようなテキストを認識した場合、単語「Doppler」は1文字の置換(o→a)により「apple」に一致する文字列を含むことになるため、コマンドは成功を報告します。
-
OCRが「There are Appis」のようなテキストを認識した場合、単語「Appis」を「apple」に変換するには少なくとも3操作(A→a、i→l、s→e)が必要で、これは許容距離2を超えるため、コマンドは失敗(終了コード1)を報告します。
テキストが一致すると、テキスト内での一致位置のインデックスがTOCR_MATCH_INDEX変数に格納されます。インデックスは0から始まり、0はテキストの先頭を表します。一致した部分文字列は、さらに_TOCR_MATCH変数に保存されます。例えば、上記の例で認識されたテキストが_'There are Appls'の場合、_TOCR_MATCH=Appls および _TOCR_MATCH_INDEX=10 という変数が作成されます。