java - Android OCR 超正方体 : using data from Pixa objects to display bounding boxes

标签 java android ocr preview tesseract

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

所以我的问题是:如何从 TessBaseAPI 的 getCharacters() 或 getWords() 返回的 Pixa 对象中获取可用于在相机预览上绘制边界框的可用坐标?

GetCharacters() and getWords() in the BaseAPI

leptonicas Pixa class

重要:

因为预览只支持图像格式是 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 提供实时帧的最佳方式,甚至不是很好的方式,我非常感谢评论、其他解决方案或优化方式的建议。

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

问候

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

最佳答案

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

关于java - Android OCR 超正方体 : using data from Pixa objects to display bounding boxes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11483903/

相关文章:

image-processing - 图像处理/超轻型OCR

c++ - 在 tesseract C++ API 中禁用字典辅助 OCR

java - 将 3 个列表组合成具有唯一值的单个集合

java - ListView 的 OnClickListener,为每个 onItemClick 提供来自 ArrayList 的新 Intent 数据

android - 如何监听用户的 USB 网络共享激活?

ocr - Tesseract Ocr引擎多维数据集模式-培训Tesseract

java - 用 JNA 鼠标点击

java - 具有两个多对一关系的实体关系

java - OpenCV Mat 处理 Android JNI

android - 使用 MediaCodec 编码时,三分之二的屏幕为绿色