如何使用 Google TextRecognizer 或 Tesseract 在相机帧的子集上执行 OCR
How to perform OCR on a subset of the camera frame using Google TextRecognizer or Tesseract
从这个示例项目 [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-reader 样本的功能。
我找到了 this link,但还没有探索将其中的概念转换为相机帧而不是单个图像文件。
我有一个类似的问题,并通过使用 Tesseract 和一个名为 "Android Image Cropper" - Link here 的简单裁剪库解决了它。
基本上我只是在将图像传递给处理之前裁剪图像。这是我的代码的一小部分示例:
此行将开始新的 activity 结果:
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>
希望这对您有所帮助,祝您好运:)
从这个示例项目 [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-reader 样本的功能。
我找到了 this link,但还没有探索将其中的概念转换为相机帧而不是单个图像文件。
我有一个类似的问题,并通过使用 Tesseract 和一个名为 "Android Image Cropper" - Link here 的简单裁剪库解决了它。
基本上我只是在将图像传递给处理之前裁剪图像。这是我的代码的一小部分示例:
此行将开始新的 activity 结果:
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>
希望这对您有所帮助,祝您好运:)