文档

三维点云配准与拼接

这个例子展示了如何使用迭代最近点(ICP)算法组合多个点云来重建一个3-D场景。

概述

这个例子将Kinect捕捉到的点云集合在一起,以构建更大的3d场景视图。该实例将ICP应用于两个连续的点云。这种类型的重建可用于开发物体的3-D模型或为同时定位和绘图(SLAM)构建3-D世界地图。

点状云

外部= fullfile (toolboxdir (“愿景”),“visiondata”“livingRoom.mat”);负载(功能);提取两个连续的点云,使用第一个点云作为%的参考。ptCloudRef = livingRoomData {1};ptCloudCurrent = livingRoomData {2};

配准的质量取决于数据噪声和ICP算法的初始设置。您可以应用预处理步骤来过滤噪声或设置适合您的数据的初始属性值。在这里,使用矩形网格滤波器对数据进行下采样预处理,并设置网格滤波器的大小为10cm。网格过滤器将点云空间分割成立方体。通过平均每个立方体中的X、Y、Z坐标,将它们组合成单个输出点。

gridSize = 0.1;固定= pcdownsample (ptCloudRef,“gridAverage”, gridSize);移动= pcdownsample (ptCloudCurrent,“gridAverage”, gridSize);请注意,下采样步骤不仅加快注册速度,%,还可以提高准确度。

为了对齐两点云,我们使用ICP算法估计下采样数据的三维刚性变换。我们使用第一个点云作为参考,然后对原始的第二个点云应用估计变换。我们需要将场景点云与对齐的点云合并来处理重叠的点。

首先,找到用于将第二个点云与第一个点云对齐的刚性转换。使用它将第二个点云转换为由第一个点云定义的参考坐标系。

Tform = pcregistericp(移动,固定,“指标”“pointToPlane”“推断”,真正的);ptCloudAligned = pctransform (ptCloudCurrent tform);

现在,我们可以用注册的数据创建世界场景。重叠区域使用1.5cm的盒子网格过滤器进行过滤。增加合并大小以减少对生成的场景点云的存储需求,减少合并大小以增加场景分辨率。

mergeSize = 0.015;ptCloudScene = pcmerge(ptclouddref, ptclouddalign, mergeSize);可视化输入图像。图subplot(2,2,1) imshow(ptCloudRef.Color)标题(“第一输入图像”“颜色”' w ') drawnow subplot(2,2,3) imshow(ptCloudCurrent.Color) title(“第二个输入图像”“颜色”' w ') drawnow形象化世界场景。次要情节(2 2(2、4))pcshow (ptCloudScene,“VerticalAxis”“Y”“VerticalAxisDir”“下来”)标题(“初始世界舞台”)包含(“X (m)”) ylabel (“Y (m)”) zlabel (“Z (m)”

drawnow

缝合点云序列

要合成一个更大的3-D场景,重复上面相同的过程来处理一系列的点云。利用第一个点云建立参考坐标系。将每个点云转换为参考坐标系。这个变换是成对变换的乘法。

存储累积转换的转换对象。accumTform = tform;图hAxes = pcshow(ptCloudScene,“VerticalAxis”“Y”“VerticalAxisDir”“下来”);标题(“更新世界舞台”%设置轴线属性以加快渲染速度hax。CameraViewAngleMode =“汽车”;hScatter = hAxes.Children;i = 3:长度(livingRoomData) ptCloudCurrent = livingRoomData{i};使用之前的移动点云作为参考。固定=移动;移动= pcdownsample (ptCloudCurrent,“gridAverage”, gridSize);申请ICP注册。Tform = pcregistericp(移动,固定,“指标”“pointToPlane”“推断”,真正的);%将当前点云转换为参考坐标系%由第一个点云定义。accumTform = affine3d (tform。T * accumTform.T);ptcloudalign = pctransform(ptCloudCurrent, accumTform);更新世界场景。ptCloudScene = pcmerge(ptCloudScene, ptclouddalign, 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平面。角= -π/ 10;一个= 1,0,0,0;...0 cos(角)sin(角)0;...0, -sin(角)cos(角)0;...1 0 0 1];ptCloudScene = pctransform(ptCloudScene, affine3d(A));pcshow (ptCloudScene“VerticalAxis”“Y”“VerticalAxisDir”“下来”...“父”hax)标题(“更新世界舞台”)包含(“X (m)”) ylabel (“Y (m)”) zlabel (“Z (m)”