主要内容

3-D点云配准与拼接

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

概述

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

登记两点云

外部= fullfile (toolboxdir ('想象'),'VisionData''livingroom.mat');加载(数据文件);%提取两个连续的点云并使用第一点云作为% 参考。ptCloudRef = livingRoomData {1};ptCloudCurrent = livingRoomData {2};

注册质量取决于ICP算法的数据噪声和初始设置。您可以应用预处理步骤以过滤噪声或设置适合您数据的初始属性值。在此,通过使用盒式网格滤波器对数据进行预处理,并将网格滤波器的大小设置为10cm。网格筛选器将点云空间划分为多维数据集。通过平均其x,y,z坐标将每个立方集内的点组合成单个输出点。

gridsize = 0.1;固定= pcdownsample(ptcloudref,'gridaverage',网格化);移动= pcdownsample(ptcloudcurrent,'gridaverage',网格化);%注意,下采样步骤不仅加快注册,%,但也可以提高准确性。

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

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

Tform = Pcregistericp(移动,固定,'公制''Pointtoplane''外推',真正的);ptCloudAligned = pctransform (ptCloudCurrent tform);

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

mergeSize = 0.015;ptCloudScene = pcmerge(ptCloudRef, ptcloudaled, mergeSize);%可视化输入图像。图形子图(2,2,1)imshow(ptcloudref.color)标题('第一个输入图像'“颜色”'W')绘制子图(2,2,3)imshow(ptcloudcurrent.color)标题(“第二个输入图像”“颜色”'W')绘制%可视化世界场景。子图(2,2,[2,4])pcshow(ptcloudscene,“VerticalAxis”“Y”'verticalaxisdir'“下来”)标题(“初始世界舞台”)包含(“X (m)”) ylabel (“Y (m)”)Zlabel('z(m)'

图包含3个轴。带有标题初始世界场景的轴1包含类型分散的对象。具有标题第一输入图像的轴2包含类型图像的对象。具有标题第二输入图像的轴3包含类型图像的对象。

drawn

缝合一系列点云

要撰写较大的3-D场景,请重复与上述相同的步骤来处理一系列点云。使用第一点云建立参考坐标系。将每个点云转换为参考坐标系。该转换是成对变换的乘法。

%存储累积变换的转换对象。AccumTform = Tform;图haxes = pcshow(ptcloudscene,“VerticalAxis”“Y”'verticalaxisdir'“下来”);标题('更新了世界场景'%设置轴属性以获得更快的渲染hax。CameraViewAngleMode ='汽车';hscatter = haxes.children;为了i = 3:length(livingRoomData) ptCloudCurrent = livingRoomData{i};%使用先前的移动点云作为参考。固定=移动;移动= pcdownsample(ptcloudcurrent,'gridaverage',网格化);%申请ICP注册。Tform = Pcregistericp(移动,固定,'公制''Pointtoplane''外推',真正的);%将当前点云转换为参考坐标系%由第一点云定义。AccumTform = Affine3D(TForm.t * AccumTform.t);ptcloudaligned = pctransform(ptcloudcurrent,acciptform);%更新世界场景ptcloudscene = pcmerge(ptcloudscene,ptcloudaligned,合并);%可视化世界场景。hScatter。XData = ptCloudScene.Location (: 1);hScatter。YData = ptCloudScene.Location (:, 2);hScatter。ZData = ptCloudScene.Location (: 3);hScatter。CData = ptCloudScene.Color;drawnow ('limitrate'结尾

图中包含一个轴。标题为“Updated world scene”的轴包含一个散射类型的对象。

录制期间%,Kinect指向向下。想象一下%结果更容易,让我们转换数据,使地平面是%平行于X-Z平面。角度= -pi / 10;a = [1,0,0,0;......0,cos(角),sin(角),0;......0, -sin(角度)cos(角度)0;......0 0 0 1];ptcloudscene = pctransform(ptcloudscene,acfine3d(a));pcshow(ptcloudscene,“VerticalAxis”“Y”'verticalaxisdir'“下来”......“父”,哈克斯)标题('更新了世界场景')包含(“X (m)”) ylabel (“Y (m)”)Zlabel('z(m)'

图中包含一个轴。标题为“Updated world scene”的轴包含一个散射类型的对象。