主要内容

三维点云配准与拼接

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

概述

此示例将使用Kinect捕获的点云集合缝合在一起,以构建场景的更大三维视图。该示例将ICP应用于两个连续的点云。这种类型的重建可以用来建立物体的三维模型或建立三维世界地图,以便同时定位和映射(SLAM)。

注册两点云

数据文件=完整文件(toolboxdir(“愿景”),'视觉数据','客厅.垫子'); 加载(数据文件);%提取两个连续的点云,并将第一个点云用作%参考文献。ptCloudRef=livingRoomData{1};ptCloudCurrent=livingRoomData{2};

配准的质量取决于数据噪声和ICP算法的初始设置。您可以应用预处理步骤来过滤噪波或设置适合您的数据的初始属性值。在这里,预处理的数据下采样与一个盒子网格过滤器和设置网格过滤器的大小为10厘米。栅格过滤器将点云空间划分为立方体。每个立方体中的点通过平均它们的X、Y、Z坐标组合成一个输出点。

网格大小=0.1;固定=pcdownsample(ptCloudRef,'网格平均',网格大小);移动=pcdownsample(ptCloudCurrent,'网格平均',网格大小);%注意,下采样步骤不仅加快了配准速度,%但也可以提高准确度。

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

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

tform=pcregistericp(移动,固定,'公制','点平面','推断',正确);ptCloudAligned=pctransform(ptCloudCurrent,tform);

我们现在可以用注册的数据创建世界场景。重叠区域使用1.5cm箱形网格过滤器过滤。增加“合并大小”(merge size)以减少生成的场景点云的存储需求,并减少“合并大小”(merge size)以提高场景分辨率。

合并大小=0.015;ptCloudScene=pcmerge(ptCloudRef,ptCloudAligned,mergeSize);%可视化输入图像。图子图(2,2,1)imshow(ptCloudRef.Color)标题('第一个输入图像','颜色',“w”)drawnow子图(2,2,3)imshow(ptCloudCurrent.Color)标题('第二个输入图像','颜色',“w”)现在抽%想象世界场景。子图(2,2,[2,4])pcshow(ptCloudScene,'垂直轴','是','垂直轴',“向下”)职务('初始世界场景')xlabel公司('X(米)')伊莱贝尔('是(m)')兹拉贝尔('Z(米)')

图中包含3个轴。标题为“初始世界场景”的轴1包含“散布”类型的对象。标题为第一个输入图像的轴2包含图像类型的对象。标题为第二个输入图像的轴3包含图像类型的对象。

刷新屏幕

缝合点云序列

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

%存储累积转换的转换对象。accumTform=tform;图hAxes=pcshow(ptCloudScene,'垂直轴','是','垂直轴',“向下”); 职务('更新的世界场景')%设置“轴”属性以加快渲染速度hAxes.cameraviewangle模式='自动'; hScatter=hAxes.儿童;对于i=3:length(livingRoomData)ptCloudCurrent=livingRoomData{i};%使用上一个移动点云作为参照。固定=移动;移动=pcdownsample(ptCloudCurrent,'网格平均',网格大小);%申请ICP注册。tform=pcregistericp(移动,固定,'公制','点平面','推断',正确);%将当前点云转换为参考坐标系%由第一个点云定义。acumtform=affine3d(tform.T*acumtform.T);ptCloudAligned=pctransform(ptCloudCurrent,acumtform);%更新世界场景。ptCloudScene=pcmerge(ptCloudScene,ptCloudAligned,mergeSize);%想象世界场景。hScatter.XData=ptCloudScene.Location(:,1);hScatter.YData=ptCloudScene.Location(:,2);hScatter.ZData=ptCloudScene.Location(:,3);hScatter.CData=ptCloudScene.Color;现在抽('限制')结束

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

%在录制过程中,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,affine3d(A));pcshow(ptCloudScene,'垂直轴','是','垂直轴',“向下”,...'父级',hAxes)标题('更新的世界场景')xlabel公司('X(米)')伊莱贝尔('是(m)')兹拉贝尔('Z(米)')

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