当前位置: 首页 > news >正文

matlab通过GUI实现点云的读取、自定义显示和保存

        本次分享的是使用matlab 2020a(因为只安装了这个,有条件的可以安装最新版本)进行点云的读取、原始显示、自定义显示和保存。

        MATLAB 在点云处理方面提供了完整的工作流:从读取、可视化、自定义增强到最终保存。以下围绕这四个环节,结合典型代码与应用场景做系统梳理,方便快速上手并扩展至实际项目。

一、点云读取:格式覆盖与最佳实践
        1. 主流格式  
        • PLY / PCD / LAS:工业、测绘、SLAM 最常见  
        • TXT / CSV:科研或自采数据,字段灵活  
        • BAG(ROS):机器人/自动驾驶时间序列数据  

        2. 核心函数  
        MATLAB 原生函数即可“一键”完成:  

% PLY / PCD
ptCloud = pcread('scene.ply');          % 返回 pointCloud 对象% LAS(机载 LiDAR)
[ptCloud, info] = lasread('tile.las');  % 自带地理坐标、强度、回波次数% TXT(无文件头,仅 XYZ)
xyz  = load('scan.txt');                % 或 readmatrix / readtable
pc   = pointCloud(xyz);                 % 手工封装成对象% ROS Bag(需 Robotics System Toolbox)
bag  = rosbag('lidar.bag');
msgs = select(bag,'MessageType','sensor_msgs/PointCloud2');
pc   = readMessages(msgs(1));           % 单元数组,再取点云

        3. 大文件技巧  
        • 范围裁剪:lasread(…,'Range',[xmin xmax ymin ymax zmin zmax])  
        • 分块循环:先 lasinfo 查点数,再按 RecordID 分段读取,避免一次性爆内存  
二、原始显示:快速验证数据完整性
        1. 标准可视化  

pcshow(ptCloud);          % 自动渲染颜色/反射率
xlabel('X'); ylabel('Y'); zlabel('Z');
axis equal; grid on;

2. 多帧/多视角  

figure;
pcshow(ptCloud1); hold on;
pcshow(ptCloud2,'MarkerSize',20,'Color','r');  % 差异对比
view(45,20);

三、自定义显示:让“数据”变“信息”
        1. 颜色映射  
        • 按高度(Z)上色:  

z   = ptCloud.Location(:,3);
c   = jet(length(z));       % 伪彩
col = z / max(z);           % 0-1 归一化
pcshow(ptCloud.Location,'Color',c);
colorbar; colormap(jet);

        • 按强度/回波:替换 z 为 ptCloud.Intensity 即可。

        2. 法向量、曲率叠加  

pcnormals(ptCloud);         % 在 pcshow 上绘制法矢

        3. 交互式裁剪与感兴趣区域 (ROI)  

[~,roiBox] = pcshow(ptCloud);
% 鼠标拉框后返回 roiBox,可立即 select:
inIdx = findPointsInROI(ptCloud,roiBox);
pcRoi = select(ptCloud,inIdx);
figure; pcshow(pcRoi);

        4. 动画/时序播放(车载/移动扫描)  

for k = 1:length(pcCell)pcshow(pcCell{k});drawnow; pause(0.1);
end

四、点云保存:格式转换与下游对接
        1. 导出函数  

% PLY / PCD
pcwrite(ptCloud,'filtered.ply','PLYFormat','binary'); % 体积小
pcwrite(ptCloud,'down.pcd');% LAS(保留地理信息)
laswrite(ptCloud,'out.las','Version','1.4');% TXT(供 Python / PCL 读)
xyz = ptCloud.Location;
writematrix(xyz,'out.xyz','Delimiter','tab');

        2. 自动批量流水线示例  

inDir  = 'raw_LAS/';  outDir = 'proc_LAS/';
files  = dir(fullfile(inDir,'*.las'));
parfor i = 1:length(files)[pc,info] = lasread(fullfile(inDir,files(i).name));pcDown    = pcdownsample(pc,'gridAverage',0.05); % 5 cm 格网laswrite(pcDown,fullfile(outDir,files(i).name));
end

