我正在尝试使用OpenCV和SURF方法实现交通标志识别器。我的问题是我得到随机结果(有时真的很准确,有时候显然是错误的)而且我不能解决原因。以下是我实施比较的方式:
轮廓检测非常有效:使用高斯模糊和精细边缘,我设法找到类似于此的轮廓:
然后我提取对应于此轮廓的图像,并将此图像与交通标志模板图像进行比较,如下所示:
cvExtractSURF返回轮廓图像的189个描述符。然后我使用naiveNearestNeighbor方法找出我的轮廓图像和每个模板图像之间的相似性。
以下是我的结果:
6/189 第一个模板(我希望找到的那个)
92/189 第二个模板(在各种方面与轮廓图像明显不同)
我真的不明白这些结果......
以下是我执行的步骤列表:
为了评估两个图像之间的相似性,我使用比率:
goog点数/描述符总数
P.S:有关我遵循本教程的信息:http://www.emgu.com/wiki/index.php/Traffic_Sign_Detection_in_CSharp
并使用OpenCV的find_obj样本在C中进行调整。
答案 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,但我认为它会产生更多误报。