三维点云配准与拼接

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

概述

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

注册两个点云

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

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

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

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

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

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

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

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

缝一个点云序列

要组成一个更大的3d场景,重复上面的步骤来处理一系列点云。利用第一个点云建立参考坐标系。将每个点云转换为参考坐标系统。这个变换是成对变换的乘法。

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