文字認識編では、getUTF8Text()関数によって認識した文字列が取り出せると書きましたが、この文字列は半角スペースによって語が区切られています。しかし、ノイズが乗ってしまった場合であるとか、日本語のような単語の区切りがない語を扱う場合には、単純に半角スペースで区切ったものと、認識範囲を取得するで使用したgetBoxRects()関数による矩形と、一対一で対応させることができなくなります。
そこで、getUTF8Text()関数ではない、他の関数を使うことになります。
tess-twoには、ResultIteratorというクラスが用意されています。これはその名前の通り、認識結果を取り出すイテレータのクラスです。では、このクラスを使ったコードの例を下に挙げてみます。
1 2 3 4 5 6 7 8 |
// Wordごとに文字を認識する int level = PageIteratorLevel.RIL_WORD; ResultIterator itr = tessOCRAPI.getResultIterator(); do{ String word = itr.getUTF8Text(level); Log.d("Word",word); } while(itr.next(level)); |
2行目でlevelという変数に何かを与えていますが、これは、イテレーションの単位です。RIL_WORDなら語単位、RIL_TEXTLINEなら行単位、RIL_SYMBOLなら文字単位となります。
あとは、イテレータを回すだけですが、hasNextにあたる関数がないので、itr.next(level)の値がnullになるまで、do-whileで回すようにしました。なお、next関数によってイテレータのヘッドが1つ動くので、ループの終了判定は最後に持って行くと綺麗に書くことが出来ます。
さてこれで、認識した語と認識した位置を取得することが出来ました。最後に、文単位で矩形を分けるコードを書いてみたいと思います。