SIFT 匹配和识别?

9
我正在开发一个应用程序,使用SIFT + RANSAC和Homography来查找对象(OpenCV C ++,Java)。 我面临的问题是,在存在许多离群值时,RANSAC的性能很差。
因此,出于这个原因,我想尝试一下SIFT作者所说的投票方法,据说效果不错。
我已经阅读了我们应该在4维特征空间中投票的内容,其中4个维度为:
- 位置[x,y](有人称为平移) - 缩放 - 方向
而使用opencv可以轻松获得匹配的比例和方向:
cv::Keypoints.octave
cv::Keypoints.angle

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

我发现了一个有趣的幻灯片,在这个幻灯片中,只有一个匹配项我们就能画出一个边界框:

但我不明白如何仅使用一个匹配项就可以绘制该边界框。需要帮助吗?

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对应于相似变换。
一旦您进行了霍夫投票并找到了最大的bin,该bin会给您提供从图像1到图像2的变换。您可以做的一件事是使用该变换获取图像1的边界框,并将其转换:将相应的平移、旋转和缩放应用于图像的角落。通常,您将参数打包到变换矩阵中,并使用齐次坐标。这将为您提供在图像2中对应于检测到的对象的边界框。

1
只有一个匹配项时,您不需要使用霍夫变换。您需要获取x和y的差异(平移),方向的差异(旋转)以及比例尺的比率(缩放)。然后将它们放入矩阵中。 - Dima

2
要完成Dima的工作,需要将4D霍夫空间量化为(可能很少的)一些4D盒子,其中每个盒子对应于其中心给定的相似性。
然后,对于通过试探匹配特征获得的每种可能的相似性,在4D空间中的相应盒子(或单元格)中加1。输出相似性由票数更多的单元格给出。
为了计算从1个匹配到另一个匹配的变换,只需使用Dima在他的答案中提供的公式。对于几个匹配对,您可能需要使用一些最小二乘拟合。
最后,可以使用函数cv :: warpPerspective()应用变换,其中透视矩阵的第三行设置为[0,0,1]。

这并不解释如何使用仅有一个匹配来绘制边界框。 - dynamic
通过将最终相似度(从1个匹配或Hough投票中获得)应用于模型图像上的蓝色和黄色框,然后在新颖图像中绘制它来绘制边界框。 - sansuiso
你能否提供一个示例来计算最终相似矩阵(仅考虑一次匹配)? - dynamic

2
在使用Hough变换时,您需要创建一个特征签名并存储每个特征相对于模板质心的位移向量(可以是(w/2,h/2)或通过中心矩计算得到)。比如在模板上找到了10个SIFT特征,它们相对于模板重心的相对位置就是一个vector<{a,b}>。然后,在查询图像中搜索这个对象:查询图像中每个与模板的10个特征之一匹配的SIFT特征都会为其相应的质心投票。 votemap(feature.x - a*, feature.y - b*)+=1其中a,b对应于此特定特征向量。
如果某些特征在同一点成功投票(聚类是必不可少的),则找到了一个对象实例。
签名和投票是反向过程。假设V=(-20,-10)。因此,在新图像中进行搜索时,当发现两个匹配项时,我们检测它们的方向和大小,并分别投票。例如,对于右边的框,质心将远离SIFT特征V'=(+20*0.5*cos(-10),+10*0.5*sin(-10)),因为它缩小了一半并旋转了-10度。

你说的“一次匹配”是什么意思?匹配特征的本质是什么?是一个点(x,y)还是一个区域(x,y,a,b,theta),就像你的示例中的黄色框? - LovaBill
然后,您将需要在签名中包含SIFT描述符,并从DescriptorMatcher中提取匹配补丁的旋转和缩放。 - LovaBill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接