AndroidでTesseractを使用する その5 一工夫編

前回までで、語レベルの認識範囲と認識された文字が取得できることが分かりました。最後に、文単位に、文の領域を描画するプログラムを考えてみます。

最初にどのようなデータ構造にすればいいか考えます。まず、文は語の集まりで、語ごとに領域が分かっているので、1文の領域には、複数の領域が含まれる事となります。これは、リストにしてしまいましょう。

また、1文が複数行に渡ることもあるので、1行に対してリストを用意するとわかりやすそうです。

さらに、複数の文が存在すると考えられますので、さらにリストにしてしまいます。

これに適当な名前(今回はrecognizedSentenceRectsPerLines)を付けることにします。

tessOCRAPI.getWords().getBoxRects()には語単位の領域が、tessOCRAPI.getTextlines().getBoxRects()には行単位の領域が含まれるので、
語の領域がどの行の領域に含まれるかを求めれば、改行したかどうかが分かりそうです。

ここでは、律儀に行の最初から領域を調べる関数を考えてみます。

あとは、語ごとにgetLineNumberContainsWord()の値を調べて、この値が変わった時点で改行されたことがわかるので、適当なテンポラリリストに行ごとの領域を追加していき、文の終わりが来たら、recognizedSentenceRectsPerLinesにテンポラリリストを追加していけば良いでしょう。ここでは簡単に、ピリオド、エクスクラメーションマーク、クエスチョンマーク、もしくは認識範囲に文字が含まれていない場合、文が終了したと判定します。

最後に、文ごとに適当に矩形で囲んでしまえば良いですね。

さて、上記コードを修正して実行した結果が次のとおりです。

131227

ではとりあえず、AndroidでTessearctを使うというトピックはこの辺で一区切りとします。