Matlab 按关键点方向删除错误的匹配项

Matlab 按关键点方向删除错误的匹配项,matlab,opencv,computer-vision,Matlab,Opencv,Computer Vision,给定校准的立体声对,已知以下情况: 相机本质 本质矩阵 相对变换 一组关键点匹配满足极线约束 我想通过将一个关键点的方向投影到另一个图像来过滤错误的匹配,并将其与匹配的关键点的方向进行比较 我的解决方案如下: 给定方向为o1,o2的匹配p1,p2,我通过三角测量计算p1的深度z。我知道创建靠近p1的第二个点时,会朝着方向向量p1'=p1+o1移动几个像素。之后,用z计算p1'的3D点,并将其投影回p2'中的图像2。投影方向现在为o2=p2'-p2 这个算法有效吗?有没有更好的方法,例如使用基本矩

给定校准的立体声对,已知以下情况:

相机本质 本质矩阵 相对变换 一组关键点匹配满足极线约束 我想通过将一个关键点的方向投影到另一个图像来过滤错误的匹配,并将其与匹配的关键点的方向进行比较

我的解决方案如下:

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


这个算法有效吗?有没有更好的方法,例如使用基本矩阵?

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

假设p1被重投影到Q。现在,你说,因为你不知道p''u 1的深度,你把它设置为z,从而将p''u 1反投影到Q'。然而,假设对应于p'1的真实深度是绿色显示的点,Q_t。在这种情况下,第二幅图像中正确的方向是c-b,而根据您的解决方案,我们计算了a-b,这是一个错误的方向

在我看来,一个更好的解决方案是固定两个摄影机中的一个的姿势,对所有匹配进行三角剖分,最好使用稳健的内核进行小束调整,优化所有点,但只优化非固定摄影机。这应该考虑很多异常值。虽然这会改变你对本质的估计,但我认为这很可能会改善它

编辑:

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

在这种情况下,c和a都位于相机2中Q'和相机中心1的投影所给出的极线上。但是,b不在那条线上,而是在对应于Q的极线上。所以,向量a-b和c-b会有一定角度的不同

但该方法还有两个其他问题,与这个问题相关:如何确定向量o1的大小?我认为将其定义为一些小的系数*1/z是个好主意,因为对于遥远的物体,o1需要更小。因此,另外两个问题是

例如,如果您使用的是城市设置,则建筑物有点远,z会增长,o1的大小需要小于一个像素的宽度。 假设你克服了这个问题,那么一些小系数的值将需要分别为不同的图像对确定,如果你从室内到室外呢?。
虽然你的想法一开始听起来很有趣,但我认为它行不通,因为你计算p'深度的方法将不可避免地导致第二幅图像中的关键点方向错误。考虑一下我提出的这个例子:

假设p1被重投影到Q。现在,你说,因为你不知道p''u 1的深度,你把它设置为z,从而将p''u 1反投影到Q'。然而,假设对应于p'1的真实深度是绿色显示的点,Q_t。在这种情况下,第二幅图像中正确的方向是c-b,而根据您的解决方案,我们计算了a-b,这是一个错误的方向

在我看来,一个更好的解决方案是固定两个摄影机中的一个的姿势,对所有匹配进行三角剖分,最好使用稳健的内核进行小束调整,优化所有点,但只优化非固定摄影机。这应该考虑很多异常值。虽然这会改变你对本质的估计,但我认为这很可能会改善它

编辑:

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

在这种情况下,c和a都位于相机2中Q'和相机中心1的投影所给出的极线上。但是,b不在那条线上,而是在对应于Q的极线上。所以,向量a-b和c-b会有一定角度的不同

但该方法还有两个其他问题,与这个问题相关:如何确定向量o1的大小?我想它是 将其定义为一些较小的系数*1/z是个好主意,因为对于远处的对象,o1需要更小。因此,另外两个问题是

例如,如果您使用的是城市设置,则建筑物有点远,z会增长,o1的大小需要小于一个像素的宽度。 假设你克服了这个问题,那么一些小系数的值将需要分别为不同的图像对确定,如果你从室内到室外呢?。
您的示例是正确的,但实际图像中不太可能出现这种情况。让我们假设Q_t是实点,p'1与p1足够接近,因此Q和Q_t之间存在连接,例如曲面。这意味着摄影机1从右侧看到曲面Q_t,而摄影机2从左侧看到曲面。我认为这样的特性匹配不会通过典型的测试比率测试+阈值。编辑:我的假设是,关键点可以看作是平面圆盘或四边形。谢谢你指出这一点。我最初想到了一个更现实的反例,但出于可视性的考虑,我选择了它。我编辑了答案来讨论那个更真实的例子。此外,我还考虑了另外两个问题,您可能会感兴趣。@dari顺便说一句,我很想知道您对编辑的看法。特别是在你发现他们软弱/错误的情况下,如果你能给我解释并纠正我,我将不胜感激。但是如果你没有时间,我当然会理解的。谢谢我认为o1的大小并不是一个真正的问题,因为像sift这样的特征描述符通常在关键点周围采样半径为16或更大的四分之一。对于更大的尺度,这个半径将比初始分辨率更大,因此选择比半径小的尺寸应该是好的。我目前的想法是我的算法是错误的,因为第二张图像中的方向取决于曲面法线,并且估计法线垂直于摄影机1,所以相同的z值不起作用。您的示例是正确的,但实际图像中不太可能发生这种情况。让我们假设Q_t是实点,p'1与p1足够接近,因此Q和Q_t之间存在连接,例如曲面。这意味着摄影机1从右侧看到曲面Q_t,而摄影机2从左侧看到曲面。我认为这样的特性匹配不会通过典型的测试比率测试+阈值。编辑:我的假设是,关键点可以看作是平面圆盘或四边形。谢谢你指出这一点。我最初想到了一个更现实的反例,但出于可视性的考虑,我选择了它。我编辑了答案来讨论那个更真实的例子。此外,我还考虑了另外两个问题,您可能会感兴趣。@dari顺便说一句,我很想知道您对编辑的看法。特别是在你发现他们软弱/错误的情况下,如果你能给我解释并纠正我,我将不胜感激。但是如果你没有时间,我当然会理解的。谢谢我认为o1的大小并不是一个真正的问题,因为像sift这样的特征描述符通常在关键点周围采样半径为16或更大的四分之一。对于更大的尺度,这个半径将比初始分辨率更大,因此选择比半径小的尺寸应该是好的。我目前的想法是我的算法是错误的,因为第二幅图像中的方向取决于曲面法线,并且估计法线垂直于摄影机1,所以相同的z值不起作用。