光学文字認識との作業
テスト中のシステム(SUT)でテキストを探す必要があり、テキストの画像をキャプチャすることが実際的ではない場合、Eggplant FunctionalやSenseTalkの光学文字認識(OCR)機能を頼りにすることができます。OCRは、動的なテキストを検索する場合に最も役立ちますが、他にも多くの実用的な用途が見つかるかもしれません。
このページで説明されているOCRの概念、およびOCRで使用されるテキストプロパティを理解するために時間をかけることを強くお勧めします。これにより、OCR検索に適切な調整を行い、テスト環境でより良い検索結果を得ることができます。
OCRで成功するために:最も一般的なOCRプロパティの使用
SenseTalkには、状況や環境に合わせてOCR検索をカスタマイズできるテキストプロパティがいくつか含まれています。カスタマイズされたOCR検索を使用すると、検索の信頼性が向上し、最良の結果を得ることができます。OCRプロパティの完全なリスト、およびテキストの読み取りとテキストの検索にどのプロパティを使用できるかについての情報については、テキストプロパティを参照してください。
OCR検索をカスタマイズするためにプロパティを使用する場合、使用するプロパティとその数を慎重に考えることが重要です。検索が機能しない場合、プロパティを追加し続けることは魅力的に思えますが、それが常に最善の方法ではありません。時にはプロパティを削除する必要があります。まず個々のプロパティを試し、必要に応じてプロパティを追加します。OCRチューナーを使用してプロパティを試し、何が機能するかを確認します。OCR検索のトラブルシューティングについての詳細は、OCRのトラブルシューティングを参照してください。
以下の各方法は、OCRの認識を改善したり、検索を高速化したりするために使用されるかもしれません。詳細については、OCR検索の速度を向上させるを参照してください。
Search Rectangles
ほぼ常に、検索矩形を追加することは有用で、OCRが検索する画面の一部を制限します。OCRが全画面を検索すると、それは遅くなるだけでなく、余分な可能性のある一致が出たり、全く一致しない可能性があるため、正確性も低下します。
検索矩形は通常、画像を使用して定義されますが、座標もこのプロパティに渡すことができます。キャプチャした画像のホットスポットが使用されるポイントを定義します(このポイントを移動する方法については、ホットスポットの使用を参照してください)。
画像を使用することは理想的です。なぜなら、SUTスクリーン上の要素が異なる場所に表示されるときに、矩形の位置を動的にすることができるからです。例えば、テキストが常にSUTスクリーンの同じ位置に表示されないウィンドウに表示されるかもしれません。そのウィンドウにアイコンがあるかもしれません。そのアイコンの画像をキャプチャし、それを画像定義の検索矩形のアンカーとして使用することができます。
画像を使用して検索矩形を設定することができない場合は、画面座標を使用することができます。ビューワーウィンドウのCursor Locationツールバーアイコンは、この作業に役立ちます。なぜなら、それはSUT上のマウスの現在位置を示しているからです。ビューワーウィンドウのツールバーをカスタマイズする方法については、Customize the Toolbarを参照してください。
例:ウェブサイトから動的なテキストを読み取る
Google Financeページに移動し、特定の会社を検索し、その後株価を読み取るテストがあるかもしれません。OCRが価格の値を確実に、そして他の何ものでもなく読み取るために、画像を使用して検索矩形を定義することができます。使用されるコードは次のようにシンプルになります:
Log ReadText ("TLImage","BRImage")
上記のコードを動作させるためには、2つの画像をキャプチャする必要があります。この例では、画像TLImage
とBRImage
を使用して、検索矩形の左上と右下の角を定義しました。これらの画像をキャプチャするために、OCRが読み取るテキストに対して安定した画面の要素を1つ以上選択します。
この例では、画面の単一の要素である「会社」ラベルを使用しています。
TLImage
は、「会社」ラベルの画像で、ホットスポットが株価が表示されるエリアの左上の角に移動されています。
キャプチャエリアを移動せずに、ホットスポットを株価が表示されるエリアの右下の角に移動してBRImage
をキャプチャします。
画像をキャプチャし、SenseTalkコードを書いた後、上記の例はGoogle Financeの任意の会社の株価を正常に読み取ることができます。
"TLImage"と"BRImage"は、OCRを使用した成功したReadText()検索のための検索矩形を設定するために使用されます。
コントラスト
このプロパティは、Eggplant Functionalが黒と白のみを視覚するようにします。 ContrastColor
(背景色)として使用されている色は白になり、それ以外のすべてのものは黒になります。白地に黒文字の場合、コードは次のようになります:
Click (Text: "hello", Contrast:On, ContrastColor: White, ValidCharacters: "hello", Searchrectangle: ("UpperLeftImage", "LowerRightImage"))
この状況では、白に近い各ピクセル(標準許容範囲の45以内)が白に変わり、それ以外のすべてが黒として読み取られます。これはOCRがテキストをより明瞭に読み取るのに役立ちます。
実際に見えるのは、アンチエイリアシングの影響を受けないこの画像です。
コントラストオン時のOCRが見るもの
Contrast
設定を使用してOCRエンジンに送られるテキスト画像を確認するには、OCR Tunerパネルを使用します。このパネルには、コントラスト関連の設定の任意の組み合わせ(EnhanceLocalContrastを除く)で、OCRエンジンに認識のために送られるものを表示するライブディスプレイがあります。
灰色の背景(または中程度の値の別の色)のテキストを探す場合、少し複雑になることがあります。 ContrastTolerance
を少し低く設定する(20程度まで)と、OCRが白に変えようとするピクセルの数が減ります。上の画像では、"hello"の"h"と"e"の間のピクセルが黒に変わり、2つの文字が連結しています。この状況では、OCRはまだ文字を読むことができましたが、他の状況では、これがOCRが文字を処理するのをより難しくする可能性があります。これが、スクリプト全体を実行する前に試してみることが常に良い考えである理由です。
Click (Text:"hello", Contrast:On, ContrastColor: White, ContrastTolerance: 20)
Contrast
検索でContrastColor
が設定されていない場合、デフォルトでは検索領域の左上隅のピクセルの色になります。
背景色の決定
背景/コントラストの色がわからない場合、任意のプラットフォーム上の特定の位置の背景色のRGB値を見つけるための2つの方法があります。
方法1:カラーピッカー(Mac)を使用する
カラーピッカーを使用するには、以下の手順を実行します:
-
リモート画面ウィンドウのツールバーのFind Textアイコンをクリックします。これでテキスト検索パネルが開きます。
-
テキストまたは背景色のボックスをクリックします。Colorsシステムパネルが表示されます。
-
カラーピッカーのアイドロッパーアイコンをクリックし、テキストまたは背景の上にカーソルを移動し、コントラスト色の設定に使用したい色を選択します。アンチエイリアシングのピクセルを選択しないように注意してください。
カラーピッカーを使用してMacでコントラストカラーを見つける
方法2: ColorAtLocation()
関数を使用する
ColoratLocation()
functionを使用するには、以下の手順を実行します:
- ライブモードでビューアウィンドウを開きます。Cursor Locationツールバーアイコンがすでにツールバーにない場合は、ツールバーのカスタマイズを参照してください。
- 次に、
ColorAtLocation
関数を使用します。 - RGBカラー値が必要な背景上にマウスを移動します。
- SUT上のマウスの座標を使用して、Cursor Locationツールバーボタンのフィールドに表示される、このコードラインを実行ウィンドウの下部にあるアドホックdoボックス(AHDB)またはスクリプトから実行します:
put colorAtLocation(x,y) // where (x,y) refers to the coordinates found in the remote screen window
このコードラインを実行すると、指定した位置の色のRGB値が返されます。
ローカルコントラストの強調
OCRエンジンに送信されるテキスト画像のローカルコントラストを自動的に上げたい場合は、このプロパティを有効にします。このプロパティは、読まれているテキストの一部または全部が比較的低いコントラストを持っている場合、たとえば暗い背景上の青色のテキストなど、認識を助ける可能性があります。コントラストがオンになっていると、このプロパティは効果がないため、コントラスト
がオフの場合にのみ有用です。
Log ReadText(("TLImage","BRImage"), enhanceLocalContrast: On)
ValidCharacters
およびValidWords
ValidCharacters
とValidWords
プロパティは、OCRが返す内容を制限します。これには、一致と見なす内容、テキストを読み取るときに返す内容が含まれます。
これらのプロパティに渡す値はOCRに優先されます。本質的に、OCRが何を探しているのかヒントを与えています。たとえば、ValidWords:"cat"
を設定し、SUTスクリーンに"oat"という単語が表示されると、OCRはそれを"cat"と読むことがあります。
ValidCharacters
ValidCharactersプロパティは、OCRにどのグリフを探し、どのグリフを無視するかを伝えます。たとえば、OCRが文字“O”を数字“0”と誤読したり、その逆をしたりするのを防ぐために使用できます。これは、スクリプトの最適な制御のために手動で行うことができます。または、アスタリスク(*)を使用して自動的にvalidCharacters
を検索対象のテキストに設定することができます。
ValidCharacters
は、テキストを事前に知らない状況でテキストを読むときや、文字セットを制限する必要があるときに最も役立ちます。たとえば、お金を扱うときに数字と文字を区別するのに使用できます。
例
//ValidCharacters を手動で設定する:
Log ReadText[("TLImage","BRImage"], ValidCharacters:"$£€.,0123456789") -- 通貨記号を含む数値を読み取る
//変数と一緒にValidCharactersを使用する:
Put "Charlie" into MyText
Click (Text: MyText, ValidCharacters: MyText)
//アスタリスクを使用してValidCharactersを検索対象のテキストに設定する:
Click (Text:"CoDe13v9065", ValidCharacters:"*", SearchRectangle:("UpperLeftImage","LowerRightImage"))
ValidWords
ValidWords
プロパティはValidCharacters
に似ていますが、有効とされる文字だけでなく、それらの文字の配置も強制します。これがValidWords
が特定のフレーズを検索するときによく使用される理由です。
ValidWords
は、ValidWords
に提供された単語のみを含む新しい言語ライブラリを基本的に作成するため、設定されたLanguage
プロパティをオーバーライドします。
例:
Put "Charlie Brown" into mytext
Click (text: mytext, searchRectangle:("RT1","RT2"), validwords:mytext)
OCRに無視することを伝える
OCRの使用はすべて、テキスト検索に適切なプロパティをOCRに提供することに関連しています。 これらのプロパティのほとんどは、OCRが何を認識するべきかに向けるのが一般的ですが、場合によっては、誤った結果から逃れるために何を認識しないかを伝えることでそれを逸らす方が良いです。 以下のプロパティは、テキストを扱うときにOCRが無視するべきものを具体的に伝えます。
Ignore Spaces
テキスト検索のプロパティとして、IgnoreSpaces
はその名の通り、検索内のスペースを無視するために使用できます。 たとえば、このアプロー チは、文字間のスペースが一貫していないシナリオで役立つ可能性があります。 OCRは、存在しない場所にスペースがあると見ることがありますし、存在する場所のスペースを無視することがあります。 IgnoreSpaces
プロパティをON
に設定すると、OCRは"flowerpot"を"flower pot"と一致させ、その逆も同様です。 このプロパティを使用すると、OCRは検索している文字列と見つけた文字列の両方からスペースを取り除き、一致を見つけます。
Click (Text:"flower pot", validCharacters:"*", ignoreSpaces:ON, searchRectangle:("UpperLeftImage","LowerRightImage"))
Ignore Underscores
ignoreUnderscores
プロパティにより、OCRテキスト検索はアンダースコアをスペースとして扱います。 たとえば、文字列"My_Computer"は"My_Computer"または"My Computer"と一致します。 OCRエンジンがアンダースコアを認識できないことがあるため、ignoreUnderscores
プロパティはデフォルトでオンになっています。
Click (Text:"My_Computer", validCharacters:"*", ignoreUnderscores:ON, searchRectangle:("UpperLeftImage","LowerRightImage"))
改行無視
改行は、ラインブレイクを作成するリターンキャラクターの一種です。 有効にすると、ignoreNewlines
はOCRテキスト検索がラインブレイクを無視するようにし、したがって検索は複数の行にまたがって壊れている文字列でも一致します。 このプロパティはテキスト検索にのみ利用可能であり、ReadText
では利用できません。
Click(Text:"Constantine Papadopoulos",IgnoreNewlines:On)-- このように長い名前の場合、テスト対象のアプリケーションのインターフェースで2行目に折り返す可能性がありますが、OCRはIngoreNewlinesを有効にするとそれを読むことができます。
CaseSensitive
CaseSensitive
プロパティは、OCRがテキストを認識するときにケースを考慮するかどうかを決定します。 OCRを使用して検索しているテキスト文字列の大文字小文字を検証したい場合、このプロパティを有効にしてテキスト検索がケースを尊重し、検索文字列の大文字小文字の正確な一致のみを見つけるように強制します。 このプロパティは検索専用で、ReadText
では使用できません。
例:
Put "COUPON13995a" into Coupon
MoveTo(Text:Coupon,CaseSensitive:Yes)
ValidPattern
このプロパティは、正規表現の値を取り、指定されたパターンと一致する文字または単語のみを返します。 SenseTalkで使用できる正規表現文字については、Using Patterns in SenseTalkを参照してください。 パターンを好むが必要としない場合は、PreferredPatternを参照してください。
パターンを使用したい場合は数多くあります。 1つの例は、SUT上の日付から時間を検索したり読み取ったりするときです。
例
Log ReadText(("RT1","RT2"), validPattern:"[0-9][0-9]:[0-9][0-9]") -- SUT画面から時間を読み取ります。
put formattedTime("[m]/[d]/[year]") into today -- formats today's date according to the pattern provided to formattedTime()
Click (Text:Today, SearchRectangle:("TL_Date","BR_Date"), validPattern:"[0-9]/[0-9]/[0-9][0-9][0-9][0-9]") -- SUT画面に存在する日付をクリックして、日付と時間のパネルを開きます。この例でvalidPatternに渡されるパターンで読み取られる日付形式は1/4/2020になります。
言語指定
Language
を使用すると、指定された言語または複数の言語 のテキストを検索できます。言語を指定する必要はありません。しかし、言語を設定すると、OCRにガイドを提供します。なぜなら、それは提供された辞書または辞書で指定された単語を優先するからです。
Eggplant Functionalにはデフォルトで多数の言語が利用可能で、追加の言語を購入することもできます。サポートされている言語のリストについては、OCR Language Support.をご覧ください。また、現在の辞書を上書きまたは変更するプロパティを使用して、カスタムOCR辞書を作成することもできます。
例
同じ文に異なる言語の文字が含まれている場合、複数の言語を指定できます。
SUTに表示されるテキストの文字列:
//料理4出6「です。")
多言語の文字を読むために使用されたSenseTalkコード:
ReadText((475,179,608,212), Language:"Japanese,English")
OCRエンジン辞書のカスタマイズ
テキスト読取り関数を使用する際には、OCRエンジンが興味のあるテキストを見つけるのを助けるために、OCR辞書をカスタマイズできます。SenseTalkには、OCR辞書から単語を追加または削除するためのreadText
関数呼び出しのオプションまたはテキストプロパティリストとして使用できるプロパティがいくつか含まれています:
- ExtraWords: このプロパティを現在の言語の組み込み辞書を補完する単語のリストに設定します。
- PreferDictionaryWords: このプロパティを有効にすると、OCRエンジンに、可能な限り辞書で定義された単語として各単語を読むように指示します。適切な辞書の単語が見つからない場合、エンジンは各文字の最善の解釈を使用して非辞書の単語を返します。
- PreferredWords: このプロパティを現在の言語の組み込み辞書を補完する単語のリストに設定します 。
PreferredWords
はテキストの読取りまたは検索に使用できます。このプロパティはOCR辞書を修正します。詳細については、OCR辞書のカスタマイズをご覧ください。 - ProhibitedWords: このプロパティを認識から除外する単語のリストに設定します。エンジンがこれらの単語のように見える何かを見つけた場合、異なる単語を得るために文字の異なる解釈にフォールバックします。詳細については、ProhibitedWordsをご覧ください。
- ValidWords: このプロパティを設定して、OCRテキストエンジンが見つけることができる単語を決定します。
validWords
プロパティはLanguage
プロパティを上書きします。 - **ValidPatternおよびPreferredPattern**も
Language
を置き換えますが、特定の単語の代わりにパターンを使用します。
上記のすべてのプロパティは相互排他的です。OCRコマンドのインラインにこれらのうち1つ以上を設定しないでください。
これらのプロパティは、スクリプト全体または特定のコマンドに対して設定できます:
// スクリプト全体の単語リストを設定
set the readTextSettings to (extraWords:"ean carner")
put readText(rect, PreferDictionaryWords:yes, prohibitedWords:"can carrier tap")
// 単一のコマンドに単語リストを設定
set rect to the RemoteScreenRectangle
put readText(rect, extraWords:"ean carner", PreferDictionaryWords:yes, prohibitedWords:"can carrier")
上記のコードの両方のバージョンでは、「can」と「carrier」を禁止単語として設定し、それらを辞書から実質的に削除します。また、「ean」と「carner」を新しい辞書の単語として追加します。この例では、OCRエンジンが画面上の個々の文字に対する自身の最善の解釈を無視し、見ているものから辞書の単語を作り出すために、個々の文字のあまりありそうでない解釈にフォールバックするように強制します。
ExtraWords
プロパティはカスタムOCR辞書を作成し、上記の例に示すように、コマンドごとにまたはスクリプト全体に提供することができます。また、所望の単語をリストする外部ファイルを使用して、スクリプト全体のExtraWords
辞書を設定することもできます:
extraWords 辞書をスクリプト内の ReadText() の任意のインスタンスに適用します
readTextSettings を {ExtraWords:file ResourcePath("OCR-Dictionary.txt")} に設定します。
外部ファイルを使用して、個々のコマンドの単語リストを指定します。
readTextSettings を {ExtraWords:file ResourcePath("OCR-Dictionary.txt")} に設定します。
外部データファイルを使用する場合、ファイルは各単語間にセパレータがある形式でフォーマットされていなければならず、それはスペース(ホワイトスペース)文字または改行文字とすることができます。
テキストスタイルの使用
あなたのテストシナリオに適したプロパティセットを選択したら、それをテキストスタイルとして保存するオプションがあります。テキストスタイルは、Eggplant Functionalのテキスト設定