使用Microsoft Kinect,我正在收集有关对象的深度数据。根据这些数据,我创建了一个点“云”(点云),当绘制时,允许我查看使用Kinect扫描的对象。
但是,我希望能够从不同的“视图”中收集多个点云并对齐它们。更具体地说,我想使用诸如Iterative Closest Point (ICP)之类的算法来实现这一点,通过计算我收集的每个云与之前收集的云之间的旋转和转换来转换点云中的每个点。
然而,虽然我理解ICP背后的过程,但我不明白我将如何在3D中实现它。也许是因为我缺乏数学经验或缺乏OpenCV等框架的经验,但我找不到解决方案。我想避免像Point Cloud Library那样为我做这类事情的图书馆,因为我想自己做。
任何和所有建议都表示赞赏(如果有一个解决方案涉及我可以使用的OpenCV / python,那就更好了!)
答案 0 :(得分:9)
我目前正在与ICP斗争。这是我到目前为止收集的内容:
ICP包括三个步骤:
第一步很容易,虽然有很多方法可以优化其速度,因为这是ICP的主要性能瓶颈;并提高准确性,因为这是错误的主要来源。 OpenCV可以使用FLANN library帮助您。
我认为你的麻烦在第二步,在给出一系列通信的情况下找到最佳转换。
一种常见的方法适用于Singular Value Decomposition (SVD)。这是算法的草图。寻找ICP& SVD将提供更多的参考资料。
请注意我自己还没有实现这个算法,所以我只是解释了我读到的内容。
答案 1 :(得分:4)
可以在Rusinkievicz的旧论文here中找到对ICP的非常好的介绍,包括加速变体。
答案 2 :(得分:2)
新的ICP算法现在在OpenCV contrib(表面匹配模块)中。它还受益于各种类型的变体(包括Rusinkievicz等):
http://docs.opencv.org/3.0-beta/modules/surface_matching/doc/surface_matching.html
答案 3 :(得分:0)
@tdirdal:
好的,我可能没有看到正确的代码。 我在谈论这个包link: 代码从构造转换矩阵开始,然后加载包含网格(面和顶点)的* .ply。其余代码取决于已加载的网格。
我有一个非常简单的问题,如果您能让我知道如何使用ICP方法解决这个问题,我将不胜感激。我有以下两点云。 P2是P39的子集,我想在P39中找到P2。请告诉我如何使用您的matlab软件包来解决这个问题。
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
-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