matlab点云配准(总结性)

2023-12-06 19:08
文章标签 matlab 点云 配准 总结性

本文主要是介绍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点云配准(总结性)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/462966

相关文章

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 `FeatureExtraction` 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算(`calculateSmoothness()`)2. 标记遮挡点(`markOccludedPoints()`)3. 特征提取(`extractF

MATLAB的fix(),floor()和ceil()函数的区别与联系

fix(x),floor(x)和ceil(x)函数都是对x取整,只不过取整方向不同而已。 这里的方向是以x轴作为横坐标来看的,向右就是朝着正轴方向,向左就是朝着负轴方向。 fix(x):向0取整(也可以理解为向中间取整) floor(x):向左取整 ceil(x):向右取整 举例: 4个数:a=3.3、b=3.7、c=-3.3、d=-3.7 fix(a)=3 fl

MATLAB中的eig函数

在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有5种: E=eig(A):求矩阵A的全部特征值,构成向量E。 [V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。 [V,D]=eig(A,'nobalance'):与第2种格式类似,但第2种格式中先对A作相似变换后求矩阵A的特征值和特征向量,而格式3直接求矩阵A的特