主要内容

3-D点云注册和拼接

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

概述

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

注册两个点云

datafile = fullfile(toolboxdir(“愿景”),“visiondata”“livingRoom.mat”);负载(功能);%提取两个连续的点云,使用第一个点云为%的参考。ptcloudref = livityroomdata {1};ptcloudcurrent = livityroomdata {2};

注册质量取决于ICP算法的数据噪声和初始设置。您可以应用预处理步骤以过滤噪声或设置适合您数据的初始属性值。在此,通过使用盒式网格滤波器对数据进行预处理,并将网格滤波器的大小设置为10cm。网格筛选器将点云空间划分为多维数据集。通过平均其x,y,z坐标将每个立方集内的点组合成单个输出点。

gridSize = 0.1;固定= pcdownsample (ptCloudRef,“gridAverage”, gridSize);移动= pcdownsample (ptCloudCurrent,“gridAverage”, gridSize);请注意,下采样步骤不仅加快了注册速度,%,但也可以提高准确度。

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

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

移动,固定,“指标”“pointToPlane”'外推',真正的);ptcloudaligned = pctransform(ptcloudcurrent,tform);

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

合并= 0.015;ptcloudscene = pcmerge(ptcloudref,ptcloudaligned,合并);%可视化输入图像。图subplot(2,2,1) imshow(ptCloudRef.Color) title(“第一输入图像”'颜色'' w ') drawnow subplot(2,2,3) imshow(ptCloudCurrent.Color) title('第二个输入图像''颜色'' w ')绘制想象世界场景。次要情节(2 2(2、4))pcshow (ptCloudScene,'verticalaxis''是'“VerticalAxisDir”'下') 标题('初始世界场景')Xlabel('x(m)')ylabel('y(m)') zlabel (“Z (m)”

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

drawnow

缝合一系列点云

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

%存储累积转换的转换对象。accumTform = tform;figure hax = pcshow(ptCloudScene,'verticalaxis''是'“VerticalAxisDir”'下');标题(“更新世界舞台”%设置坐标轴属性以加快渲染速度haxes.cameraviewanglemode =“汽车”;hScatter = hAxes.Children;i = 3:长度(livingroomdata)ptcloudcurrent = livityroomdata {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;rawingow(“limitrate”结束

图包含轴。具有标题更新的世界场景的轴包含类型分布的对象。

%在录制过程中,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''是'“VerticalAxisDir”'下'...'父母'hax)标题(“更新世界舞台”)Xlabel('x(m)')ylabel('y(m)') zlabel (“Z (m)”

图包含轴。具有标题更新的世界场景的轴包含类型分布的对象。