我正在尝试开发Windows Phone 8.1应用程序,但我需要识别来自不同显示器的一些数字。
我跟着这个例子:
http://bsubramanyamraju.blogspot.com/2014/08/windowsphone-81-optical-character.html
即使用Microsoft OCR运行时库:
https://www.nuget.org/packages/Microsoft.Windows.Ocr/
然而,当我试图识别那些照片时它并不起作用。即使我找到了这个网站:
https://www.unix-ag.uni-kl.de/~auerswal/ssocr/
有人有推荐吗?或者有人知道与之相关的任何代码吗?
感谢您的宝贵知识。
答案 0 :(得分:10)
我希望你的问题的答案是"当然,这里是"链接到黑盒进程 - 任何OCR工具,但涉及到几个方面,最好单独考虑。
首先,在您考虑任何OCR之前,有一些关于图像预处理的工作。您的图像样本非常不同,包括各种问题。
SAMPLE 1具有低对比度,因此当它被二值化为黑白层时,大多数OCR将在某个阶段内部执行,没有要处理的字符。二值化后看起来像这样:
有关图像预处理的更多详细信息,请参阅此OCR博客文章:http://www.ocr-it.com/guide-to-better-mobile-images-from-cell-phone-camera-for-higher-quality-ocr。
其次,图像在标题中没有dpi信息,一些OCR技术使用它来确定图像的适当缩放。如果没有标题信息,某些OCR程序可能会设置一些默认dpi,这可能与您的图像匹配,也可能不匹配,从而影响OCR结果。这并不重要,但如果可以在创建图片时实施,则首选。
SAMPLE 2具有足够的对比度,自适应公证会返回清晰的图像。它还缺少标题中的dpi分辨率值。
SAMPLE 3具有非常清晰的对比度,但它在标题中也没有分辨率dpi。
一旦您拥有针对OCR处理优化的图像,下一步就是查看OCR技术。
我没有测试你曾经提到的,假设你有正确的实施,但没有成功。我测试了过去使用的其他OCR工具。
一般来说,我所知道的没有7段OCR。但是,我能够为这项专门任务调整其他通用OCR。我试过的每一个OCR都是开箱即用的'或使用默认设置无法处理此识别。这是合乎逻辑的,也是预期的。为什么?因为编写大多数通用OCR以识别每个字符的不可分离的像素模式。这与'#34;字符可分性"有关。用于将单词分成单独字符的原则。换句话说,内部OCR算法寻找构成每个字符的连接笔画。更强大的商业OCR允许像素模式中的一些中断,但是它们预期是最小的,例如打印或扫描中的缺陷,这可能导致丢失字符片段。
7段显示本质上会在每个字符中有多个中断,与字符可分性原则相冲突。
更强大的OCR技术具有a)对像素模式中断的更大容忍度和/或b)具有处理这些情况的特殊设置。
我将使用OCR-IT基于Web的OCR API平台进行进一步测试,这是我所熟知的。我在OCR功能方面担任开发人员。我也在我自己的iOS和Android应用程序中广泛使用它。 OCR-IT API基于强大的商业OCR引擎,因此它具有良好的字符缺陷容忍度以及一些控制来帮助解决这种情况。
SAMPLE 3.这是最容易处理的样本,所以我先测试了它。使用OCR-IT API,并使用默认设置发出请求,请求输出为TXT格式,我得到以下内容:
OCR似乎是a)将字符分成两个单独的行,并且b)尝试尽可能接近有效字符读取生成的图案。
根据此快速分析,对OCR设置进行一次调整会产生以下识别:
在OCR结果中产生重大影响的设置是从默认打印类型切换到使用" DotMatrix",它位于整个OCR-IT API设置XML的中间位置:
<Job>
<InputURL>http://i.stack.imgur.com/wOtFx.jpg</InputURL>
<CleanupSettings>
<Deskew>false</Deskew>
<RemoveGarbage>false</RemoveGarbage>
<RemoveTexture>false</RemoveTexture>
<RotationType>NoRotation</RotationType>
</CleanupSettings>
<OCRSettings>
<PrintType>DotMatrix</PrintType>
<OCRLanguage>English</OCRLanguage>
<SpeedOCR>false</SpeedOCR>
<AnalysisMode>MixedDocument</AnalysisMode>
<LookForBarcodes>false</LookForBarcodes>
</OCRSettings>
<OutputSettings>
<ExportFormat>Text</ExportFormat>
</OutputSettings>
</Job>
&#13;
DotMatrix打印类型的使用开启了必要的算法,以增加字符结构中断的容忍度,这通常发生在点阵打印中的点阵打印机的性质上。或者,打字机&#34;打字机&#34;可以使用打印类型,因为打字字体也会出现字符中断,因此可以由OCR自动处理。
使用&#34; Digits&#34;可以再次对API设置进行更改以运行OCR。字符集(语言),有效地消除了误读1的可能性等等。
样本2.在此示例中,每个字符结构中的间隙要宽得多。甚至用于处理DotMatrix或Typerwriter打印类型的标准算法也无法适应这些大的差距。使用所有可能的设置变体返回如下:
字符分割似乎是个问题。一种技术解决方案可以追溯到图像预处理。可以实现简单的算法以填充7段字符的每个段之间的间隙。它不一定非常精确,如下所示:
但这足以产生完美的OCR结果。
由于事先可能不知道哪个7段LCD显示器需要填充间隙,哪些没有,我建议将此算法应用于所有具有小或大间隙的LCD 7段图像。我会将间隙的大小限制为不宽于段的宽度。鉴于这些屏幕具有各种背景和分段颜色,如果在二值化(黑白)图像上执行,则可以大大简化该预处理算法。
总的来说,假设执行了一些图像预处理,这项任务可以使用OCR和近乎开箱即用的功能。总的来说,我认为任何与OCR相关的项目都需要进行图像预处理,特别是该项目。
如果您对OCR或图像预处理有任何疑问,请发邮件给我。
答案 1 :(得分:1)
尽管如此,自从Ilya的回答已经有一段时间了,感谢他的建议和其他人,特别是这个:
Seven Segment Optical Character Recognition
我能够在C#中创建自己的类:
https://github.com/FANMixco/7-segment-ocr-reader/blob/master/OCR/SevenSegmentOCR.cs
随意使用并改进它。