我使用SfM创建了一个不规则(非平面)复杂对象的点云。这些3D点中的每一个都在多个图像中被查看,因此它具有与之相关的多个(SIFT)特征。
现在,我想使用PnP算法在新的不同图像集中求解此对象的姿势,该算法将新图像中检测到的特征与点云中的3D点相关联的特征进行匹配。
所以我的问题是:我将哪个描述符与3D点相关联以获得最佳结果?
到目前为止,我已经提出了许多可能的解决方案......
-30
,10
和40
度(从曲面法线)拍摄的图像中,请使用10
度图像中的描述符。对我来说,这似乎是最有希望的解决方案。有没有一种标准的方法可以做到这一点?我无法在网上找到关于这个问题的任何研究或建议,所以我真的很好奇是否有最佳解决方案,或者它是否取决于对象/情况。
答案 0 :(得分:0)
在大多数SLAM或SFM系统中用于匹配的描述符是旋转和尺度不变的(在某种程度上,对强度变化具有鲁棒性)。这就是为什么我们能够首先从不同的观点匹配它们。因此,一般来说,尝试全部使用它们,平均它们或使用特定图像中的那些没有多大意义。如果您的SFM中的匹配正确完成,那么在任何观察中从您的点云重新投射3d
点的描述符应非常接近,因此您可以使用它们中的任何一个 1
另外,在我看来,您试图直接将2d
点与3d
点匹配。从计算的角度来看,我认为这不是一个好主意,因为通过将2d
点与3d
点匹配,您会丢失图像的空间信息,并且必须在蛮力的态度。这反过来会引入噪音。但是,如果你从图像到图像进行匹配,然后将结果传播到3d点,你将能够强制执行先验(如果你大致知道你在哪里,即来自IMU,或者如果你知道你的图像很接近),你可以确定你在图像中寻找匹配的邻域等。此外,一旦你计算了你的姿势并对其进行了改进,你需要增加更多的分数,不是吗?如果您没有进行任何2d/2d
匹配,只有2d/3d
匹配,您将如何做?
现在,实现的方式通常取决于您的应用程序(您在SFM的姿势之间有多少可见性或基线等)。例如,让我们记下您的候选图像I_0
,然后记下您的SFM I_1, ..., I_n
中的图像。首先,在I_0
和I_1
之间进行匹配。现在,假设q_0
是I_0
的第2个点,已成功匹配q_1
I_1
,相当于某个3d点Q
。现在,为了确保一致性,请考虑Q
中I_2
的重新投影,并将其称为q_2
。匹配I_0
和I_2
。 q_0
中I_2
匹配的点是否接近q_2
?如果是,请在2d/3d
和q_0
之间保持Q
匹配,依此类推。
我没有足够的有关您的数据和应用程序的信息,但我认为根据您的限制(实时与否等),您可以提出上述的一些变体。无论如何,关键的想法是,正如我之前所说,尝试在帧与帧之间进行匹配,然后传播到3d案例。
修改:感谢您在评论中的澄清。以下是一些想法(随意纠正我):
让我们考虑来自s_0
的SIFT描述符I_0
,让我们注意F(s_1,...,s_n)
您的聚合描述符(可以是SIFT描述符的平均值或串联{{1}在相应的s_i
等中。然后,当I_i
与s_0
匹配时,您只想使用属于F
关闭视点的图像的s_i
子集(因为{{ 1}}你提到的问题,虽然我认为它应该是I_0
)。这意味着您必须将权重归因于每个30deg
,这取决于您的查询50deg
的姿势。在构建s_i
时你显然不能这样做,所以你必须在匹配时这样做。但是,你没有强烈的姿势优先(否则,我认为你不需要PnP)。结果,你无法真正确定这个重量。因此,我认为这里有两个结论/选项:
SIFT描述符不适合该任务。您可以尝试使用透视不变的描述符。有一些关于这个主题的文献。
尝试以“关键帧”的形式保留一些视觉信息,就像许多SLAM系统一样。无论如何都要保留所有图像是没有意义的,只需在每个区域保留一些分布均匀(姿势明确)的图像,然后使用这些图像将二维匹配传播到三维图像。
如果您只在查询的I_0
点和F
描述符之间进行匹配而没有任何形式的一致性检查(就像我之前提出的那样),您将引入大量噪音......
tl; dr我会保留一些图像。
1 因为你说你从SFM pipline获得了3d重建,所以它们中的一些可能被认为是内点,有些是异常值(用布尔标志表示)。如果它们是异常值,只要忽略它们,如果它们是内点,则它们是匹配和三角测量的结果,并且它们的位置已被多次改进,因此您可以信任它们的任何描述符。