与SURF比较的奇怪结果

时间:2011-03-04 11:04:04

标签: opencv surf

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

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

轮廓检测非常有效:使用高斯模糊和精细边缘,我设法找到类似于此的轮廓:

enter image description here

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

enter image description here

enter image description here

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

以下是我的结果:

6/189 第一个模板(我希望找到的那个)

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

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

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

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

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

goog点数/描述符总数

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

并使用OpenCV的find_obj样本在C中进行调整。

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

答案 1 :(得分:0)

  

为了评估两个图像之间的相似性我使用比率:   goog积分数/描述符总数

我认为你需要使用基于描述符向量的度量标准,这是一个糟糕的指标,你必须在点之间使用基本信息。

这是因为类似SIFT的功能只匹配“相同的点”而不是相似的点,也许你可以通过更改匹配条件来调整它。因为在opencv匹配条件中得到最近的点(通过描述符)并检查是否有另一个描述符接近0.6相似度。

描述符匹配包括两个步骤。第一步是David Lowe的简单但强大的匹配算法。更确切地说,为了查看左图像中的描述符A是否与右图像中的某个描述符匹配,我们首先计算左图像中描述符A与所有描述符A之间的欧几里德距离d(A,A')。 '在正确的形象。如果最近的距离,比如说d(A,A1'),小于第二个最近距离的k倍,比如d(A,A2'),那么A和A1'被认为是匹配的。我们设定k = 0.6

也许你可以改变k,但我认为它会产生更多误报。