matlab点云配准(总结性)
前⾔
点云通常⽤于测量物理世界表⾯。 它们应⽤于机器⼈导航和感知,深度估计,⽴体视觉,视觉注册以及⾼级驾驶辅助系统(ADAS)。 计算机视觉系统Toolbox™算法提供点云处理功能,⽤于下采样,去噪和转换点云。 该⼯具箱还提供点云配准,适合三维点云的⼏何形状,以及读取,写⼊,存储,显⽰和⽐较点云的能⼒。 您还可以组合多个点云,使⽤迭代最近点(ICP)算法重建三维场景。
关于名字
在matlab的⽂档⾥说的是Point Cloud Registration , Registration⼀词有注册的意思,也有图像配准和光栅重合的意思。这⾥显然应该翻译为,配准。
关于matlab点云的配准
生日快乐的英文
您可以使⽤pcregistericp和pcregisterndt将移动点云注册到固定点云。 这些配准算法分别基于迭代最近点(ICP)算法和正态分布变换(NDT)算法。 最佳性能需要调整数据属性。 在使⽤点云注册功能之前,请考虑使⽤pcdownsample对您的点云进⾏下采样,从⽽提⾼注册的准确性和效率。
点云的配准
读⼊点云后
点云的下采样
pcdownsample函数完成此操作。
ptCloudOut = pcdownsample(ptCloudIn,'random',percentage)
ptCloudOut = pcdownsample(ptCloudIn,'gridAverage',gridStep)
ptCloudOut = pcdownsample(ptCloudIn,'nonuniformGridSample',maxNumPoints)
三个参数对应的分别是 点云 ,下采样⽅法,⼀个⽅法的属性值。关于下采样⽅法,以后再谈,这个⽂章不关注这⼀细节⽅⾯。下采样例⼦设置三维分辨率为(0.1 x 0.1 x 0.1).
ptCloud = pcread('teapot.ply');
gridStep = 0.1;
ptCloudA = pcdownsample(ptCloud,'gridAverage',gridStep);
figure;
pcshow(ptCloudA);‘
这个是matlab⾃带例⼦可以直接运⾏。
点云的刚性变换
ptCloudOut = pctransform(ptCloudIn,tform)函数实现改功能;将指定的前向刚性变换应⽤于输⼊点云。
A = [cos(pi/4) sin(pi/4) 0 0; ...
-sin(pi/4) cos(pi/4) 0 0; ...
0 0 1 0; ...
0 0 0 1];
tform = affine3d(A);
ptCloudOut = pctransform(ptCloud,tform);
日文学习报名figure
pcshow(ptCloudOut);
xlabel('X');
ylabel('Y');
the edge of gloryzlabel('Z');
此处注意,tform 是⼀个affine3d object。使⽤了affine3d来完成参数的格式要求。
使⽤ICP算法配准两个点云
开运输发票pcregistericp函数。
关于算法的细节,我们只能另开⼀篇⽂章,否则,这个⽂章会变得⼜臭⼜长。ICP估计两个点云的之间的刚性变换
直接看⼀个例⼦,就可以明⽩,该过程可以得到什么。
A = [cos(pi/6) sin(pi/6) 0 0; ...
-sin(pi/6) cos(pi/6) 0 0; ...
0 0 1 0; ...
5 5 10 1];
betweenand
附近学电脑的tform1 = affine3d(A);
Transform the point cloud.
ptCloudTformed = pctransform(ptCloud,tform1);
pcshow(ptCloudTformed);
title('Transformed Teapot');
smurf
tform = pcregistericp(ptCloudTformed,ptCloud,'Extrapolate',true);
disp(tform1.T);
0.8660 0.5000 0 0
-0.5000 0.8660 0 0
0 0 1.0000 0
5.0000 5.0000 10.0000 1.0000
tform2 = invert(tform);
disp(tform2.T);
0.8660 0.5000 -0.0000 0
-0.5000 0.8660 0.0000 0
0.0000 -0.0000 1.0000 0
5.0000 5.0000 10.0000 1.0000
这⾥可以看到,配准后得到的是⼀个tform和 刚性变换的tform1 是同⼀个类型的数据,表⽰⼀个刚性变换,affine3d对象。
tfform是配准的成果。结果对⽐之下可以看到,估计的蛮准的。
口语教练这⾥列出其他⽤法,以后⽤空再谈
tform = pcregistericp(moving,fixed)
[tform,movingReg] = pcregistericp(moving,fixed)
[___,rm] = pcregistericp(moving,fixed)
itp[___] = pcregistericp(moving,fixed,Name,Value)
NDT算法配准两个点云
tform = pcregisterndt(moving,fixed,gridStep)返回⽤固定点云注册移动点云的刚性变换。 点云被体素化为⼤⼩为gridStep的⽴⽅体。
为了更直观,还是看例⼦的效果 (moving fixed表⽰两个点云)
movingDownsampled = pcdownsample(moving,'gridAverage',0.1);
gridStep = 0.5;
tform = pcregisterndt(movingDownsampled,fixed,gridStep);
movingReg = pctransform(moving,tform);
youngchildren
pcshowpair(movingReg,fixed,'VerticalAxis','Y','VerticalAxisDir','Down')
得到的tform仍然表⽰⼀个刚性变换,荣ICP的tform是⼀样的。这⾥的pcshoowpair⽤于显⽰两组点云的不同之处。
点云的合并
ptCloudOut = pcmerge(ptCloudA,ptCloudB,gridStep)使⽤框⽹格过滤器返回合并的点云。 gridStep指定过滤器的3-D框的⼤⼩。
直接得到合并后的点云
存储三维点云的对象
ptCloud = pointCloud(xyzPoints)
ptCloud = pointCloud(xyzPoints,Name,Value)
1
2
xyzPoints是⼀个 M-by-3 or an M-by-N-by-3 的矩阵。 函数得到的是⼀个点云对象。
点云对象的存储以前说过了。