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

nma*_*rko 6 python opencv computer-vision

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

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

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

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

Hug*_*une 9

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

ICP包括三个步骤:

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

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

我假设你的麻烦在第二步,找到一个对应列表的最佳转换.

一种常见的方法适用于奇异值分解(SVD).这是算法的草图.搜索ICP和SVD将提供更多参考.

  • 从步骤1中取出对应点A 1 ..A n和B 1 ..B n的列表
  • 计算质心Ç 一个所述的所有点和所述质心Ç b B中的所有点的
  • 计算3x3协方差矩阵M
    M =(A 1 - C a)*(B 1 - C b)T + ... +(A n - C a)*(B n - C b)T
  • 使用SVD计算M的3x3矩阵U和V
    (OpenCV具有执行SVD功能)
  • 计算R = U*V Ť.
    这是您想要的最佳旋转矩阵.
  • 计算最佳平移为C b - R*C a
  • 最佳转换是R和这种转换的组合

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