OpenCV 检测数字

Posted

技术标签:

【中文标题】OpenCV 检测数字【英文标题】:OpenCV detect numbers 【发布时间】:2011-08-17 22:19:54 【问题描述】:

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

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

更新:

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

http://img198.imageshack.us/img198/5671/101ht.jpghttp://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() 并匹配一堆图像,但它似乎工作得非常糟糕......

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

【问题讨论】:

Basic OCR in 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 已经在 PCAs 和 SVMs 上包含了出色的实现。我还没有看到任何 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++。

【讨论】:

以上是关于OpenCV 检测数字的主要内容,如果未能解决你的问题,请参考以下文章

数字图像处理OpenCV3 扩展模块学习笔记

opencv去除图片中线条,保留数字

OpenCV 之 边缘检测

Opencv 可以在同一张论文中检测出两个不同大小的矩形中的一个

检测二维图像中的标记[Python/OpenCV]

OpenCV--边缘检测