如何使用Google TextRecognizer或Tesseract对相机帧的子集执行OCR



从此示例项目 [ https://github.com/googlesamples/android-vision/tree/master/visionSamples/ocr-reader ] 开始,我已经能够在OcrDetectorProcessor.receiveDetections()方法中实现过滤。

这有效,但com.google.android.gms.vision.text.TextRecognizer似乎在整个屏幕上搜索字符。

我认为,如果扫描屏幕的一小部分而不是整个屏幕,则可以更频繁地调用receiveDetections()方法。

是否可以指定要扫描的屏幕的较小部分?通过过度更改图形来指导用户定位他们的相机,以便屏幕的这一较小部分包含目标文本应该是直截了当的,但我不确定如何告诉处理器在进行 OCR 处理时只使用帧的一小部分。

需要更改哪些内容才能指定 OCR 应在帧的子集上运行?

附加信息:

我试图对TextRecognizer进行子类化,但它被标记为final,并且源代码似乎已关闭。

因此,我将问题扩展到如何使用 Tesseract 复制 ocr 阅读器示例的功能。

我找到了这个链接,但还没有探索将那里的概念转换为相机帧而不是单个图像文件。

我遇到了类似的问题,并使用Tesseract和一个名为"Android Image Cropper"的简单裁剪库解决了它 - 链接在这里 。

基本上,我只是在传递图像进行处理之前裁剪图像。这是我代码的一小部分示例:

此行将启动结果的新活动:

CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).start((Activity) view.getContext());

之后,您只需要覆盖onActivityResult。我的解决方案如下所示:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE){
CropImage.ActivityResult result = CropImage.getActivityResult(data);
Bitmap bmp = null;
try {
InputStream is = context.getContentResolver().openInputStream(result.getUri());
BitmapFactory.Options options = new BitmapFactory.Options();
bmp = BitmapFactory.decodeStream(is, null, options);
} catch (Exception ex) {
Log.i(getClass().getSimpleName(), ex.getMessage());
Toast.makeText(context, errorConvert, Toast.LENGTH_SHORT).show();
}
ivImage.setImageBitmap(bmp);

doOCR(bmp);
}
}
}

如您所见,最后我将在doOCR()方法中传递已经裁剪的 OCR 图像。您可以将其传递给您的 OCR 函数,它应该像一个魅力一样工作。

如果您打算执行类似操作,请不要忘记添加依赖项:

//Crop library dependency
api 'com.theartofdev.edmodo:android-image-cropper:2.8.+'

并将以下内容添加到清单文件中:

<activity android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
android:theme="@style/Base.Theme.AppCompat"/>
</application>

希望这有帮助,祝你好运:)

最新更新