我在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()并匹配一堆图片,但它似乎工作得很糟糕......
我可以尝试其他任何想法吗?
答案 0 :(得分:8)
您可以从阅读主成分分析(PCA),Fisher线性判别分析(LDA)和支持向量机(SVM)开始。这些是对OCR非常有用的分类方法,并且有任何语言的库,包括C ++,Python,C#等。
事实证明,OpenCV已经在PCAs和SVMs上包含了出色的实现。我还没有看到任何针对OCR的OpenCV代码示例,但您可以使用某些修改版的面部分类来执行字符分类。 OpenCV的面部识别代码的优秀资源是this website。
答案 1 :(得分:4)
如果打印数字,作业非常简单,您只需找出一组很好的功能即可。如果数字是一种字体,您可以采用这种方法:
为小型训练集执行此操作,为每个数字拍摄“平均”图像
对于新图像,请按照上述步骤操作,但最后一步只是与每个数字模板的绝对图像差异。然后取差异的总和(差异图像中的像素)。最小的是你的号码。
以上都是基本的OpenCV操作。
答案 2 :(得分:2)
基本上你的问题只是对特征向量进行分类,这是一些预处理步骤后的像素强度集。您可以将任何分类器用于此任务,例如。神经网络,它应该在OpenCV中有一个C实现。您也可以尝试使用支持向量机的C libsvm库。
有很多论文和培训数据库与此问题有关good site。
答案 3 :(得分:2)
也许最简单方便的方法是使用svm作为ml算法 http://opencv.willowgarage.com/documentation/cpp/support_vector_machines.html 和灰色图像作为特征向量。
答案 4 :(得分:1)
Objective C ++? 尝试将.m文件重命名为.mm,然后在iPhone项目中使用c ++。
答案 5 :(得分:1)
卷积神经网络是迄今为止手写数字的最佳算法。它们在USPS等大多数系统中实现。以下是解释算法的几篇论文。 http://yann.lecun.com/exdb/lenet/
答案 6 :(得分:0)
这是一个不错的open source,它是iPhone上的ORCDemo。希望它对你有用
答案 7 :(得分:0)
Simple Digit Recognition OCR in OpenCV-Python
这可能会帮到你。将代码从Python转换为C ++并不是一项艰巨的任务,因为OpenCV API对于两者都是相同的。
答案 8 :(得分:0)
Tesseract也是一个很好的免费OCR引擎,可以随时用于iPhone,并允许您使用自己的训练图像集: http://tinsuke.wordpress.com/2011/11/01/how-to-compile-and-use-tesseract-3-01-on-ios-sdk-5/
答案 9 :(得分:0)
HOG + SVM(尝试使用内核)