三维点云配准与拼接
概述
加载点云数据
数据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};
注册两点云
gridSize=0.1; fixed=pcdownsample(ptCloudRef,gridNearest=gridSize); moving=pcdownsample(ptCloudCurrent,gridNearest=gridSize);
tform=pcregistericp(移动、固定、公制= “点到平面” ); ptCloudAligned=pctransform(ptCloudCurrent,tform);
合并大小=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)” )
缝合点云序列
%存储累积转换的转换对象。 累计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; 抽汽器( “限制” ) 结束
角度=-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;
使用颜色信息缝合点云序列
ptCloudScene2=helperStitchPointCloudsUsingColor(livingRoomData);
图形 pcshow(ptCloudScene2,垂直轴= “Y” ,垂直轴方向= “向下” ) 标题( “使用颜色信息注册更新了世界场景” ) xlabel公司( “X(m)” ) 伊拉贝尔( “Y(m)” ) z标签( “Z(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;
结论
支持功能
功能 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); 结束