Android OCR tesseract:使用 Pixa 对象中的数据显示边界框
Posted
技术标签:
【中文标题】Android OCR tesseract:使用 Pixa 对象中的数据显示边界框【英文标题】:Android OCR tesseract: using data from Pixa objects to display bounding boxes 【发布时间】:2012-07-14 02:18:33 【问题描述】:我目前正在 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 byte[] 压缩为 YuvImage,然后压缩为 jpeg,然后再压缩为位图。我在网上搜索了很多关于如何从 NV21 数组中获取位图/jpeg 的解决方案,这是我找到的最简单的方法。该位图将被提供给 tesseract 工具 OCR。这就引出了我的第二个问题:
在这些压缩和 90 度旋转之后,我如何找到必须在屏幕上绘制框的位置?(相对于压缩和旋转之前)
这可能不是为 OCR 提供实时帧的最佳甚至不是好方法,我非常感谢 cmets、其他解决方案或优化方法的建议。
我两天前开始了这个项目,并且是 android 和 ocr 编程的初学者。在这两天里,这个页面帮助了我很多,并且很好地回答了我迄今为止的问题,所以谢谢你,并提前感谢你帮助我解决我目前的问题。如果您想查看更多代码或有任何疑问,我会提供并很乐意回答任何我能回答的问题。
问候
您可以通过 Pixa 类和 GetCharacters() 链接在 github 上浏览整个 API 源代码,不能插入更多超链接。
【问题讨论】:
【参考方案1】:TessTBaseApi.getWords().getBoxRects()
将返回边界框 Rects 的 ArrayList,其坐标相对于您的 bmp
位图。
【讨论】:
谢谢,正是我想要的!可惜我不能投票给你。以上是关于Android OCR tesseract:使用 Pixa 对象中的数据显示边界框的主要内容,如果未能解决你的问题,请参考以下文章
使用 Tesseract 的 Android OCR 应用程序
Tesseract OCR集成Android Studio实现OCR识别
Android OCR 使用 tess-two 一个 tesseract 的分支