我正在尝试使用OpenCV和SURF方法实现交通标志识别器.我的问题是我得到随机结果(有时真的很准确,有时候显然是错误的)而且我不能解决这个问题.以下是我如何实施比较:
轮廓检测效果非常好:使用高斯模糊和精确边缘,我设法找到类似于这个的轮廓:

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


cvExtractSURF返回轮廓图像的189个描述符.然后我使用naiveNearestNeighbor方法找出我的轮廓图像和每个模板图像之间的相似性.
这是我的结果:
6/189为第一个模板(这是我期待找到的模板)
92/189用于第二个模板(在各个方面与轮廓图像明显不同)
我真的不明白这些结果......
以下是我执行的步骤列表:
为了评估两个图像之间的相似性,我使用比率:
goog点数/描述符总数
PS:有关我遵循本教程的信息:http://www.emgu.com/wiki/index.php/Traffic_Sign_Detection_in_CSharp
并使用OpenCV的find_obj示例在C中进行调整.
SURF描述符适用于比较丰富纹理的图像......我认为在他们的交通标志中没有足够的纹理.
在提取描述符时,首先定位"突出点",例如在两个符号(矩形和字母P)上的矩形标记的角上,然后为它们收集局部属性.就像,一个矩形的角落看起来如何,从近距离,模糊和灰度.
然后,这些描述符与字母P中的矩形角s匹配.它们并非完全不同......(因为我们没有考虑任何形状信息).也许字母P的角落更接近"无入口"标志的角落.随机.
当然,所有这些只是一种推测......唯一可以解决的方法就是彻底调试它.尝试使用找到描述符的小圆圈显示图像(圆圈大小可能取决于找到该点的比例).或者将两个图像放入一个IplImage中,并在匹配的描述符之间绘制线条.像这样的东西:
http://www.flickr.com/photos/22191989@N00/268039276
至于如何解决这个问题...如何使用相同的形状匹配方法来检测交通标志的外部轮廓?(例如,一旦找到符号,您就可以查找P形对象.)