通过关键点方向删除错误的匹配

时间:2017-07-24 11:25:13

标签: matlab opencv computer-vision

鉴于已校准的立体声对,我们知道以下事项:

  • Camera Intrinsics
  • 基本矩阵
  • 相对转型
  • 一组关键点匹配(匹配满足极线约束)

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

我的解决方案想法如下:

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

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

1 个答案:

答案 0 :(得分:4)

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

enter image description here

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

在我看来,一个更好的解决方案是修复两个摄像头中的一个的姿势,对你拥有的所有匹配进行三角测量,并进行小的调整(最好使用强大的内核),你可以优化所有的点但只有非固定相机。这应该照顾很多异常值。它会改变你对Essential的估计,但我认为它很可能会改善它。

修改:

上面的例子使用了很长的距离来获得可见性,并且从a,bc不一定是共线的事实中抽象出来。但是,假设p'1足够接近p1,因此Q'接近Q。我想我们可以同意,通过测试的大多数匹配都将采用与此类似的配置:

enter image description here

在这种情况下,ca都位于相机2中Q'和相机中心1投影所给出的极线上。但是,{{ 1}}不在该行上(它位于对应于b的极线上)。因此,向量Qa-b在某种程度上会有所不同。

但是该方法还存在另外两个与此问题相关的问题:如何确定向量c-b的大小?我认为将它定义为o1是个好主意,因为some_small_coef*(1/z)对于远程对象需要更小。所以,另外两个问题是

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