主要内容

三维点云配准与拼接

这个例子展示了如何结合多个点云来重建三维场景使用迭代最近点(ICP)算法。

概述

这个例子将Kinect捕获的点云集合拼接在一起,以构建更大的3d场景视图。该示例将ICP应用于两个连续的点云。这种类型的重建可用于开发对象的3-D模型或构建3-D世界地图,用于同时定位和映射(SLAM)。

注册两点云

dataFile = 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”“推断”,真正的);ptcloudalsigned = pctransform(ptCloudCurrent,tform);

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

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

图中包含2个轴对象。第一个输入图像包含一个image类型的对象。第二个输入图像包含一个image类型的对象。

drawnow

缝合点云序列

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

存储累积转换的转换对象。accumTform = tform;figure hAxes = pcshow(ptCloudScene,“VerticalAxis”“Y”“VerticalAxisDir”“下来”);标题(“更新的世界场景”设置axis属性以更快地呈现hax。CameraViewAngleMode =“汽车”;hScatter = hAxes.Children;i = 3:length(livingRoomData) ptCloudCurrent = livingRoomData{i};%使用之前移动的点云作为参考。固定=移动;移动= pcdownsample(ptCloudCurrent,“gridAverage”, gridSize);申请ICP注册。Tform = pcregistericp(移动,固定,“指标”“pointToPlane”“推断”,真正的);将当前点云转换为参考坐标系%由第一个点云定义。伏窗体= rigidtform3d(伏窗体。A);ptcloudalsigned = pctransform(ptCloudCurrent,accumTform);更新世界场景。ptCloudScene = pcmerge(ptCloudScene, ptcloudalsigned,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;翻译= [0,0,0];Tform = rigidtform3d([角度,0,0],平移);ptCloudScene = pctransform(ptCloudScene,tform);pcshow (ptCloudScene“VerticalAxis”“Y”“VerticalAxisDir”“下来”...“父”hax)标题(“更新的世界场景”)包含(“X (m)”) ylabel (“Y (m)”) zlabel (“Z (m)”