使用OpenCV进行硬币模板匹配

时间:2015-09-21 09:43:44

标签: c++ opencv feature-detection feature-extraction knn

我正在进行一个项目,该项目将自动计算输入图像中的硬币值。到目前为止,我已经使用边缘检测和使用霍夫变换进行了一些预处理来分割硬币。

我的问题是如何从这里开始?我需要根据以前存储的一些功能对分割的图像进行一些模板匹配。我怎么能这样做呢。

我还读过一些名为K-Nearest Neighbours的内容,我觉得这是我应该使用的内容。但我不太清楚如何使用它。

我遵循的研究文章:

3 个答案:

答案 0 :(得分:1)

如果您正确检测到所有硬币最好使用尺寸(径向) RGB功能来识别其值。连接这些功能并不是一个好主意,因为它们的数量不相等(大小是一个数字,RGB特征的数量远大于一个)。我建议你为此目的使用两个分类器。一个用于大小,另一个用于RGB功能。

  • 您必须将所有硬币分类为例如3(这取决于类型 你的硬币)大小等级。您可以使用简单的 1NN来完成此操作 分类器(只计算测试硬币的径向并将其分类为 最接近预定义的径向)

  • 然后你应该在每个尺寸中都有一些模板并使用模板匹配来识别它的值。(所有模板和检测到的硬币应该调整到特定的大小。例如(100,100))对于模板 匹配你可以使用matchtemplate函数。我认为 CV_TM_CCOEFF 方法可能是最好的方法,但您可以测试所有方法 获得好成绩。 (请注意,您不需要在图像上搜索硬币,因为您之前检测到的硬币就像您在中提到的那样 题。您只需要使用此函数获取一个数字作为两个图像之间的相似性/差异,并将测试硬币分类为相似性最大化或差异最小化的类别。

EDIT1 :您应该在每个类的模板中进行所有旋转,以补偿测试硬币的旋转。

EDIT2 :如果所有硬币都有不同的尺寸,第一步就足够了。否则,您应该将相似的尺寸修补为一个类,并使用第二步(RGB特征)对测试硬币进行分类。

答案 1 :(得分:-1)

(1)使用Hough Transform Algorithm找到硬币边缘。 (2)确定硬币的原点。我不知道你会怎么做。 (3)您可以使用k中的KNN Algorithm来比较直径或硬币。不要忘记设置偏差值。

答案 2 :(得分:-1)

您可以尝试设置一组硬币图像训练集并生成它的SIFT / SURF等描述符。 (编辑:OpenCV feature detectors 使用这些数据,您可以使用硬币值作为训练标签来设置kNN分类器。

对您的分段硬币图像执行kNN分类后,您的分类结果将产生硬币值。