【问题标题】:Remove wrong matches by keypoint orientation按关键点方向删除错误匹配
【发布时间】:2017-07-27 16:54:02
【问题描述】:

给定一个校准的立体声对,已知以下内容:

  • 相机内部函数
  • 基本矩阵
  • 相对变换
  • 一组关键点匹配(匹配满足极线约束)

我想通过将一个关键点的方向“投影”到另一张图像并将其与匹配的关键点的方向进行比较来过滤掉错误的匹配项。

我的解决思路如下:

给定方向 (o1,o2) 的匹配 (p1,p2),我通过三角测量计算 p1 的深度 z。我知道创建靠近 p1 的第二个点,将几个像素移向方向矢量 p1' = p1 + o1。之后,您使用 z 计算 p1' 的 3D 点,并将其投影回图像 2,在 p2' 中产生。投影方向现在是 o2 = p2'-p2。

该算法有效吗?有没有更好的方法(例如使用基本矩阵)?

【问题讨论】:

    标签: matlab opencv computer-vision


    【解决方案1】:

    虽然您的想法起初听起来很有趣,但我认为它行不通,因为您计算 p' 深度的方式将不可避免地导致第二张图像中的关键点方向错误。考虑一下我想出的这个例子:

    假设p1 被重新投影到Q。现在,您说由于您无法知道p'_1 的深度,因此将其设置为z,从而将p'_1 反投影到Q'。但是,假设对应于p'1 的真实深度是绿色显示的点Q_t。在这种情况下,第二张图片中的正确方向是c-b,而根据您的解决方案,我们计算出a-b,这是一个错误的方向。

    在我看来,一个更好的解决方案是固定两个摄像头之一的姿势,对所有匹配项进行三角测量,然后做一个小的捆绑调整(最好使用稳健的内核),优化所有点但只有非固定摄像头。这应该处理很多异常值。虽然它会改变你对 Essential 的估计,但我认为它可能会改进它。

    编辑:

    上面的示例使用大距离来实现可见性,并从a,bc 不一定共线的事实中抽象出来。但是,假设p'1p1 足够接近,因此Q'Q 很接近。我认为我们可以同意,大多数通过测试的匹配项的配置类似于:

    在这种情况下,ca 都位于摄像机 2 中 Q' 和摄像机中心 1 的投影给出的核线上。但是,b 不在该线上(它位于对应于Q 的极线上)。所以,向量a-bc-b 会在某个角度上有所不同。

    但是该方法还有另外两个问题,与这个问题有关:你如何确定向量o1 的大小?我认为将其定义为some_small_coef*(1/z) 是个好主意,因为o1 对于远处的物体需要更小。所以,另外两个问题是

    • 如果您在城市环境中,例如,建筑物有点远,z 会增长,o1 的大小将需要小于一个像素的宽度。
    • 假设你克服了这个问题,那么some_small_coef 的值将需要为不同的图像对分别确定(如果你从室内到室外怎么办?)。

    【讨论】:

    • 您的示例是正确的,但在实际图像中发生这种情况的可能性很小。假设 Q_t 是实点,并且 p'1 与 p1 足够接近,因此 Q 和 Q_t 之间存在连接(例如表面)。这意味着相机 1 从右侧看到表面 (Q_t,Q),而相机 2 从左侧看到表面。我认为这样的功能匹配不会通过典型的测试(比率测试+阈值)。编辑:另外我的假设是关键点可以被视为平面圆盘(或四边形)。
    • 感谢您指出这一点。我最初想到了一个更现实的反例,但为了可见性而省略了它。我编辑了答案以讨论更典型的例子。此外,我还考虑了另外两个您可能感兴趣的问题。
    • @dari 顺便说一句,我真的很想知道您对编辑的看法。尤其是在您发现它们薄弱/错误的情况下,如果您能给出解释并纠正我,我将不胜感激。当然,如果你没有时间,我会理解的。谢谢!
    • 我认为o1 的大小并不是真正的问题,因为特征描述符(如筛选)通常在关键点周围对半径为 16 或更大的四边形进行采样。对于更大的比例,这个半径甚至会比初始分辨率更大,所以选择比半径小的尺寸应该没问题。
    • 我目前的想法是我的算法是错误的,因为第二张图像中的方向取决于表面法线并且估计法线垂直于相机 1(相同的 z 值)不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2020-02-29
    • 2013-06-05
    • 2013-11-28
    • 2021-07-20
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多