计算两组点之间的三维变换

时间:2013-12-11 19:20:08

标签: python opencv computer-vision

使用Microsoft Kinect,我正在收集有关对象的深度数据。根据这些数据,我创建了一个点“云”(点云),当绘制时,允许我查看使用Kinect扫描的对象。

但是,我希望能够从不同的“视图”中收集多个点云并对齐它们。更具体地说,我想使用诸如Iterative Closest Point (ICP)之类的算法来实现这一点,通过计算我收集的每个云与之前收集的云之间的旋转和转换来转换点云中的每个点。

然而,虽然我理解ICP背后的过程,但我不明白我将如何在3D中实现它。也许是因为我缺乏数学经验或缺乏OpenCV等框架的经验,但我找不到解决方案。我想避免像Point Cloud Library那样为我做这类事情的图书馆,因为我想自己做。

任何和所有建议都表示赞赏(如果有一个解决方案涉及我可以使用的OpenCV / python,那就更好了!)

4 个答案:

答案 0 :(得分:9)

我目前正在与ICP斗争。这是我到目前为止收集的内容:

ICP包括三个步骤:

  • 给定两个点云A和B,找到A和B之间的点对,可能表示空间中的相同点。通常只需将每个点与其他云中的最近邻点匹配即可完成,但您可以使用其他功能(如颜色,纹理或曲面法线)来改善匹配。然后,您可以选择丢弃最差的匹配项。
  • 鉴于此对应列表对,找到从A到B的最佳转换
  • 将此转换应用于A
  • 中的所有点
  • 重复这三个步骤,直到您收敛于可接受的解决方案。

第一步很容易,虽然有很多方法可以优化其速度,因为这是ICP的主要性能瓶颈;并提高准确性,因为这是错误的主要来源。 OpenCV可以使用FLANN library帮助您。

我认为你的麻烦在第二步,在给出一系列通信的情况下找到最佳转换。

一种常见的方法适用于Singular Value Decomposition (SVD)。这是算法的草图。寻找ICP& SVD将提供更多的参考资料。

  • 取对应点A 1 的列表.A n 和B 1 .. B n 从第1步
  • 计算A中所有点的质心C a 和B中所有点的质心C b
  • 计算3x3协方差矩阵M
    M =(A 1 - C a )*(B 1 - C b T < / sup> + ... +(A n - C a )*(B n - C b T
  • 使用SVD计算M×的3x3矩阵U和V. (OpenCV有一个function to perform SVD
  • 计算R = U * V T 这是您想要的最佳旋转矩阵。
  • 计算最佳平移为C b - R * C a
  • 最佳转换是R和此翻译的组合

请注意我自己还没有实现这个算法,所以我只是解释了我读到的内容。

答案 1 :(得分:4)

可以在Rusinkievicz的旧论文here中找到对ICP的非常好的介绍,包括加速变体。

答案 2 :(得分:2)

答案 3 :(得分:0)

@tdirdal:

好的,我可能没有看到正确的代码。 我在谈论这个包link: 代码从构造转换矩阵开始,然后加载包含网格(面和顶点)的* .ply。其余代码取决于已加载的网格。

我有一个非常简单的问题,如果您能让我知道如何使用ICP方法解决这个问题,我将不胜感激。我有以下两点云。 P2是P39的子集,我想在P39中找到P2。请告诉我如何使用您的matlab软件包来解决这个问题。

P2:

11.2706 -5.3392 1.1903

13.6194 -4.8500 2.6222

8.8809 -3.8407 1.1903

10.7704 -2.1800 2.6222

8.5570 -1.0346 1.1903

13.1808 -2.5632 1.1903

P39:

-1.9977 -4.1434 -1.6750

-4.3982 -3.5743 -3.1069

-6.8065 -3.0071 -1.6751

-9.2169 -2.4386 -3.1070

-11.6285 -1.8696 -1.6751

-16.4505 -0.7305 -1.6751

-14.0401 -1.3001 -3.1070

-18.8577 -0.1608 -3.1070

-25.9398 -0.8647 -3.1070

-30.1972 -4.6857 -3.1069

-28.2349 -2.5200 -3.1069

-29.5843 -0.2496 -1.6751

-31.1688 -2.0974 -3.1070

-21.2580 0.4093 -1.6751

-23.6450 0.9838 -3.1070

-26.0636 1.5073 -1.6751

-28.4357 1.9258 -3.1070