五、典型应用领域与扩展
        1. 测绘 / 城市信息模型 (BIM/CIM)  
        机载 LiDAR 读取 LAS → 去噪、滤波 → 生成 DEM/DSM → 保存 GeoTIFF 或矢量轮廓。

        2. 自动驾驶 / 机器人  
        实时 ROS Bag → 分段读取 → 地面分割 (segmentGroundFromLidarData) → 障碍物聚类 → 保存为 PCD 供 SLAM 后端。

        3. 工业检测与逆向工程  
        PLY 读入 → 配准 (pcregrigid) → 表面重建 (alphaShape / triangulation) → STL 输出,用于 3D 打印或 CFD 网格。

        4. 建筑 / 文化遗产  
        高分辨率扫描 → 自定义颜色高度图 → 生成正射影像 → 报告展示;交互式 ROI 裁剪用于局部修复分析。
六、小结:一分钟记住“点云四步曲”
        1) 读:pcread / lasread / load → pointCloud 对象  
        2) 看:pcshow (+pcnormals/pcshowpair)  
        3) 改:颜色、ROI、滤波、配准、重建…(全部基于对象句柄)  
        4) 存:pcwrite / laswrite / writematrix,格式随心转  

        掌握以上流程,即可在 MATLAB 中完成“端到端”点云处理任务,为测绘、自动驾驶、工业检测等应用提供快速原型与算法验证平台。

        本次使用的数据是兔砸,就是兔砸,还是兔砸!

一、点云读取、显示和保存程序

function pointCloudGUI
% PointCloudGUI  简易点云浏览器(Matlab R2020a)
%  支持 pcd/ply/txt 读取、染色、保存%% 主窗口
fig = figure('Name','PointCloud GUI  (R2020a)','NumberTitle','off',...'Units','pixels','Position',[200 100 900 700],...'MenuBar','none','ToolBar','none');%% 左侧按钮面板
uicontrol('Style','text','Units','pixels','Position',[20 640 120 20],...'String','文件操作','BackgroundColor',fig.Color,'FontWeight','bold');uicontrol('Style','push','Units','pixels','Position',[20 600 120 30],...'String','读取点云','Callback',@cbRead);uicontrol('Style','push','Units','pixels','Position',[20 560 120 30],...'String','保存当前点云','Callback',@cbSave);uicontrol('Style','text','Units','pixels','Position',[20 510 120 20],...'String','颜色显示','BackgroundColor',fig.Color,'FontWeight','bold');uicontrol('Style','push','Units','pixels','Position',[20 470 120 30],...'String','原始颜色','Callback',@(s,e) cbColor('orig'));uicontrol('Style','push','Units','pixels','Position',[20 430 120 30],...'String','自定义单色','Callback',@(s,e) cbColor('mono'));uicontrol('Style','push','Units','pixels','Position',[20 390 120 30],...'String','随机染色','Callback',@(s,e) cbColor('rand'));%% 右侧坐标轴用于显示
ax = axes('Units','pixels','Position',[170 50 700 600],...'Color',[0.2 0.2 0.2],'Box','on');%% 全局变量
global gCloud gAxes gFile
gCloud  = [];      % 当前点云
gAxes   = ax;      % 显示轴
gFile   = '';      % 文件名%% 回调函数function cbRead(~,~)[fn,pn] = uigetfile({'*.pcd;*.ply;*.txt','点云文件 (*.pcd,*.ply,*.txt)'},...'选择点云');if isequal(fn,0), return, endgFile = fullfile(pn,fn);ext = lower(fn(max(0,end-2):end));switch extcase 'pcd'gCloud = pcread(gFile);case 'ply'% matlab 的 pcread 支持 plygCloud = pcread(gFile);otherwise  % txtM = dlmread(gFile);if size(M,2)<3errordlg('TXT 至少需要 xyz 三列','格式错误');returnendxyz = M(:,1:3);if size(M,2)>=6   % 有 rgbrgb = M(:,4:6);if max(rgb(:))>1rgb = rgb/255;   % 0-1 之间endgCloud = pointCloud(xyz,'Color',rgb);elsegCloud = pointCloud(xyz);endendupdateView();endfunction cbSave(~,~)if isempty(gCloud)errordlg('先读取点云','提示');returnend[fn,pn] = uiputfile('*.ply','保存为 PLY', ...[datestr(now,'yyyymmdd_HHMMSS') '.ply']);if isequal(fn,0), return, endpcwrite(gCloud,fullfile(pn,fn),'PLYFormat','binary');endfunction cbColor(mode)if isempty(gCloud)errordlg('先读取点云','提示');returnendxyz = gCloud.Location;switch modecase 'orig'   % 原始if ~isempty(gCloud.Color)clr = gCloud.Color;elseclr = [];endcase 'mono'   % 自定义单色c = uisetcolor([0.5 0.5 0.5],'选择单色');if isnan(c(1)), return, endclr = repmat(c,size(xyz,1),1);case 'rand'   % 随机clr = rand(size(xyz,1),3);endgCloud = pointCloud(xyz,'Color',clr);updateView();endfunction updateView()cla(gAxes);if isempty(gCloud), return, endpcshow(gCloud,'Parent',gAxes);title(gAxes, sprintf('点数 = %d',size(gCloud.Location,1)));axis(gAxes,'tight'); view(3); grid onend
end

