主要内容

三维点云配准与拼接

此示例演示如何使用迭代最近点(ICP)算法组合多个点云来重建三维场景。然后,它显示了如何利用点云中可用的颜色信息来提高场景的准确性。

概述

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

加载点云数据

点云数据可用作点云物体。将数据下载到临时目录。

数据URL="https://www.mathworks.com/supportfiles/vision/data/livingRoom.mat网站";pointCloudFolder=完整文件(tempdir,“点云数据注册和缝合”);点云数据=完整文件(点云文件夹,“起居室.mat”);%下载点云数据。
如果~存在(pointCloudData,“文件”)如果~存在(pointCloudFolder,“目录”)mkdir(点云文件夹);结束显示(“正在下载点云数据(5.5 MB)…”);网络存储(pointCloudData,dataURL);结束
%加载点云数据。加载(pointCloudData);%提取两个连续的点云以将第一个点云用作
%参考。ptCloudRef=livingRoomData{1};ptCloudCurrent=livingRoomData{2};

注册两点云

配准的质量取决于数据噪声和ICP算法的初始设置。您可以应用预处理步骤来过滤噪声或设置适合您的数据的初始属性值。在这里,通过使用网格最近过滤器进行下采样来预处理数据,并将网格大小设置为0.1 m。网格过滤器将点云空间划分为体素。对于每个体素,它选择距体素质心最近的点。

gridSize=0.1;fixed=pcdownsample(ptCloudRef,gridNearest=gridSize);moving=pcdownsample(ptCloudCurrent,gridNearest=gridSize);

请注意,下采样步骤不仅可以加快注册速度,还可以提高准确性。

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

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

tform=pcregistericp(移动、固定、公制=“点到平面”);ptCloudAligned=pctransform(ptCloudCurrent,tform);

现在可以使用注册的数据创建世界场景。重叠区域使用0.015 m箱形网格过滤器进行过滤。增加合并大小可以降低生成的场景点云的存储要求,减少合并大小可以提高场景分辨率。

合并大小=0.015;ptCloudScene1=pcmerge(ptCloudRef、ptCloudAligned、mergeSize);%可视化输入图像。图形子区(2,2,1)imshow(ptCloudRef.Color)标题(“第一个输入图像”,颜色=“w”)子区(2,2,3)imshow(ptCloudCurrent.Color)标题(“第二个输入图像”,颜色=“w”)%可视化世界场景。子区(2,2,[2,4])pcshow(ptCloudScene1,垂直轴=“Y”,垂直轴方向=“向下”)标题(“初始世界场景”)xlabel公司(“X(m)”)伊拉贝尔(“Y(m)”)z标签(“Z(m)”)

图中包含3个轴对象。轴对象1的标题为初始世界场景,xlabel X(m),ylabel Y(m)包含散射类型的对象。具有标题的隐藏轴对象2第一个输入图像包含图像类型的对象。带标题的隐藏轴对象3第二个输入图像包含图像类型的对象。

缝合点云序列

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

%存储累积转换的转换对象。累计T形式=t形式;图形hAxes=pcshow(ptCloudScene1,垂直轴=“Y”,垂直轴方向=“向下”);标题(“更新的世界场景”)xlabel公司(“X(m)”)伊拉贝尔(“Y(m)”)z标签(“Z(m)”)%设置轴属性以加快渲染。h轴。摄像头视图角度模式=“自动”;hScatter=横轴。儿童;对于i=3:长度(活动房间数据)ptCloudCurrent=livingRoomData{i};%使用上一个移动点云作为参考。固定=移动;moving=pcdownsample(ptCloudCurrent,gridNearest=gridSize);%申请ICP注册。tform=pcregistericp(移动、固定、公制=“点到平面”);%将当前点云转换为参考坐标系
    %由第一个点云定义。accumTform=刚度(m3d)(accumTform.A*tform.A);ptCloudAligned=pctransform(ptCloudCurrent,accumTform);%更新世界场景。ptCloudScene1=pcmerge(ptCloudScene1,ptCloudAligned,mergeSize);%可视化世界场景。h散射。XData=ptCloudScene1.位置(:,1);h散射。YData=ptCloudScene1.位置(:,2);h散射。ZData=ptCloudScene1.位置(:,3);h散布。CData=ptCloudScene1.Color;抽汽器(“限制”)结束

图中包含轴对象。标题为更新的世界场景xlabel X(m)、ylabel Y(m)的轴对象包含散射类型的对象。

