失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > matlab点云配准(总结性)

matlab点云配准(总结性)

时间:2018-08-01 03:28:40

相关推荐

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)

1

2

xyzPoints是一个 M-by-3 or an M-by-N-by-3 的矩阵。 函数得到的是一个点云对象。

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

如果觉得《matlab点云配准(总结性)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。