平均SIFT特征进行姿态估计

时间:2018-05-26 23:57:54

标签: computer-vision sift 3d-reconstruction pose-estimation structure-from-motion

我使用SfM创建了一个不规则(非平面)复杂对象的点云。这些3D点中的每一个都在多个图像中被查看,因此它具有与之相关的多个(SIFT)特征。

现在,我想使用PnP算法在新的不同图像集中求解此对象的姿势,该算法将新图像中检测到的特征与点云中的3D点相关联的特征进行匹配。

所以我的问题是:我将哪个描述符与3D点相关联以获得最佳结果?

到目前为止,我已经提出了许多可能的解决方案......

  1. 平均与3D点相关的所有描述符(取自SfM管道)并使用该“均值描述符”在PnP中进行匹配。这种方法对我来说似乎有点牵强 - 我不太了解特征描述符(特别是SIFT)来评论这种方法的优点和缺点。
  2. 将Pin在SfM管道中计算的所有描述符“Pin”到其关联的3D点。在PnP期间,您基本上会有重复的点来匹配(每个描述符一个重复)。这显然很密集。
  3. 找到该要素出现的“中心”视点(来自SfM管道),并使用此视图中的描述符进行PnP匹配。因此,如果要素出现在-301040度(从曲面法线)拍摄的图像中,请使用10度图像中的描述符。对我来说,这似乎是最有希望的解决方案。
  4. 有没有一种标准的方法可以做到这一点?我无法在网上找到关于这个问题的任何研究或建议,所以我真的很好奇是否有最佳解决方案,或者它是否取决于对象/情况。

1 个答案:

答案 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_0I_1之间进行匹配。现在,假设q_0I_0的第2个点,已成功匹配q_1 I_1,相当于某个3d点Q。现在,为了确保一致性,请考虑QI_2的重新投影,并将其称为q_2。匹配I_0I_2q_0I_2匹配的点是否接近q_2?如果是,请在2d/3dq_0之间保持Q匹配,依此类推。

我没有足够的有关您的数据和应用程序的信息,但我认为根据您的限制(实时与否等),您可以提出上述的一些变体。无论如何,关键的想法是,正如我之前所说,尝试在帧与帧之间进行匹配,然后传播到3d案例。

修改:感谢您在评论中的澄清。以下是一些想法(随意纠正我):

  1. 让我们考虑来自s_0的SIFT描述符I_0,让我们注意F(s_1,...,s_n)您的聚合描述符(可以是SIFT描述符的平均值或串联{{1}在相应的s_i等中。然后,当I_is_0匹配时,您只想使用属于F关闭视点的图像的s_i子集(因为{{ 1}}你提到的问题,虽然我认为它应该是I_0)。这意味着您必须将权重归因于每个30deg,这取决于您的查询50deg的姿势。在构建s_i时你显然不能这样做,所以你必须在匹配时这样做。但是,你没有强烈的姿势优先(否则,我认为你不需要PnP)。结果,你无法真正确定这个重量。因此,我认为这里有两个结论/选项:

    • SIFT描述符不适合该任务。您可以尝试使用透视不变的描述符。有一些关于这个主题的文献。

    • 尝试以“关键帧”的形式保留一些视觉信息,就像许多SLAM系统一样。无论如何都要保留所有图像是没有意义的,只需在每个区域保留一些分布均匀(姿势明确)的图像,然后使用这些图像将二维匹配传播到三维图像。

  2. 如果您只在查询的I_0点和F描述符之间进行匹配而没有任何形式的一致性检查(就像我之前提出的那样),您将引入大量噪音......

  3. tl; dr我会保留一些图像。

    1 因为你说你从SFM pipline获得了3d重建,所以它们中的一些可能被认为是内点,有些是异常值(用布尔标志表示)。如果它们是异常值,只要忽略它们,如果它们是内点,则它们是匹配和三角测量的结果,并且它们的位置已被多次改进,因此您可以信任它们的任何描述符。