如何从Android应用中提取图像文本

22

我正在为我的Android应用程序开发功能。我想从图片中读取文本,然后将该文本保存在数据库中。使用OCR是最好的方法吗?还有其他方法吗?Google在其文档中建议仅在必要时使用NDK,但具体的缺点是什么?

任何帮助都将是极好的。

Image to be OCR'd

enter image description here

enter image description here

enter image description here


我也在寻找类似的解决方案,当我阅读时,我来到了这里的SO。我想问你是否找到了任何可行的解决方案。在阅读了两个答案后,我有点困惑。你是跟随哪一个答案,并且它们的准确性如何?能否分享一下你的案例研究?谢谢。 - Lokesh Pandey
4个回答

28

你可以使用 Google Vision 库将图片转换为文本,它会从图片中提供更好的输出。在 build.gradle 文件中添加下面的库:

   compile 'com.google.android.gms:play-services-vision:10.0.0+'

    TextRecognizer textRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();

Frame imageFrame = new Frame.Builder()

        .setBitmap(bitmap)                 // your image bitmap
        .build();

String imageText = "";


SparseArray<TextBlock> textBlocks = textRecognizer.detect(imageFrame);

for (int i = 0; i < textBlocks.size(); i++) {
    TextBlock textBlock = textBlocks.get(textBlocks.keyAt(i));
    imageText = textBlock.getValue();                   // return string
}

谢谢,它能工作了,但是无法识别文本中的句点(.)。我们如何获取包括其中的句点在内的完整值? - Shailendra Madda

4

通过这个Android OCRReader简单示例教程,你可以读取图片上的文本,也可以使用相机扫描文本,只需使用非常简单的代码。

该库是使用Mobile Vision Text API开发的。

用于从相机扫描文本。

OCRCapture.Builder(this)
        .setUseFlash(true)
        .setAutoFocus(true)
        .buildWithRequestCode(CAMERA_SCAN_TEXT);

从图像中提取文本
String text = OCRCapture.Builder(this).getTextFromUri(pickedImage);
//You can also use getTextFromBitmap(Bitmap bitmap) or getTextFromImage(String imagePath) buplic APIs from OCRLibrary library.

如何在这里设置语言? - Yamuna

1
使用Firebase机器学习(ML)工具包可以提取图像中的文本。文本识别API有两个版本,即设备上的API(免费)和云端API。
要使用API,请首先创建图像的BitMap,该图像应该是竖直的。然后创建FirebaseVisionImage对象,传递位图对象。
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap);

然后创建FirebaseVisionTextRecognizer对象。
FirebaseVisionTextRecognizer textRecognizer = FirebaseVision.getInstance()
        .getCloudTextRecognizer();

然后将FirebaseVisionImage对象传递给processImage()方法,为生成的任务添加监听器,并在成功的回调方法中捕获提取的文本。
textRecognizer.processImage(image)
                .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
                    @Override
                    public void onSuccess(FirebaseVisionText firebaseVisionText) {
                       //process success
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                     @Override
                     public void onFailure(@NonNull Exception e) {
                       //process failure
                     }
                 });

完整示例展示了如何使用Firebase ML文本识别器,详见https://www.zoftino.com/extracting-text-from-images-android


0

有另一种选择。您可以将图像上传到服务器,从服务器上的OCR进行识别,然后获取结果。


谢谢您的回复,这种方法有多可靠?现实世界中是否有使用这种方法的任何应用程序? - MrAnderson1992
再次感谢您的回复。您能否在其中添加一些细节呢?它有多准确?有哪些真实世界的应用呢?我测试了一个行业标准OCR,但它提供的准确度不超过40%。(对于我的需求来说) - MrAnderson1992
准确性取决于您的输入质量,请分享图像样本,没有图像样本无法回答问题。 - Nadia Solovyeva
我理解这一点,这就是为什么准确度水平如此之低。图像永远不会完全相同,并且它们的质量会因大小、文本、颜色、质量等方面而发生巨大变化。 - MrAnderson1992
好的。有一些真实世界的应用程序是以客户端-服务器方式运行的,但我不确定是否被允许透露应用程序名称(可能不行)。附加的图像只有一个OCR错误(%被*替换),我在这里没有看到任何问题。 - Nadia Solovyeva
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接