与SURF比较的奇怪结果

vda*_*bry 6 opencv surf

我正在尝试使用OpenCV和SURF方法实现交通标志识别器.我的问题是我得到随机结果(有时真的很准确,有时候显然是错误的)而且我不能解决这个问题.以下是我如何实施比较:

  • 首先,我检测到我的图像上的轮廓
  • 然后在每个轮廓上,我使用SURF来查明交通标志是否在里面以及哪个交通标志

轮廓检测效果非常好:使用高斯模糊和精确边缘,我设法找到类似于这个的轮廓:

在此输入图像描述

然后我提取对应于此轮廓的图像,并将此图像与交通标志模板图像进行比较,例如:

在此输入图像描述

在此输入图像描述

cvExtractSURF返回轮廓图像的189个描述符.然后我使用naiveNearestNeighbor方法找出我的轮廓图像和每个模板图像之间的相似性.

这是我的结果:

6/189为第一个模板(这是我期待找到的模板)

92/189用于第二个模板(在各个方面与轮廓图像明显不同)

我真的不明白这些结果......

以下是我执行的步骤列表:

  • 以灰度转动轮廓图像
  • 以灰度转动模板图像
  • 均衡轮廓图像的直方图(cvEqualizeHist)
  • 调整模板图像的大小以使其与轮廓图像匹配
  • 模糊模板图像(cvSmooth)
  • 模糊轮廓图像(cvSmooth)
  • 在模板图像上执行cvExtractSURF
  • 在轮廓图像上执行cvExtractSURF
  • 对于轮廓图像的每个描述符,我做一个naiveNearestNeighbor
  • 我存储了"好"点的数量

为了评估两个图像之间的相似性,我使用比率:

goog点数/描述符总数

PS:有关我遵循本教程的信息:http://www.emgu.com/wiki/index.php/Traffic_Sign_Detection_in_CSharp

并使用OpenCV的find_obj示例在C中进行调整.

Lat*_*ius 6

SURF描述符适用于比较丰富纹理的图像......我认为在他们的交通标志中没有足够的纹理.

在提取描述符时,首先定位"突出点",例如在两个符号(矩形和字母P)上的矩形标记的角上,然后为它们收集局部属性.就像,一个矩形的角落看起来如何,从近距离,模糊和灰度.

然后,这些描述符与字母P中的矩形角s匹配.它们并非完全不同......(因为我们没有考虑任何形状信息).也许字母P的角落更接近"无入口"标志的角落.随机.

当然,所有这些只是一种推测......唯一可以解决的方法就是彻底调试它.尝试使用找到描述符的小圆圈显示图像(圆圈大小可能取决于找到该点的比例).或者将两个图像放入一个IplImage中,并在匹配的描述符之间绘制线条.像这样的东西:

http://www.flickr.com/photos/22191989@N00/268039276

至于如何解决这个问题...如何使用相同的形状匹配方法来检测交通标志的外部轮廓?(例如,一旦找到符号,您就可以查找P形对象.)

  • 我知道这是一个古老的答案,但它帮助我避免使用SURF进行图像匹配应用程序,其中我有类似的纹理不佳的图像.对这些图像的特征提取和比较的良好通用算法的任何建议? (2认同)