首先:字符识别不仅不是一个简单的问题,也不是一个完全解决的问题。
有很多 OCR 实现吗?是的。这些实现好吗?这取决于应用程序。您认为 OCR 应该越通用,现有的实现看起来就越糟糕。
长话短说,有专门针对这个主题的书籍,并且需要一定长度的书才能提供任何有意义的详细程度的答案。
OCR(光学字符识别)有很多技术。已针对 (a) 机器打印字符与 (b) 手写字符开发了不同的技术。阅读机印字符通常更容易,但不一定容易。阅读手写字符可能非常困难,并且仍然是一个未完全解决的问题。请记住,还有其他“脚本”(用于书写的字符系统),拉丁字符的识别技术可能与繁体汉字的识别技术不同。 [如果你能写一个手机OCR应用来快速准确地读取手写汉字,你可以赚一大笔钱。]
https://en.wikipedia.org/wiki/Optical_character_recognition
OCR 有很多方法,如果您对实际编写代码来执行 OCR 感兴趣,那么您自然应该考虑首先实现至少一种更简单的技术。从你的 cmets 听起来你已经在研究这个了,但简单地说:不要先看神经网络。是的,您可能最终会到达那里,但是在您可以大量使用神经网络技术之前,还有很多关于成像、照明和基本图像处理的知识。
但在深入研究之前,请花一些时间尝试自己解决问题:
- 自己编写代码(不要使用别人的代码)将图像从文件加载到内存中。
- 将图像表示为内存中的二维数组。
- 想一想可以将几个字符或形状彼此区分开来的方法。首先假设这些字符被完美复制。例如,如果图像包含字符“1”和“2”的多个精确副本,那么您可以想象区分这些字符的最简单方法是什么?
- 考虑相同的问题,但字符略有不同。例如,为每个字符添加一些“噪声”像素。
稍作修改后,阅读一些基本的图像处理技术。一本好书是冈萨雷斯和伍兹的数字图像处理。
(归一化相关是一种简单的算法,您可以在网上和书中阅读。它对于某些简单类型的 OCR 很有用。您可以将归一化相关视为比较参考“A”字符的“模板”的一种方法到可能是也可能不是“A”字符的其他字符的样本——模板与样本越接近,样本是 A 的置信度越高。
所以是的,尝试使用 OpenCV 的模板匹配。首先修改 OpenCV 函数,了解模板匹配何时有效以及何时失败,然后更仔细地查看代码。)
最近对 OCR 技术的调查可以在本书中找到:Character Recognition Systems,作者 Cheriet。这是研究各种算法的一个很好的起点。其中一些技术将非常令人惊讶和违反直觉。
要了解有关人类如何识别字符的更多信息(其细节通常令人惊讶且违反直觉),请阅读 Dehaene 的Reading in the Brain一书。这本书可读性很强,不需要特殊的数学或编程技能。
最后,对于任何 OCR 算法,请务必牢记以下几点:
- 图像质量很重要。尽可能控制图像采集和照明。培养对光、影等对 OCR 结果的影响的良好直觉。
- 设定读取率准确度的目标。为避免沮丧,首先设定一个低目标——也许只有 50%。有多种技术可以计算“准确”的含义,但首先您可以简单地计算正确识别的字符百分比或正确识别的单词百分比。实现 98% 的读取率并不容易,对于某些应用程序来说,即使读取率也不是特别有用。
- 识别单词又增加了一层复杂性。
- 学习任何深度的 OCR 都需要很长时间。慢慢来。
- 始终重新审视关于“应该”如何编写 OCR 算法的假设。即使第 2 步、第 3 步、第 4 步和第 5 步的实现很巧妙,第 1 步的愚蠢选择也会阻碍整个实现。
祝你好运!