主要内容

三维点云配准与拼接

这个例子展示了如何使用迭代最近点(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算法估计下采样数据的三维刚性变换。我们使用第一个点云作为参考,然后将估计的变换应用到原始的第二个点云上。我们需要合并场景点云和对齐点云来处理重叠点。

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

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

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

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

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

drawnow

缝合一个点云序列

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

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

在录制过程中,Kinect是向下的。形象化%的结果更容易,让我们转换数据,使地平面%平行于X-Z平面。角= -10;翻译= [0,0,0];Tform = rigidtform3d([angle, 0,0],translation);ptCloudScene = pctransform (ptCloudScene tform);pcshow (ptCloudScene“VerticalAxis”“Y”“VerticalAxisDir”“下来”...“父”hax)标题(“更新世界舞台”)包含(“X (m)”) ylabel (“Y (m)”) zlabel (“Z (m)”

Baidu
map