【问题标题】:SIFT matches and recognition?SIFT 匹配和识别?
【发布时间】:2013-04-03 01:24:12
【问题描述】:

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

出于这个原因,我想试试 SIFT 的作者说的很不错的方法:投票。

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

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

虽然使用 opencv 很容易匹配 scaleorientation 与:

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

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

我找到了一个interesting slide,其中只有one match 我们能够绘制一个边界框:

但我不明白如何只用一个匹配来绘制那个边界框。有什么帮助吗?

【问题讨论】:

    标签: opencv computer-vision sift object-detection


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 这并没有解释如何绘制一个只有一个匹配的边界框
    • 边界框是通过将最终相似度(从 1 次匹配或从 Hough 投票中获得)应用到模型图像上的蓝色和黄色框来绘制的,然后将其绘制在新图像中。
    • 您能否发布一个关于如何计算最终相似度矩阵的示例(仅考虑一次匹配)?
    【解决方案2】:

    使用 Hough 变换时,您会创建一个签名,用于存储来自模板质心的每个特征的位移向量((w/2,h/2) 或借助中心矩)。

    例如对于模板上找到的 10 个 SIFT 特征,它们根据模板质心的相对位置是vector<{a,b}>。现在,让我们在查询图像中搜索这个对象:在查询图像中找到的每个 SIFT 特征,与模板的 10 个特征中的一个匹配,都会对其对应的质心投一票。

    votemap(feature.x - a*, feature.y - b*)+=1 其中 a,b 对应于这个特定的特征向量。

    如果其中一些特征在同一点成功转换(集群是必不可少的),那么您已经找到了一个对象实例。

    签名和投票是相反的程序。让我们假设V=(-20,-10)。因此,在小说图像中搜索时,当找到两个匹配项时,我们会检测它们的方向和大小并进行相应的投票。例如。因为右边的盒子质心将V'=(+20*0.5*cos(-10),+10*0.5*sin(-10)) 远离 SIFT 特征,因为它是一半大小并旋转了 -10 度。

    【讨论】:

    • 你是什么意思“一场比赛”?匹配特征的本质是什么?一个点 (x,y) 或一个区域 (x,y,a,b,theta),例如您的示例中的黄色框?
    • 然后,您必须在签名中包含 SIFT Descriptor,并从 DescriptorMatcher 中提取匹配补丁的旋转和缩放。
    【解决方案3】:

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

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

    两个特征之间的翻译是(dx,dy) = (x2-x1, y2-y1)

    两个特征之间的比例变化是ds = s2 / s1

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

    所以,dxdydsd_theta 是霍夫空间的维度。每个 bin 对应一个相似变换。

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

    【讨论】:

    • 只有一个匹配,你就不需要霍夫变换了。您获取 x 和 y 的差异(平移)、方向的差异(旋转)和比例(比例)。然后你把它们放到一个矩阵中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2019-01-12
    • 2018-03-18
    相关资源
    最近更新 更多