如何快速有效地从“简单”屏幕截图中读取文本?

时间:2019-04-06 11:11:53

标签: c# ocr screenshot

我正在开发一个小型个人应用程序,该应用程序应该从一个非常简单的Android屏幕截图中读取一些文本(最多2个句子)。文本始终是相同的大小,相同的字体,并且大约相同。相同的位置。背景非常平淡,通常只有一种颜色的阴影(想像鲜橙色逐渐淡入较暗的橙色)。我正在尝试找出执行此操作的最佳方法(最重要的是,最快的方法)。

我的第一次尝试涉及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 USD可以花在一个私人的爱好项目上,甚至不会离开我自己的PC:(

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

  

我也没有$ 399 USD可以花在一个私人的业余项目上,甚至连我自己的PC都没用

您可以使用免费的ocr.space ocr api:https://ocr.space/ocrapi-与屏幕截图配合使用。免费版本是基于云的(在线ocr)。

答案 2 :(得分:0)

必须多快?
如果您使用的是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