Android OCR tesseract:使用Pixa对象的数据显示边界框

时间:2012-07-14 12:51:48

标签: java android ocr preview tesseract

我目前在Android上玩OCR。因此,我写了一个带有Camera预览的小应用程序,现在我正在从onPreviewFrame方法中提供tessearact工具(tess-two)图像。现在我想在我的Camera Preview上显示来自OCR的边界矩形。 TessBaseAPI提供返回字符/单词bouding框的方法。返回对象的类型是Pixa,就像在lessonica库中提供的tess-two一样。

所以我的问题是:如何我得到它,我可以用它来借鉴从PIXA我的相机预览的边框对象从TessBaseAPI getCharacters()或getWords()返回可用坐标

GetCharacters() and getWords() in the BaseAPI

leptonicas Pixa class

重要提示:

由于所述预览仅支持的图像格式是YUV N21和从我已阅读苔丝-API尽可能需要ARGB_8888位图我在我的onPreviewFrame方法以下解决方法之前,我喂位图给TessAPI:(I我也顺时针旋转了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阵列获取位图/ jpeg的解决方案,这是我找到的最简单的方法。该位图将被输入到tesseract工具OCR。这让我想到了第二个问题:

在这些按压和90度旋转之后,我如何找到我必须在屏幕上绘制框的位置?(相对于压缩和旋转之前)

这可能不是向OCR提供实时帧的最好甚至是好方法,我非常感谢评论,其他解决方案或优化方法的建议。

我两天前开始这个项目,并且是一个非常初学的android和ocr编程。在这两天里,这个页面帮助了我很多并且回答了我迄今为止所提出的问题,所以非常感谢你们,并提前感谢你帮我解决当前的问题。如果您想查看更多代码或有疑问,我会提供并乐意回答我能做的任何事情。

问候

您可以通过Pixa类和GetCharacters()链接浏览github上的整个API源代码,无法插入更多超链接。

1 个答案:

答案 0 :(得分:14)

TessTBaseApi.getWords().getBoxRects()将返回一个边界框Rects的ArrayList,其坐标相对于您的bmp位图。