9

我正在开发一个应用程序,我使用 SIFT + RANSAC 和 Homography 来查找对象(OpenCV C++,Java)。我面临的问题是,在有很多异常值的地方,RANSAC 表现不佳。

出于这个原因,我想尝试一下 SIFT 的作者说的很好:投票。

我读过我们应该在 4 维特征空间中投票,其中 4 维是:

  • 位置 [x, y](有人说 Traslation)
  • 规模
  • 方向

虽然使用 opencv 很容易获得匹配scale并且orientation使用:

cv::Keypoints.octave
cv::Keypoints.angle

我很难理解如何计算位置。

我发现了一个有趣的幻灯片,其中只有one match我们能够绘制一个边界框:

但我不明白如何只用一场比赛就画出那个边界框。有什么帮助吗?

4

3 回答 3

5

您正在寻找适合从图像 1 到图像 2 的几何变换的最大匹配特征集。在这种情况下,它是相似变换,它有 4 个参数:平移(dx, dy)、尺度变化ds和旋转d_theta

假设您已匹配特征:图像 1 中的 f1 和图像 2 中的 f2。设(x1,y1)f1 在图像 1 中的位置,s1设为其比例,theta1设为方向。同样,对于 f2 ,您有(x2,y2)s2和。theta2

两个特征之间的转换是(dx,dy) = (x2-x1, y2-y1).

两个特征之间的尺度变化是ds = s2 / s1

两个特征之间的旋转是d_theta = theta2 - theta1

所以, dx, dy, ds, 和d_theta是霍夫空间的维数。每个 bin 对应一个相似变换。

一旦您执行了 Hough 投票,并找到了最大 bin,该 bin 会为您提供从图像 1 到图像 2 的转换。您可以做的一件事是获取图像 1 的边界框并使用该转换对其进行转换:应用相应的转换,旋转和缩放到图像的角落。通常,您将参数打包到变换矩阵中,并使用齐次坐标。这将为您提供图像 2 中与您检测到的对象相对应的边界框。

于 2013-04-11T03:14:45.377 回答
2

When using the Hough transform, you create a signature storing the displacement vectors of every feature from the template centroid (either (w/2,h/2) or with the help of central moments).

E.g. for 10 SIFT features found on the template, their relative positions according to template's centroid is a vector<{a,b}>. Now, let's search for this object in a query image: every SIFT feature found in the query image, matched with one of template's 10, casts a vote to its corresponding centroid.

votemap(feature.x - a*, feature.y - b*)+=1 where a,b corresponds to this particular feature vector.

If some of those features cast successfully at the same point (clustering is essential), you have found an object instance.

enter image description here

Signature and voting are reverse procedures. Let's assume V=(-20,-10). So during searching in the novel image, when the two matches are found, we detect their orientation and size and cast a respective vote. E.g. for the right box centroid will be V'=(+20*0.5*cos(-10),+10*0.5*sin(-10)) away from the SIFT feature because it is in half size and rotated by -10 degrees.

于 2013-04-11T07:28:14.540 回答
2

为了完成Dima,需要添加 4D 霍夫空间被量化为(可能很小)数量的 4D 框,其中每个框对应于其中心给出的相似度。

然后,对于通过试探性特征匹配获得的每个可能的相似性,将 1 添加到4D 空间中的相应框(或单元格)中。输出相似度由具有更多选票的单元格给出。

为了计算 1 个匹配的变换,只需在他的答案中使用 Dima 的公式。对于几对匹配,您可能需要使用一些最小二乘拟合。

最后,可以使用函数 应用变换cv::warpPerspective(),其中透视矩阵的第三行设置为[0,0,1]

于 2013-04-11T06:56:43.663 回答