【问题标题】:How to read text from 'simple' screenshot fast and effectively?如何快速有效地从“简单”屏幕截图中读取文本?
【发布时间】:2019-04-06 11:11:52
【问题描述】:

我正在开发一个小型个人应用程序,它应该从一个非常简单的 Android 屏幕截图中读取一些文本(最多 2 个句子)。文本始终是相同的大小、相同的字体和大约。同一个位置。背景非常平淡,通常是 1 种颜色的几种色调(想想就像亮橙色逐渐变成深一点的橙色)。我试图找出最好的方法(最重要的是,最快的方法)来做到这一点。

我的第一次尝试涉及 IronOcr C# 库,公平地说,它运行良好!但我注意到它存在一些问题:

  • 这不是 100% 准确的
  • 尽管有社区/试用版,但有时会抛出异常,告诉您获取许可证
  • 读取约 600x300 像素的图像需要约 400 毫秒,就我的简单图像而言,我认为该图像相当长

虽然听起来很奇怪,但我感觉 IronOcr 和 Tesseract 之类的库可能对我的需求来说太先进了。为了提高速度,我什至编写了一段代码来首先“限制”我的图像,使其完全黑白。

我当前的 IronOcr 设置如下所示:

            ImageReader = new AdvancedOcr()
            {
                CleanBackgroundNoise = false,
                EnhanceContrast = false,
                EnhanceResolution = false,
                Strategy = AdvancedOcr.OcrStrategy.Fast,
                ColorSpace = AdvancedOcr.OcrColorSpace.GrayScale,
                DetectWhiteTextOnDarkBackgrounds = true,
                InputImageType = AdvancedOcr.InputTypes.Snippet,
                RotateAndStraighten = false,
                ReadBarCodes = false,
                ColorDepth = 1
            };

而且我完全可以接受使用 IronOcr 所获得的结果,但是许可例外情况毁了它。我也没有 399 美元可以花在一个甚至不会离开我自己的 PC 的私人爱好项目上:(

但我对这个问题的主要目标是找到一种更好、更快或更有效的方法来做到这一点。它不一定是一个现有的库,如果有人能指出我正确的方向,我非常愿意制作我自己的字母检测代码,它可以(仅?)用于像我这样的屏幕截图。

【问题讨论】:

  • 如果异常在对象创建时确实是随机的...创建一个循环,并在必要时尝试多次尝试创建对象实例...您将无法改进单独花费数百万构建的 ocr 软件的性能
  • @Ctznkane525 异常不是“真正随机的”,它们很可能只是被抛出,因为我试图“过于频繁”地阅读图像,尽管我还不确定那还没有。至于提高 OCR 软件的性能:我的目的不是编写自己的成熟 OCR 软件。它将仅限于我需要阅读的屏幕截图类型,这无疑使事情变得容易得多。

标签: c# ocr screenshot


【解决方案1】:

我已经研究过这个主题,我能找到的最佳解决方案是 Azure 认知服务。您可以使用计算机视觉 API 从图像中读取文本。 Here 是完整的文档。

【讨论】:

  • 我确实看过那个,但我一直认为它不会获得与 IronOcr 相同的速度,因为它也需要您上传图像等。也许我应该试一试尽管!有的话我会更新的。
【解决方案2】:

它必须有多快?
如果您使用 C#,我推荐 Google Cloud Vision API。您按请求付费,但每月前 1000 个免费(查看价格here)。 然而,它确实需要一个网络请求,但我发现它非常快

using Google.Cloud.Vision.V1;
using System;

namespace GoogleCloudSamples
{
    public class QuickStart
    {
        public static void Main(string[] args)
        {
            // Instantiates a client
            var client = ImageAnnotatorClient.Create();
            // Load the image file into memory
            var image = Image.FromFile("wakeupcat.jpg");
            // Performs label detection on the image file
            var response = client.DetectText(image);
            foreach (var annotation in response)
            {
                if (annotation.Description != null)
                    Console.WriteLine(annotation.Description);
            }
        }
    }
}

我发现它适用于图片和扫描文档,因此它应该非常适合您的情况。 SDK 也支持其他语言,如 Java、Python 和 Node

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2017-06-30
    • 1970-01-01
    相关资源
    最近更新 更多