今年我的圣诞假期项目是开发一个小型的Android应用程序,它应该能够在图片中检测任意的欧元硬币,识别它们的价值,并将值加起来。
我的assumptions/requirements对图片的一个良好的识别是
我最初的想法是,对于硬币的价值-识别后,最好首先检测实际的硬币/他们的区域在图片中。然后,任何识别都只会出现在图片的这些区域,在这些区域可以找到实际的硬币。
因此,第一步是找到圆圈。我已经使用3管道完成了,就像几本书和帖子中所建议的那样:
检测工作相当成功,这里是结果的图片:用蓝色边框HoughCircles检测硬币。
现在每一枚硬币都得到了的认可!
我找到了这个问题的解决方案,并想出了
模板匹配看起来非常不适合这个问题,因为硬币可以相对于模板硬币任意旋转(而且模板匹配算法不是旋转不变的!因此,我必须旋转硬币!)此外,模板硬币的像素永远不会与先前检测到的硬币区域的像素完全匹配。因此,我认为任何计算相似度的算法都只会产生很差的结果。
然后,我研究了特性检测。这对我来说更合适。我检测到一个模板硬币的特征和候选硬币图片,并绘制匹配( ORB和BRUTEFORCE_HAMMING组合)。不幸的是,在错误的候选硬币中也发现了模板硬币的特征。看下面的图片,其中的模板或“特色”硬币在左边,一个20美分的硬币。右边是候选硬币,最左边的硬币是20美分的硬币。事实上,我希望这枚硬币能有最多的匹配,但不幸的是没有。因此,这似乎不是一种识别硬币价值的可行方法。特征匹配-模板硬币与候选硬币之间的匹配
因此,机器学习是第三种可能的解决方案。从大学到现在,我还在研究神经网络,它们是如何工作的。不幸的是,我的实际知识相当贫乏,我根本不知道支持向量机(SVM),这是OpenCV支持的机器学习。
所以我的问题其实不是源代码相关的,而是更多的如何设置学习过程。
当然,如果您有不同的解决方案,这也是受欢迎的!如有任何帮助,将不胜感激!)
再见,谢谢!
发布于 2016-01-07 20:23:54
回答你的问题:
1-我应该在普通硬币上学习-图像还是我应该首先提取特征并学习这些特征?(我想:特性)
对于许多对象分类任务,最好先提取特征,然后利用学习算法训练分类器。(例如,特征可以是猪,学习算法可以是支持向量机或Adaboost)。这主要是因为与像素值相比,特征具有更多有意义的信息。(它们可以描述边缘、形状、纹理等)然而,像深度学习这样的算法将提取有用的特征作为学习过程的一部分。
2 -每枚硬币应有多少正面和负面因素?
您需要回答这个问题,这取决于您想要识别的类的变化和您使用的学习算法。对于支持向量机,如果您使用HOG功能,并且希望识别硬币上的特定数字,那么您就不需要太多了。
3-我是否也要学习旋转硬币,或者这个旋转会被支持向量机“自动处理”?那么支持向量机会识别旋转硬币吗,即使我只把它训练在非旋转硬币上呢?
同样,这取决于您要选择的特性(而不是支持向量机,这是学习算法)的最终决定。HOG特性不是旋转不变的,但也有像SIFT或冲浪这样的特性。
4--我的照片之一--上面的要求("DinA4")将硬币的尺寸限制在一定的尺寸,例如1/12的图片高度。我应该在大致相同大小或不同大小的硬币上学习吗?我认为,不同的尺寸会导致不同的特性,这无助于学习过程,您认为呢?
同样,选择您的算法,他们中的一些要求您的固定/相似的宽度/高度比。你可以在相关的论文中找到具体的要求。
如果您决定使用支持向量机,请查看这,如果您对神经网络感到满意,那么使用Tensorflow是个好主意。
https://stackoverflow.com/questions/34662077
复制相似问题