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的区别。
就酱,下次见^-^