我对于一张好的识别图片有以下假设/要求:
- 背景均匀 - 图片大小应该大致相当于DinA4纸张 - 硬币不得重叠,但可以互相接触 - 硬币的数字面必须朝上/可见
我的初步想法是,为了后续硬币价值识别最好先检测图片中实际硬币/它们的区域。然后只在找到实际硬币的图片区域上运行识别。
所以第一步是找到圆形。我使用了这个OpenCV 3管道,如几本书和SO帖子中建议的那样:
1. 转换为灰度 2. Canny边缘检测 3. 高斯模糊 4. HoughCircle检测 5. 过滤掉内部/冗余圆
在我看来,这种检测非常成功,下面是结果图片: 带有蓝色边框的HoughCircles检测到的硬币 现在对于每个找到的硬币进行识别!
我搜索了解决此问题的解决方案,并想出了
- 模板匹配 - 特征检测 - 机器学习
模板匹配似乎对这个问题非常不适合,因为硬币可以相对于模板硬币任意旋转(而且模板匹配算法不具有旋转不变性!所以我必须旋转硬币!)。此外,模板硬币的像素永远不会完全匹配先前检测到的硬币区域的像素。因此,任何计算相似性的算法都将产生较差的结果。
然后我研究了特征检测。这对我来说似乎更合适。我检测了模板硬币和候选硬币图片的特征,并绘制了匹配(ORB和BRUTEFORCE_HAMMING的组合)。不幸的是,模板硬币的特征也被检测到了错误的候选硬币中。
下面的图片显示了模板或“特征”硬币在左侧,一个20欧分硬币。右侧是候选硬币,最左边的硬币是20欧分硬币。我实际上期望这个硬币有最多的匹配,不幸的是没有。所以再次,这似乎不是识别硬币价值的可行方法。 模板硬币和候选硬币之间绘制的特征匹配
因此,机器学习是第三种可能的解决方案。我从大学里了解神经网络,以及它们的工作原理等等。不幸的是,我的实践知识相当贫乏,并且我根本不了解支持OpenCV的支持向量机(SVM)。
所以我的问题实际上与源代码无关,而更多地涉及如何设置学习过程。
- 我应该在普通硬币图像上进行学习,还是应该先提取特征并针对这些特征进行学习? (我认为:特征)
- 每个硬币的正面和反面应该给出多少个示例?
- 我是否还需要在旋转的硬币上进行学习,或者这种旋转会被SVM "自动"处理?因此,即使我只在非旋转的硬币上进行了训练,SVM是否会识别旋转的硬币?
- 我上面的一个图片要求(“DinA4”)限制了硬币的大小,例如图片高度的1/12。我应该在大致相同大小的硬币上进行学习,还是不同大小的硬币? 我认为,不同大小的硬币会产生不同的特征,这对学习过程没有帮助,你认为呢?
当然,如果您有其他可能的解决方案,也欢迎提出!任何帮助都将不胜感激! :-)
再见和谢谢!