安卓OCR tesseract:如何使用Pixa对象的数据显示边界框

8
我目前正在研究Android上的OCR。因此,我编写了一个带有相机预览的小应用程序,现在我正在使用onPreviewFrame方法向Tessearact工具(tess-two)提供图像。现在我想在我的相机预览中显示OCR的边界矩形。TessBaseAPI提供了返回字符/单词边界框的方法。返回对象的类型是Pixa,在与tess-two一起提供的leptonica库中。
所以我的问题是:如何从TessBaseAPI的getCharacters()或getWords()返回的Pixa对象中获取可用的坐标,以便在我的相机预览上绘制边界框? BaseAPI中的GetCharacters()和getWords() leptonicas Pixa类 重要提示:

由于预览只支持的图像格式是YUV N21,而根据我所了解的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数组获取位图/ jpeg的解决方案,这是我找到的最简单的方法。这个位图将被提供给tesseract工具OCR。这就带来了我的第二个问题:
在这些压缩和90度旋转之后,我如何定位在屏幕上绘制框的位置?(相对于压缩和旋转之前)
这可能不是提供实时帧给OCR的最佳或甚至是好的方法,我非常感谢评论、其他解决方案或优化方式的建议。
我两天前开始这个项目,是一个非常初学者的安卓和OCR编程人员。在这两天里,这个页面帮助了我很多,并且非常好地回答了我目前所遇到的问题,所以谢谢你们,也感谢您帮助我解决当前的问题。如果您想查看更多代码或有问题,我会提供并乐意回答我所能回答的任何问题。
问候
您可以通过Pixa类和GetCharacters()链接在github上浏览整个API源代码,无法插入更多超链接。
1个回答

14

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


谢谢,正是我要找的!真可惜我不能给你点赞。 - Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接