一、点云读取、显示和保存结果

        可以看出,点云读取的那是相当快,而且处理的也不慢,界面非常友好。还有插一嘴,不得不说呀兄弟们,matlab的发展是真的快,有些功能比python好用太多了。详细的大家可以对比下和以前python的区别。

就酱,下次见^-^

http://www.dtcms.com/a/392906.html

相关文章:

  • 工业现场实战:如何利用智能网关实现西门子PLC与库卡机器人的无缝连接
  • 【开题答辩全过程】以 Java程序设计课程作业数据分析为例,包含答辩的问题和答案
  • ubuntu配置cuda与torch
  • C语言:输出水仙花数
  • 进程的创建
  • 如何用Anaconda Navigator和命令行管理Python库?
  • 28 种 LLM 越狱攻击全景拆解(2025.9 版)从“AIM”到“Generation Exploitation”,一张防御地图看懂所有套路
  • 第14章 智能床位
  • 总结一下MySQL数据库服务器性能优化的几个维度
  • IP 打造财富新机遇
  • linux系统如何查看文件位置在数据盘还是系统盘
  • C#关键字 unchecked与checked
  • EasyClick JavaScript 字符串进阶
  • 小明打砖块-算法
  • 【Open3D】在Conda环境下安装Open3D | Anaconda | VSCode
  • AWS 的存储方案全对比:EBS、S3、EFS 用在哪?
  • 【实证分析】上市公司债务违约风险KMV模型及违约距离(2000-2023年)
  • 【牛客网】dd爱科学 最长非递减子序列 二分查找
  • vmware安装uos v20无法识别网卡
  • 力扣hot100 | 动态规划1 | 70. 爬楼梯、118. 杨辉三角、198. 打家劫舍、279. 完全平方数、322. 零钱兑换
  • 每天五分钟深度学习:softmax回归的交叉熵损失的前向传播
  • leetcode算法刷题的第四十天
  • 算法基础篇(3)高精度
  • Java Log
  • 最常见的MCP服务
  • 如何安装tomcat服务器以及如何解决服务器的乱码问题
  • 软考中级习题与解答——第九章_信息安全(1)
  • 小迪安全v2023学习笔记(八十五讲)—— APP攻防反证书反代理反模拟器绕过XP框架
  • Oracle VM 设置CentOS7网络
  • lua代码解析1