8

私は現在、AndroidでOCRをいじっています。そのため、カメラプレビュー付きの小さなアプリを作成し、onPreviewFrameメソッドからテセアラクトツール(tess-two)の画像をフィードしています。次に、OCRの境界レククルをカメラプレビューに表示します。TessBaseAPIは、文字/単語のブーディングボックスを返すメソッドを提供します。返されるオブジェクトのタイプは、tess-twoで提供されるレプトニカライブラリのように、Pixaです。

だから私の質問は:TessBaseAPIからgetCharacters()またはgetWords()によって返されたPixaオブジェクトからカメラプレビューにバウンディングボックスを描画するために使用できる使用可能な座標を取得するにはどうすればよいですか?

BaseAPIのGetCharacters()およびgetWords()

leptonicasPixaクラス

重要:

プレビューでサポートされている画像形式はYUVN21のみであり、tess-APIを読んだものとは異なり、ARGB_8888ビットマップが必要です。ビットマップをTessAPIにフィードする直前に、onPreviewFrameメソッドで次の回避策があります。カメラを縦向きで使用しているため、時計回りに90度回転しますが、カメラのプレビューフレームは横向きになります)

//byte[] bmpdata <- the image in a byte array (NV21 Imageformat) in onPreviewFrame 
YuvImage yuvimage = new YuvImage(bmpdata,ImageFormat.NV21,width,height,null); 

ByteArrayOutputStream outStream = new ByteArrayOutputStream();
Rect rect = new Rect(0, 0, width, height);
yuvimage.compressToJpeg(rect, 100, outStream);

Bitmap bmp = BitmapFactory.decodeByteArray(outStream.toByteArray(),0,outStream.size());

Matrix mtx = new Matrix();
mtx.preRotate(90);
bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mtx, false);
bmp = bmp.copy(Bitmap.Config.ARGB_8888, true);

TessTBaseApi.setImage(bmp);

つまり、基本的には、カメラから取得したNV21バイト[]をYuvImageに圧縮し、次にjpegに圧縮し、そこからビットマップに圧縮します。NV21アレイからbitmap/jpegを取得する方法についての解決策をウェブでたくさん検索しましたが、これは私が見つけた最も簡単な方法でした。このビットマップは、テッセラクトツールOCRに送られます。これは私の2番目の質問に私をもたらします:

これらの圧縮と90度の回転の後、画面上のボックスを描画する必要がある場所をどのように特定しますか?(圧縮と回転の前と比較して)

これは、OCRにライブフレームを提供するための最良の方法または良い方法ではない可能性があります。コメント、他の解決策、または最適化の方法の提案に感謝します。

私は2日前にこのプロジェクトを開始し、androidとocrのプログラミングの非常に初心者です。この2日間、このページは私を大いに助け、これまでの質問に非常によく答えてくれたので、それをありがとう、そして私の現在の問題を手伝ってくれてありがとう。より多くのコードを見たい、または質問がある場合は、私が提供し、私ができることなら何でも答えて喜んでいます。

ご挨拶

PixaクラスとGetCharacters()リンクを介してgithubでAPIソースコード全体を参照できますが、これ以上ハイパーリンクを挿入することはできません。

4

1 に答える 1

14

TessTBaseApi.getWords().getBoxRects()ビットマップに相対的な座標を持つバウンディングボックスRectsbmpのArrayListを返します。

于 2012-07-14T18:36:38.460 に答える