6

我正在尝试使用 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 中进行了改编。

4

2 回答 2

6

SURF 描述符非常适合比较纹理丰富的图像......我认为交通标志中没有足够的纹理供他们使用。

提取描述符时,首先定位“显着点”,在您的情况下,例如在两个标志(矩形和字母 P)上的矩形标记的角处,然后为它们收集局部属性。就像,从特写、模糊和灰度看,矩形的角是什么样子。

然后,这些描述符与字母 P 中的角矩形匹配。它们并没有那么不同……(因为我们没有考虑任何形状信息)。也许字母 P 的角更接近“禁止进入”标志的角。随机。

当然,这一切都只是一种猜测……唯一弄清楚的方法就是彻底调试它。尝试在找到描述符的地方显示带有小圆圈的图像(圆圈大小可能取决于找到点的比例)。或者将两个图像放入一个 IplImage 并在匹配的描述符之间画线。像这样的东西:

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

至于如何解决这个问题……对于用于检测交通标志的外部轮廓的内部形状匹配方法如何?(例如,您可以在找到标志后寻找 P 形物体。)

于 2011-03-05T20:57:37.737 回答
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,但我认为它会产生更多的误报。

于 2012-04-26T11:51:31.707 回答