主要内容

3-D点云配准与拼接

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

概述

这个例子将用Kinect捕捉到的点云集合拼接在一起,构建了一个更大的场景3d视图。本例将ICP应用于两个相继的点云。这种类型的重建可用于建立物体的三维模型或建立三维世界地图进行同步定位和测绘(SLAM)。

配准两点云

外部= 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算法估计下采样数据的三维刚性变换。我们使用第一个点云作为参考,然后将估计的变换应用到原始的第二点云。我们需要将场景点云与对齐点云合并,以处理重叠点。

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

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

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

mergeSize = 0.015;ptCloudScene = pcmerge(ptclouddref, ptclouddaligned, mergeSize); / /合并%可视化输入图像。图subplot(2,2,1) imshow(ptCloudRef.Color) title(“第一输入图像”“颜色”' 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)”

图中包含3个轴对象。初始世界场景包含一个分散类型的对象。第一个输入图像包含一个类型为image的对象。第二个输入图像包含一个类型为image的对象。

drawnow

缝合点云序列

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

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

图中包含一个轴对象。标题为“更新的世界场景”的axis对象包含一个类型为scatter的对象。

%在录制过程中,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)”

图中包含一个轴对象。标题为“更新的世界场景”的axis对象包含一个类型为scatter的对象。