点云通常用于测量物理世界表面。 它们应用于机器人导航和感知,深度估计,立体视觉,视觉注册以及高级驾驶辅助系统(ADAS)。 计算机视觉系统Toolbox™算法提供点云处理功能,用于下采样,去噪和转换点云。 该工具箱还提供点云配准,适合三维点云的几何形状,以及读取,写入,存储,显示和比较点云的能力。 您还可以组合多个点云,使用迭代最近点(ICP)算法重建三维场景。
在matlab的文档里说的是Point Cloud Registration , Registration一词有注册的意思,也有图像配准和光栅重合的意思。这里显然应该翻译为,配准。
您可以使用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');
zlabel('Z');
此处注意,tform
是一个affine3d object。使用了affine3d来完成参数的格式要求。
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];
tform1 = affine3d(A);
Transform the point cloud.
ptCloudTformed = pctransform(ptCloud,tform1);
pcshow(ptCloudTformed);
title('Transformed Teapot');
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)
[___,rmse] = pcregistericp(moving,fixed)
[___] = pcregistericp(moving,fixed,Name,Value)
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);
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)
xyzPoints是一个 M-by-3 or an M-by-N-by-3 的矩阵。 函数得到的是一个点云对象。
点云对象的存储以前说过了。