MATLAB激光密集点云基础化操作(一)

这篇具有很好参考价值的文章主要介绍了MATLAB激光密集点云基础化操作(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

参考网站(MATLAB文档帮助中心):https://ww2.mathworks.cn/help/index.html?s_tid=CRUX_lftnav


一、利用pcshow读取并显示点云------pcshow

pcshow(ptCloud) 使用位置显示点 以及存储在点云对象中的颜色。要可视化大型点云(大于一百万点),请使用 pcviewer obect。

pcshow(xyzPoints) 显示器 由矩阵指定的点。xyzPoints

pcshow(xyzPoints,color) 显示矩阵中包含的点,其中由 指定的颜色。xyzPointscolor

pcshow(xyzPoints,colorMap) 显示矩阵中包含的点,其中 由 指定的颜色。xyzPointscolorMap电脑显示(文件名)显示 存储在 指定的文件中的点云。filename

pcshow(___,Name=Value)指定选项 使用一个或多个名称-值参数以及 来自先前语法的参数。例如,将点云可视化的平面设置为 XY 平面。ViewPlane="XY"

ax = pcshow(___)返回 绘图轴。
clc
clear all
format long g;
%---------------读取显示密集点云并绘图------------------
data=pcread("test_clound.ply");
figure;
pcshow_map=pcshow(data);
title('密集点云pcshow展示')
xlabel('x(m)','Color',"R");
ylabel('y(m)','Color','R');
zlabel('z(m)','Color','R');
%---------------点云采样------------------------------
sift_data=pcdownsample(data, 'gridAverage', 0.01);
figure;
pcshow(sift_data);

MATLAB激光密集点云基础化操作(一)

二、利用scatter3函数显示点云------scatter3

scatter3(X,Y,Z) 在 X、Y 和 Z 指定的位置显示圆圈。要绘制一组坐标,请将 X、Y 和 Z 指定为等长向量。要在同一组坐标轴上绘制多组坐标,请将 X、Y 或 Z 中的至少一个指定为矩阵。

scatter3(X,Y,Z,S) 指定圆圈大小。要更改圆圈的大小,请将 S 指定为向量。要跨多组坐标指定不同的圆圈大小,请指定一个矩阵。

scatter3(X,Y,Z,S,C) 指定圆颜色。您可以为所有圆指定一种颜色,也可以更改颜色。例如,您可以通过将 C 指定为 "red" 来绘制所有红色圆。

scatter3(___,'filled') 使用前面的语法中的任何输入参数组合填充这些圆。

scatter3(___,markertype) 指定标记类型。
xyz_data=data.Location;
color=data.Color/255;
pc_x=xyz_data(:,1);
pc_y=xyz_data(:,2);
pc_z=xyz_data(:,3);
figure;
scatter3_map=scatter3(pc_x,pc_y,pc_z,0.1,color,'.');
%axis off
title('密集点云scatter3展示',"FontSize",10)

MATLAB激光密集点云基础化操作(一)

三、将点云按高程赋值色彩------mapshow/pointCloud

ptCloud = pointCloud(xyzPoints) 返回一个点云对象,其坐标由 指定。xyzPoints

ptCloud = pointCloud(___,Name=Value)除了前面的语法之外,还使用一个或多个名称-值参数设置选项。 例如,将点云的颜色设置为 红。Color=[1 0 0]
%--------------点云按高程赋值色---------------------
z=sift_data.Location(:,3);
z_min=sift_data.ZLimits(1);   %高程最小值
z_max=sift_data.ZLimits(2);   %高程最大值
jet_color=jet(256);
hsv_color=hsv(256);
len_z=length(z);
z_jet_color=zeros(len_z,3);
z_hsv_color=zeros(len_z,3);
for i=1:len_z  
    scale=floor(((z(i)-z_min)/(z_max-z_min))*255)+1;
    z_jet_color(i,:)=jet_color(scale,:);
    z_hsv_color(i,:)=hsv_color(scale,:);
end
jet_scale_point=pointCloud(sift_data.Location,'color',z_jet_color);
hsv_scale_point=pointCloud(sift_data.Location,'color',z_hsv_color);
subplot(1,2,1);
pcshow(jet_scale_point);
title('the jet color elevation map ');
subplot(1,2,2);
pcshow(hsv_scale_point);
title('the hsv color elevation map ');

MATLAB激光密集点云基础化操作(一)

四、按照x-y轴人机交互式绘制点云刨面图------input/find/scatter

x = input(prompt) 显示 prompt 中的文本并等待用户输入值后按 Return 键。用户可以输入 pi/4 或 rand(3) 之类的表达式,并可以使用工作区中的变量。

如果用户不输入任何内容直接按下 Return 键,则 input 会返回空矩阵。

如果用户在提示下输入无效的表达式,则 MATLAB 会显示相关的错误消息,然后重新显示提示。

txt = input(prompt,"s") 返回输入的文本,而不会将输入作为表达式来计算。
%------------------绘制刨面图--------------------------
%------沿着Y轴方向-------
x_text=input("请输入要切割的X值(601530.25 <x 602151.0.6):");
x_set=sift_data.Location(:,1)-x_text;
x_near_indices=find(x_set<1 & x_set>-1);
xyz_dat1=sift_data.Location(x_near_indices,:);
color_dat1=sift_data.Color(x_near_indices,:);
figure;
subplot(2,2,1);
pcshow(xyz_dat1,color_dat1);
title('the Cut block along Y axis clound map');
subplot(2,2,2);
scatter(xyz_dat1(:,2),xyz_dat1(:,3),0.01,'r','.');
%------沿着X轴方向-------
y_text=input("请输入要切割的Y值(3410054.3 <x< 3410676.8):");
y_set=sift_data.Location(:,2)-y_text;
y_near_indices=find(y_set<1 & y_set>-1);
xyz_dat2=sift_data.Location(y_near_indices,:);
color_dat2=sift_data.Color(y_near_indices,:);
subplot(2,2,3);
pcshow(xyz_dat2,color_dat2);
title('the Cut block along X axis clound map');
subplot(2,2,4);
scatter(xyz_dat2(:,1),xyz_dat2(:,3),0.01,'r','.');

MATLAB激光密集点云基础化操作(一)

五、按俯视将点云投影到平面------pcfitplane/pointCloud

model = pcfitplane(ptCloudIn,maxDistance) 将平面拟合到点云,该点云具有最大允许距离 

model = pcfitplane(ptCloudIn,maxDistance,referenceVector) 将平面拟合到具有附加方向约束的点云 由 1×3 输入指定。referenceVector

model = pcfitplane(ptCloudIn,maxDistance,referenceVector,maxAngularDistance)将平面拟合到具有指定最大角度的点云 距离。

[model,inlierIndices,outlierIndices] = pcfitplane(___)    将线性指数返回到 点云输入。

[___,meanError] = pcfitplane(___)此外,将内在点的距离的平均误差返回给 模型,使用上述任何语法。

[___] = pcfitplane(___,Name=Value)使用一个或多个名称-值参数以及任何 来自先前语法的参数的组合。
%---------------------点云投影平面----------------------
%  曲面拟合表达式:Ax+By+Cz+D=0
model=pcfitplane(data,0.2,[0,0,1],5);   %利用pcfitplane求解曲面拟合参数,返回值为4个
A=model.Parameters(:,1);
B=model.Parameters(:,2);
C=model.Parameters(:,3);
D=model.Parameters(:,4);
model_x=data.Location(:,1);
model_y=data.Location(:,2);
model_z=data.Location(:,3);
t=-(A.*model_x+B.*model_y+C.*model_z+D)/(A^2+B^2+C^2);
x_projection=A.*t+model_x;
y_projection=B.*t+model_y;
z_projection=C.*t+model_z;
pc_projection=pointCloud([x_projection,y_projection,z_projection],'Color',data.Color);
figure;
pcshow(pc_projection);
title('the Point cloud projection plane map');

MATLAB激光密集点云基础化操作(一)

六、点云差异可视化显示------pcshowpair

pcshowpair(ptCloudA,ptCloudB) create 描述两个输入点之间差异的可视化 云。使用洋红色混合显示差异 对于点云 A,绿色表示点云 B。

pcshowpair(ptCloudA,ptCloudB,Name=Value) 除了任何 来自先前语法的参数的组合。

将图形背景色设置为黄色。pchowpair(ptCloudA,ptCloudB,BackgroundColor="yellow")

ax = pcshowpair(___)返回 绘图轴到差异的可视化
%---------------------点云差异可视化显示----------------------
shrink_z=data.Location(:,3).*0.5;
pc_shrink=pointCloud([data.Location(:,1),data.Location(:,2),shrink_z(:)],"Color",data.Color);
figure;
pcshowpair(data,pc_shrink,"MarkerSize",1);
title('the difference in two-point cloud visualization map');
hold off;

MATLAB激光密集点云基础化操作(一)

七、查询点云点半径中的邻近区域点------findNeighborsInRadius

[index,dists] = findNeighborsInRadius(ptCloud,point,radius) 返回查询点半径内的邻居 输入点云。 
可以是无组织的点,也可以是有组织的点 云。查询点半径内的邻居使用 Kd 树计算 基于搜索算法。indicesptCloud

[index,dists] = findNeighborsInRadius(ptCloud,point,radius,camMatrix) 返回输入点云中查询点半径内的邻居。
输入 点云是由深度相机生成的有组织的点云。邻居 查询点的半径使用快速近似邻居搜索算法确定。该函数使用相机投影矩阵
来了解 相邻点之间的关系,从而加快了搜索速度。然而, 与基于 Kd 树的方法相比,结果的准确性较低

[indices,dists] = findNeighborsInRadius(___,Name,Value)除了输入之外,还使用一个或多个名称-值对参数指定选项 上述语法中的参数
%---------------------查询点云点半径中的邻近区域点----------------------
n=randi(size(data.Location,1));
centre_point=data.Location(n,:);  %随机抽取点云中的点
r=5;
[indices,dists]=findNeighborsInRadius(data,centre_point,r); %输入搜索半径
neighbor_xyz=data.Location(indices,:);
dd=[1,0,0];
point_color=repmat(dd,length(indices),1);
neighbor_pc=pointCloud([neighbor_xyz(:,1),neighbor_xyz(:,2),neighbor_xyz(:,3)],"Color",point_color);
figure;
pcshow(neighbor_pc);
hold on;
centre_pc=pointCloud([centre_point(:,1),centre_point(:,2),centre_point(:,3)],'Color',[1,1,0]);
pcshow(centre_pc,"MarkerSize",200);
%---------------------
n = [1, 1, 2];
phi = linspace(0,2*pi,360);
theta = atan(-(n(1)*cos(phi)+n(2)*sin(phi))/n(3));
x_r = (centre_point(:,1)+r*cos(theta).*cos(phi))';
y_r = (centre_point(:,2)+r*cos(theta).*sin(phi))';
z_r = (centre_point(:,3)+r*sin(theta))';
range_xyz=[x_r,y_r,z_r];
dd2=[1,0,1];
range_color=repmat(dd2,length(phi),1);
range_pc=pointCloud([range_xyz(:,1),range_xyz(:,2),range_xyz(:,3)],"Color",range_color);
pcshow(range_pc);
title('search for point clouds by radius map');
hold off;

MATLAB激光密集点云基础化操作(一)

八、根据欧氏距离将点云分割成集群------pcsegdist

labels = pcsegdist(ptCloud,minDistance)将点云分割成簇,不同聚类的点之间的最小欧氏距离。 将整数聚类标签分配给 点云,并返回所有点。minDistancepcsegdistlabels

[labels,numClusters] = pcsegdist(ptCloud,minDistance) 也返回簇的数量。

[___] = pcsegdist(___,Name=Value)使用名称-值参数设置属性。

将每个聚类中的最小和最大点数设置为 。labels = pcsegdist(ptCloud,minDistance,NumClusterPoints=[1,Inf])[1,Inf]
%---------------------根据欧氏距离将点云分割成集群----------------
maxDistance = 40;
referenceVector = [0 0 1];
[~,inliers,outliers] = pcfitplane(data,maxDistance,referenceVector);
ptCloudWithoutGround = select(data,outliers);
minDistance = 20;
[labels,numClusters] = pcsegdist(ptCloudWithoutGround,minDistance);
idxValidPoints = find(labels);
labelColorIndex = labels(idxValidPoints);
segmentedPtCloud = select(ptCloudWithoutGround,idxValidPoints);
figure;
colormap(hsv(numClusters));
pcshow(segmentedPtCloud.Location,labelColorIndex);
title('Point Cloud Clusters');

MATLAB激光密集点云基础化操作(一)

九、绘制指定半径的球型点云并保存为.ply点云文件------sphere/pcwrite

[X,Y,Z] = sphere(100);
R=100;
loc = [X(:),Y(:),Z(:)].*R;
ptCloud = pointCloud(loc);
pcshow(ptCloud);
title('Point Cloud');
%------------------保存为ply格式--------------
pcwrite(ptCloud,'cloud_copy.ply');

MATLAB激光密集点云基础化操作(一)文章来源地址https://www.toymoban.com/news/detail-464779.html

到了这里,关于MATLAB激光密集点云基础化操作(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于ROS的自动驾驶 激光雷达点云物体检测 项目实战

    前言: 基于Apollo的preception与Autoware的lidar_apollo_cnn_seg_detect模块,并详细记录ROS系统上进行实时检测全部流程和踩坑,文章最后附上rosbag和rosbag的制作方法。参考文章:https://adamshan.blog.csdn.net/article/details/106157761?spm=1001.2014.3001.5502感谢大佬的杰作。 检测效果视频 环境 RTX 2060(

    2024年02月08日
    浏览(43)
  • 基于chow算法的5G超密集网络功率分配matlab仿真

    目录 1.5G超密集网络(UDN)概述 2.Chow功率分配算法 3.MATLAB程序 4.仿真结果       在5G网络中,超密集网络(Ultra-Dense Networks, UDNs)是提升网络容量和覆盖范围的关键技术之一。在这样的网络中,基站(Base Stations, BSs)和用户设备(User Equipments, UEs)之间的距离大大缩短,从而提

    2024年03月18日
    浏览(86)
  • 点云处理库Open3D基础操作1

    欢迎访问个人网络日志🌹🌹知行空间🌹🌹 Open3D 是英特尔公司于 2015 年发布的开源 3D 视觉算法库,截至2023年03月已经更新到了 0.17.0 版本。基于 MIT 协议开源许可。 其后端使用 C++11 实现,经过了高度优化,使用 OpenMP 并行运算优化。通过 Python Pybinding ,其提供前端 Python API

    2024年02月10日
    浏览(40)
  • 基于深度学习的人工林地面激光扫描点云立木特征参数提取方法

    Paper题目:A Deep Learning-Based Method for Extracting Standing Wood Feature Parameters from Terrestrial Laser Scanning Point Clouds of Artificially Planted Forest 利用基于三维点云的技术量化立木和立木参数,可以在林业生态效益评估和立木培育和利用中发挥关键作用。随着光探测与测距(LiDAR)扫描等三维信

    2024年02月05日
    浏览(39)
  • Apollo官方课程算法解读笔记——激光雷达感知模块、基于PointPillars的激光雷达点云检测算法、PointPillars模型的部署和优化模型的部署和优化

    感知模块检测效果: 左边为摄像头拍摄图像,激光雷达感知不依赖左边CAMERA,而是点云数据对应的效果图(黄色上方数字为Tracking ID) 主车红灯时的激光点云检测效果图 车道线给CAMERA提供一个标定参考,使得camera检测出来的障碍物从2维转化为3维的信息,因为此标定的参考,

    2024年02月14日
    浏览(43)
  • 基于MATLAB的激光光斑图像处理算法

    常用的激光光斑中心检测算法有均值法、重心法及Hough变换法、圆拟合等。本设计拟采用圆拟合对激光光斑进行检测。 激光光斑原始图像中光斑内部光强分布不均匀,且图像偏暗,对比度较差,不利于原始信号特征量的提取,因此必须进行预处理。首先,需要对光斑图像进行

    2024年02月16日
    浏览(45)
  • 【矩阵的基本操作】——MatLab基础

    对矩阵A加一个’就表示A的转置矩阵 横拼: 对于A、B两个矩阵,我们该怎么做到使矩阵A在左,B在右形成一个新矩阵呢? 竖拼: 因为分号表示换号,所以用分号来进行竖直凭借 位置是一列一列从左往右数的,相当于门牌号只有一个数 取出矩阵A中第m行n列的元素 end(): 取矩阵

    2024年02月16日
    浏览(36)
  • MATLAB基础操作5——矩阵元素的引用

    下标必须为正整数,且要用圆括号括起来。 在MATLAB中,矩阵元素按列存储,即先存储第一列元素,然后存储第二列元素,以此类推,直到最后一列。矩阵元素的序号就是矩阵元素在内存中的排列顺序。 序号与下标是一一对应的,若矩阵A为的矩阵,矩阵元素A(a, b)的序号为  。

    2024年02月03日
    浏览(54)
  • MATLAB图论合集(一)基本操作基础

    本帖总结一些经典的图论问题,通过MATLAB如何计算答案。近期在复习考研,以此来巩固一下相关知识——虽然考研肯定不能用MATLAB代码哈哈,不过在实际应用中解决问题还是很不错的,比C++易上手得多~ 此外,本帖图论中非常重要的知识点——最小生成树。作为数据结构的理

    2024年02月13日
    浏览(41)
  • 【自制视频课程】C++OpnecV基础35讲——第一章 前言

            首先,opencv是一个广泛使用的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,可以帮助我们快速地开发出高质量的图像处理应用程序;         其次,opencv是一个开源库,可以免费使用和修改,这为我们提供了一个学习和研究计算机视觉的良好平

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包