录制过程中,Kinect指向下方。变换场景,使地平面与X-Z平面平行。

角度=-10;翻译=[0 0 0];tform=刚性tform3d([角度0 0],平移);ptCloudScene1=pctransform(ptCloudScene1,tform);

更改绘图的相机角度以更近距离地检查缝合的结果。

hAxes1=pcshow(ptCloudScene1,AxesVisibility)=“关闭”);hAxes1.摄像头位置=[-0.6 0.2 0.5];hAxes1.摄像头目标=[1.3 0.5 0.3];hAxes1.CameraUpVector=[0.2-0.9-0.1];hAxes1.CameraViewAngle=60;

图中包含轴对象。隐藏轴对象包含散射类型的对象。

即使缝合的场景看起来是对齐的,但当仔细观察时,场景的某些部分会出现一些漂移。例如,熊猫旁边桌子上的花没有对齐。根据应用程序的不同,您可能希望进一步提高场景的准确性。为了改进结果,可以尝试使用将Metric name-value参数设置为“planeToPlane”的ICP算法。或者,如果点云包含颜色信息,则可以使用它来提高三维场景的准确性。

使用颜色信息缝合点云序列

这个pcregistericp公司函数在将“Metric name value”参数设置为“pointToPlaneWithColor”或“planeToPlaneWithColor”时使用点云的颜色信息。功能helperStitchPoint云使用颜色重复上一节中的步骤,将Metric name-value参数设置为“pointToPlaneWithColor”。

使用颜色信息缝合点云序列。

ptCloudScene2=helperStitchPointCloudsUsingColor(livingRoomData);

可视化更新的世界场景。

图形pcshow(ptCloudScene2,垂直轴=“Y”,垂直轴方向=“向下”)标题(“使用颜色信息注册更新了世界场景”)xlabel公司(“X(m)”)伊拉贝尔(“Y(m)”)z标签(“Z(m)”)

图中包含轴对象。标题为“使用颜色信息更新世界场景,xlabel X(m),ylabel Y(m)”的轴对象包含散射类型的对象。

更改绘图的相机角度以更近距离地检查缝合的结果。

hAxes2=pcshow(ptCloudScene2,AxesVisibility)=“关闭”);hAxes2.摄像头位置=[-12.6-2.9-0.9];hAxes2.摄像头目标=[27.3 7.4 3.6];hAxes2.CameraUpVector=[0.27-0.93-0.24];hAxes2.CameraViewAngle=11;

图中包含轴对象。隐藏轴对象包含散射类型的对象。

利用点云可用的颜色信息,减少缝合场景中的漂移。例如,在生成的三维场景中,熊猫旁边的花的对齐方式得到了改进。

结论

此示例演示了如何使用ICP点云注册缝合多个点云以重建三维场景。它还显示了如何使用ICP利用点云中的颜色信息来提高重建场景的准确性。

支持功能

这个helperStitchPoint云使用颜色函数通过使用pcregistericp公司函数的“pointToPlaneWithColor”度量。

功能ptCloudScene=helperStitchPointCloudsUsingColor(livingRoomData)%提取第一个点云作为参考。ptCloudRef=livingRoomData{1};%对点云进行下采样。gridSize=0.1;移动=pcdownsample(ptCloudRef,gridNearest=gridSize);%设置合并大小以将每个点云合并到场景中。合并大小=0.015;ptCloudScene=ptCloudRef;%存储累积转换的转换对象。accumTform=m3d()的刚性;对于i=2:长度(活动房间数据)ptCloudCurrent=livingRoomData{i};%使用上一个移动点云作为参考。固定=移动;moving=pcdownsample(ptCloudCurrent,gridNearest=gridSize);%申请ICP注册。tform=pcregistericp(移动、固定、公制=“指向带有颜色的平面”,内嵌距离=0.1);%将当前点云转换为参考坐标系
    %由第一个点云定义。accumTform=刚度(m3d)(accumTform.A*tform.A);ptCloudAligned=pctransform(ptCloudCurrent,accumTform);%更新世界场景。ptCloudScene=pcmerge(ptCloudScene,ptCloudAligned,mergeSize);结束

%在录制过程中,Kinect指向下方。
%变换场景,使地平面平行
%到X-Z平面。角度=-10;翻译=[0 0 0];tform=刚性tform3d([角度0 0],平移);ptCloudScene=pctransform(ptCloudScene,tform);结束