使用Microsoft Kinect,我正在收集有关对象的深度数据。从这些数据中,我创建了一个点云(point cloud),当绘制时,它允许我查看使用Kinect扫描的对象。
但是,我希望能够从不同的“视图”中收集多个点云并将它们对齐。更具体地说,我想使用诸如Iterative Closest Point (ICP)之类的算法来实现,通过计算我收集的每个云和以前收集的云之间的旋转和平移来转换点云中的每个点。
然而,虽然我了解ICP背后的过程,但我不知道如何在3D中实现它,也许是我缺乏数学经验,或者缺乏OpenCV等框架的经验,但我找不到解决方案。我想避免使用点云库之类的库,因为我想自己做。
任何和所有的建议都是值得赞赏的(如果有一个涉及OpenCV/python的解决方案,我可以进行研究,那会更好!)
我目前正在与国际比较项目斗争。以下是我迄今为止收集到的资料:
国际比较项目包括三个步骤:
第一步很简单,虽然有很多方法可以优化它的速度,因为这是ICP的主要性能瓶颈;提高精度,因为这是误差的主要来源。OpenCV可以帮助您处理FLANN library。
我想你的麻烦在于第二步,在给出一个对应关系列表的情况下,找到最佳的转换。
一种常见的方法可以与Singular Value Decomposition (SVD)一起使用。这是算法的草图。对ICP&SVD的研究将提供更多的参考。
M=(A1-CA)*(B1-CB)T+。。。+(An-CA)*(Bn-CB)T
的3x3矩阵U和V (OpenCV有一个function to perform SVD)
这是你想要的最佳旋转矩阵。
请注意,我自己还没有实现这个算法,所以我只是解释我读到的内容。
OpenCV-contrib(曲面匹配模块)中提出了一种新的ICP算法。它还受益于各种类型的变体(包括Rusinkievicz等):
http://docs.opencv.org/3.0-beta/modules/surface_matching/doc/surface_matching.html
对于MATLAB实现: http://www.mathworks.co.jp/matlabcentral/fileexchange/47152-icp-registration-using-efficient-variants-and-multi-resolution-scheme/content/icp_mod_point_plane_pyr.m
在Rusinkievicz的旧论文here中可以找到对国际比较项目的非常好的介绍,包括加速变体。
相关问题 更多 >
编程相关推荐