我正在尝试使用 OpenCV 和 SURF 方法实现交通标志识别器。我的问题是我得到随机结果(有时非常准确,有时显然是错误的),我无法理解为什么。这是我实现比较的方式:
- 首先,我检测图像上的轮廓
- 然后在每个轮廓上,我使用 SURF 来找出里面是否有交通标志以及哪个交通标志
轮廓检测效果很好:使用高斯模糊和精明的边缘,我设法找到了与此类似的轮廓:
然后我提取与该轮廓对应的图像,并将该图像与交通标志模板图像进行比较,例如:
cvExtractSURF 返回轮廓图像的 189 个描述符。然后我使用 naiveNearestNeighbor 方法找出我的轮廓图像和每个模板图像之间的相似性。
这是我的结果:
第一个模板为6/189(这是我希望找到的模板)
第二个模板为92/189(这显然与轮廓图像在各方面都非常不同)
我真的不明白这些结果……</p>
这是我执行的步骤列表:
- 将轮廓图像灰度化
- 将模板图像灰度化
- 均衡轮廓图像的直方图(cvEqualizeHist)
- 调整模板图像的大小以使其与轮廓图像匹配
- 模糊模板图像 (cvSmooth)
- 模糊轮廓图像(cvSmooth)
- 在模板图像上执行 cvExtractSURF
- 在轮廓图像上做一个 cvExtractSURF
- 对于轮廓图像的每个描述符,我做一个 naiveNearestNeighbor
- 我存储“好”点数
为了评估两张图像之间的相似性,我使用了比率:
goog点数/描述符总数
PS:有关我遵循本教程的信息:http ://www.emgu.com/wiki/index.php/Traffic_Sign_Detection_in_CSharp
并使用 OpenCV 的 find_obj 样本在 C 中进行了改编。