【发布时间】:2016-04-12 06:03:21
【问题描述】:
我今年的圣诞假期项目是构建一个小的 Android 应用程序,它应该能够检测图片中的任意欧元硬币,识别它们的价值并将价值相加。
我对图片获得良好识别的假设/要求是
- 统一背景
- 图片应大致为 DinA4 纸大小
- 硬币不能重叠,但可以相互接触
- 硬币的数字面必须向上/可见
我最初的想法是,为了以后的硬币价值识别,最好先检测图片中的实际硬币/它们的区域。然后,任何识别都将仅在图片的这些区域运行,在这些区域中可以找到实际的硬币。
所以第一步是找到圈子。这是我使用这个 OpenCV 3 管道完成的,正如几本书和 SO 帖子中所建议的那样:
- 转换为灰色
- CannyEdge 检测
- 高斯模糊
- HoughCircle 检测
- 过滤掉内部/冗余圆圈
恕我直言,检测工作相当成功,这里是结果图片: Coins detected with HoughCircles with blue border
现在对每一枚发现的硬币进行识别!
我搜索了这个问题的解决方案并想出了
- 模板匹配
- 特征检测
- 机器学习
模板匹配似乎非常不适合这个问题,因为硬币可以相对于模板硬币任意旋转(并且模板匹配算法不是旋转不变的!所以我不得不旋转硬币!)。 此外,模板硬币的像素永远不会与之前检测到的硬币区域的像素完全匹配。所以我认为任何计算相似度的算法都只会产生很差的结果。
然后我研究了特征检测。这对我来说似乎更合适。我检测了模板硬币和候选硬币图片的特征并绘制了匹配项(ORB 和 BRUTEFORCE_HAMMING 的组合)。不幸的是,模板硬币的特征也在错误的候选硬币中被检测到。 见下图,模板或“特征”硬币位于左侧,即 20 美分硬币。右边是候选硬币,最左边的硬币是 20 美分硬币。我实际上预计这枚硬币的匹配次数最多,不幸的是不是。因此,这似乎不是识别硬币价值的可行方法。 Feature-matches drawn between a template coin and candidate coins
所以机器学习是第三种可能的解决方案。从大学开始,我现在还在学习神经网络,它们是如何工作的,等等。不幸的是,我的实践知识很差,而且我根本不知道支持向量机 (SVM),这是 OpenCV 支持的机器学习。
所以我的问题实际上与源代码无关,而更多的是如何设置学习过程。
- 我应该学习普通硬币图像还是应该先提取特征并学习特征? (我认为:功能)
- 每个硬币应该给出多少正数和负数?
- 我是否还必须学习旋转硬币,或者这种旋转是否由 SVM “自动”处理?那么即使我只在非旋转硬币上训练它,SVM 会识别旋转硬币吗?
- 我上面的一个图片要求(“DinA4”)将硬币的大小限制在一定的大小,例如图片高度的 1/12。我应该学习大小大致相同还是不同大小的硬币?我认为,不同的大小会导致不同的特征,这对学习过程没有帮助,你怎么看?
当然,如果您有其他可能的解决方案,也欢迎! 任何帮助表示赞赏! :-)
再见,谢谢!
【问题讨论】:
标签: opencv machine-learning svm