3-d点云登记和拼接

该示例示出如何将多个点云结合以重建使用迭代最近点(ICP)算法的3-d的场景。

概观

本实施例中的线圈一起点云的集合,将其用超高动力学捕获来构造场景的较大3- d视图。示例只ICP两次连续的点云。这种类型的重建的可用于开发对象或构建3-d的世界地图的3-d模型同时定位和地图创建(SLAM)。

注册两个点云

数据文件=完整文件(toolboxdir('视力''visiondata''livingRoom.mat');负载(数据文件);%提取两个连续的点云和使用第一点云中%参考。ptCloudRef = livingRoomData {1};ptCloudCurrent = livingRoomData {2};

配准的质量依赖于数据中的噪声和ICP算法的初始设置。您可以将预处理步骤来过滤噪声或设定的初始属性值适合您的数据。在这里,预处理通过用框电网滤波器进行下采样的数据和电网滤波器的设置大小为10厘米。电网滤波器划分点云空间切块。每个立方体内的点被组合成通过平均它们的X,Y,Z坐标的单个输出点。

gridSize = 0.1;固定= pcdownsample(ptCloudRef,'gridAverage',gridSize);移动= pcdownsample(ptCloudCurrent,'gridAverage',gridSize);%。注意,下采样步骤不仅加快注册,%,但也可以提高精度。

要对齐两个点云,我们使用ICP算法来估算间苗数据3 d刚体变换。我们使用的第一个点云为基准,然后估计改造向原第二点云。我们需要与对齐的点云处理重叠点合并场景的点云。

通过找出与所述第一点云对准第二点云的刚性变换开始。用它来将第二点云变换到参考坐标系统由第一点云定义。

TForm的= pcregistericp(移动,固定,“公制”'pointToPlane'“外推”,真正的);ptCloudAligned = pctransform(ptCloudCurrent,TForm的);

现在,我们可以使用注册数据创造了世界的场景。重叠区域是使用1.5厘米框格的过滤器过滤。增加合并大小,以减少所产生的场景点云的存储需求,并降低合并大小,以增加现场的分辨率。

mergeSize = 0.015;ptCloudScene = pcmerge(ptCloudRef,ptCloudAligned,mergeSize);%可视化输入图像。图副区(2,2,1)imshow(ptCloudRef.Color)标题(“第一输入图像”'颜色''W')的DrawNow副区(2,2,3-)imshow(ptCloudCurrent.Color)标题(“第二输入图像”'颜色''W')的DrawNow%的可视化世界舞台。副区(2,2,[2,4])pcshow(ptCloudScene,“立轴”'Y''VerticalAxisDir''下')标题(“最初的世界舞台”)xlabel('X(米)')ylabel('Y(M)')zlabel('Z(M)')的DrawNow

拼接点云的序列

以构成较大的3-d场景,重复相同的过程与上述处理点云的序列。使用第一个点云建立的参考坐标系。变换的各点云到参考坐标系。这种转变是成对转变的乘法。

%存储转换对象,累计改造。accumTform = TForm的;图hAxes = pcshow(ptCloudScene,“立轴”'Y''VerticalAxisDir''下');标题(“更新世界舞台”%设置轴属性更快的渲染hAxes.CameraViewAngleMode ='汽车';hScatter = hAxes.Children;对于I = 3:长度(livingRoomData)ptCloudCurrent = livingRoomData {I};%用途过去的移动点云作为参考。固定=移动;移动= pcdownsample(ptCloudCurrent,'gridAverage',gridSize);%应用ICP登记。TForm的= pcregistericp(移动,固定,“公制”'pointToPlane'“外推”,真正的);%变换当前点云到参考坐标系%的由第一点云定义。accumTform = affine3d(tform.T * accumTform.T);ptCloudAligned = pctransform(ptCloudCurrent,accumTform);%更新的世界舞台。ptCloudScene = pcmerge(ptCloudScene,ptCloudAligned,mergeSize);%的可视化世界舞台。hScatter.XData = ptCloudScene.Location(:,1);hScatter.YData = ptCloudScene.Location(:,2);hScatter.ZData = ptCloudScene.Location(:,3);hScatter.CData = ptCloudScene.Color;的DrawNow('limitrate'结束

%在录制过程中,Kinect的是指向下方。可视化%的结果更容易,让我们转换数据,以使接地平面平行于X-Z平面%。角= -pi / 10;A = [1,0,0,0;...0,COS(角度),罪(角度),0;...0,-sin(角度),COS(角度),0;...0 0 0 1];ptCloudScene = pctransform(ptCloudScene,affine3d(A));pcshow(ptCloudScene,“立轴”'Y''VerticalAxisDir''下'...“父”,hAxes)标题(“更新世界舞台”)xlabel('X(米)')ylabel('Y(M)')zlabel('Z(M)'