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

Posted

技术标签:

【中文标题】如何使用 Google TextRecognizer 或 Tesseract 在相机帧的子集上执行 OCR【英文标题】:How to perform OCR on a subset of the camera frame using Google TextRecognizer or Tesseract 【发布时间】:2019-09-16 11:50:29 【问题描述】:

从这个示例项目 [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,但还没有探索将那里的概念转换为相机帧而不是单个图像文件。

【问题讨论】:

【参考方案1】:

我遇到了类似的问题,并通过使用 Tesseract 和一个名为“Android Image Cropper”的简单裁剪库 - Link here 解决了它。

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

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

 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>

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

【讨论】:

以上是关于如何使用 Google TextRecognizer 或 Tesseract 在相机帧的子集上执行 OCR的主要内容,如果未能解决你的问题,请参考以下文章

如何使用google解决问题

如何使用 Google 服务帐户通过 Activity API 检索 Google Drive 活动?

如何解决 Google GMS 在被锁定失效后,无法再使用 Google Play Store的问题;亦适用于在不使用 Google GMS 的情况下,如何正常使用Google Play 商店

如何解决 Google GMS 在被锁定失效后,无法再使用 Google Play Store的问题;亦适用于在不使用 Google GMS 的情况下,如何正常使用Google Play 商店

如何使用 Google PubSub 确认 (@google-cloud/pubsub)

如何在 HTML 页面中使用 Google 字体