大多数 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
2d 点 fromI_0
已成功匹配到q_1
from I_1
,对应于某个 3d 点Q
。现在,为了确保一致性,考虑 in 的重投影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)
下您的聚合描述符(可以是s_i
相应的 SIFT 描述符的平均值或串联I_i
等)。然后,当与 匹配s_0
时F
,您将只想使用s_i
属于具有接近视点的图像的子集I_0
(因为30deg
您提到的问题,尽管我认为应该是50deg
)。这意味着您必须根据s_i
查询的姿势为每个分配一个权重I_0
。构建时你显然不能这样做F
,所以在匹配的时候必须这样做。但是,您对姿势没有很强的先验性(否则,我认为您不需要 PnP)。因此,您无法真正确定此重量。因此,我认为这里有两个结论/选项:
如果您只在2d
查询点和3d
描述符之间匹配而没有任何形式的一致性检查(正如我之前提出的那样),您将引入很多噪音......
tl;博士我会保留一些图像。
1由于您说您从 SFM 管道获得 3d 重建,因此其中一些可能被认为是内点,有些是异常点(由布尔标志表示)。如果它们是异常值,则忽略它们,如果它们是内部值,则它们是匹配和三角剖分的结果,并且它们的位置已被多次细化,因此您可以信任它们的任何描述符。