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');
zlabel('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];
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)

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);
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 的矩阵。 函数得到的是一个点云对象。

点云对象的存储以前说过了。

你可能感兴趣的:(matlab,Matlab,点云处理)