【问题标题】:OpenCV detect numbersOpenCV 检测数字
【发布时间】:2026-01-28 12:15:01
【问题描述】:

我在 iPhone 上使用 OpenCV,需要检测图像中的数字。我将图像拆分为较小的图像,因此每个图像只有一个数字(1-9)。所有数字都是打印出来的,不是手写的。

用 OpenCV 计算数字的最佳方法是什么?

更新:

我已成功找到并提取了这些数字。它们看起来像这样:

http://img198.imageshack.us/img198/5671/101ht.jpg
http://img824.imageshack.us/img824/539/606yu.jpg

当它们被提取时,它们的大小相同,依此类推。我保存了一堆图像并将它们放在 OCR 目录中,并在其中将它们分类为数字。比如:ocr/1/100.jpg 101.jpg.... 和 ocr/2/200.jpg 201.jpg....

然后我将使用与基本 OCR 教程中相同的方法:http://blog.damiles.com/?p=93

但是,我正在为 iPhone 编程,无法使用 C++ 代码(编译时出错等),我无法访问 highgui。

我尝试使用 cvMatchTemplate() 并匹配一堆图像,但它似乎工作得非常糟糕......

我可以尝试其他任何想法吗?

【问题讨论】:

  • 谢谢。我以前读过它。他正在对手写数字进行 OCR。火车图像也适用于印刷文本吗?
  • 它会工作得更好。使用规则形状总是更容易
  • 当然,但是我必须找到打印数字而不是手写数字的火车图像,对吧?
  • 是的 - 只需生成一组带有正确字体、大小等数字的图像

标签: image-processing opencv ocr


【解决方案1】:

卷积神经网络是迄今为止最好的手写数字算法。在 USPS 等大多数系统中都实现了。这里有几篇解释算法的论文。 http://yann.lecun.com/exdb/lenet/

【讨论】:

    【解决方案2】:

    HOG + SVM(尝试使用内核)

    【讨论】:

      【解决方案3】:

      Tesseract 也是一款不错的免费 OCR 引擎,可随时用于 iPhone 并允许您使用自己的训练图像集: http://tinsuke.wordpress.com/2011/11/01/how-to-compile-and-use-tesseract-3-01-on-ios-sdk-5/

      【讨论】:

        【解决方案4】:

        Simple Digit Recognition OCR in OpenCV-Python

        这可能会对您有所帮助。将代码从 Python 转换为 C++ 并不是一项艰巨的任务,因为两者的 OpenCV API 是相同的。

        【讨论】:

          【解决方案5】:

          您可以从阅读主成分分析 (PCA)、Fisher 线性判别分析 (LDA) 和支持向量机 (SVM) 开始。这些是对 OCR 非常有用的分类方法,并且有任何语言的库,包括 C++、Python、C# 等。

          事实证明,OpenCV 已经在 PCAsSVMs 上包含了出色的实现。我还没有看到任何 OCR 的 OpenCV 代码示例,但是您可以使用一些修改版本的人脸分类来执行字符分类。 OpenCV 人脸识别代码的优秀资源是this website

          【讨论】:

            【解决方案6】:

            这是一个不错的open source,它是iPhone上的ORCDemo。希望对你有用

            【讨论】:

              【解决方案7】:

              如果数字被打印出来,工作就很简单了,你只需要找出一组很好的特征来匹配。如果数字是一种字体,您可以使用这种方法:

              • 提取号码
              • 找到边界框
              • 将图像缩小到 10x8 左右,尝试匹配纵横比
              • 对小型训练集执行此操作,为每个数字获取“平均”图像

              • 对于新图像,请按照上述步骤操作,但最后只是每个数字模板的绝对图像差异。然后取差异的总和(差异图像中的像素)。最小的是你的号码。

              以上都是基本的OpenCV操作。

              【讨论】:

                【解决方案8】:

                也许最简单方便的方法是使用 svm 作为 ml 算法 http://opencv.willowgarage.com/documentation/cpp/support_vector_machines.html 和灰度图像作为特征向量。

                【讨论】:

                • 我同意 Alex,使用 PCA 和 SVM 的某种组合,两者都包含在 OpenCV 中
                【解决方案9】:

                基本上,您的问题只是对特征向量进行分类,这是经过一些预处理步骤后的像素强度集。您可以为此任务使用任何分类器,例如。神经网络,它应该在 OpenCV 中有一个 C 实现。您也可以尝试支持向量机的 C libsvm 库。

                有一个good site与这个问题相关,有很多论文和一个训练数据库。

                【讨论】:

                  【解决方案10】:

                  目标 C++? 尝试将您的 .m 文件重命名为 .mm,然后您可以在 iPhone 项目中使用 c++。

                  【讨论】: