三维点云配准与拼接
这个例子展示了如何结合多个点云来重建三维场景使用迭代最近点(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)”)
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)”)