基于matlab点云工具箱对点云进行处理一:去除地面,保留剩下的点

更新时间:2023-06-08 23:32:52 阅读: 评论:0

基于matlab点云⼯具箱对点云进⾏处理⼀:去除地⾯,保留剩下的点基于matlab点云⼯具箱的点云地⾯分割(去除地⾯,保留剩下的点)
步骤:
1. 读取velodyne数据包pcap⽂件内的点云数据
2. 使⽤pcdownsample函数对点云数据进⾏体素化采样,减少点云数量
3. 使⽤find函数对点云进⾏筛选读书笔记的正确格式
4. 使⽤pcdnoi去除点云内的噪声
5. 筛选低点的点云(地⾯⼀般较低)
6. 使⽤pcfitplane函数匹配平⾯(地⾯)
7. 输出
%读取激光的PCAP⽂件
%筛选感兴趣区域
%播放筛选后的点云
veloReader =velodyneFileReader('2021-11-23-12-49-43_Velodyne-HDL-32-Data.pcap','VLP32c');
%%设置感兴趣区域
vehPara.length =5.5;
vehPara.width =2.2;
vehPara.d =2.3;%轴距
vehPara.CG2Rear =1.45;%质⼼到后轴
insRegion =[-2050-101002];%感兴趣区域[minX maxX minY maxY]
groundRegion =[-1,0.2];%地⾯区域,z轴⽅向
xLimits =[insRegion(1),insRegion(2)];
yLimits =[insRegion(3),insRegion(4)];
zLimits =[insRegion(5),insRegion(6)];%原点在后轴中⼼,因此此处相对于轮芯⾼度
player =pcplayer(xLimits,yLimits,zLimits);
xlabel(player.Axes,'X (m)');
ylabel(player.Axes,'Y (m)');
zlabel(player.Axes,'Z (m)');
王莽岭veloReader.CurrentTime = veloReader.StartTime +conds(0.3);
disp(['frame数量',num2str(veloReader.NumberOfFrames)])
pau(2)
frameID =2700;
while(hasFrame(veloReader)&& player.isOpen()&&(veloReader.CurrentTime < veloReader.EndTime))
ptCloudObj =readFrame(veloReader,frameID);
frameID
tic
lidarLo =[3.501.1000];
%取出XYZ
xTemp = ptCloudObj.Location(:,:,2)+lidarLo(1);
yTemp =-ptCloudObj.Location(:,:,1)+lidarLo(2);
zTemp = ptCloudObj.Location(:,:,3)+lidarLo(3);
pc =[xTemp(:)yTemp(:)zTemp(:)single(ptCloudObj.Intensity(:))];
花儿为什么那样红%对地⾯的点进⾏范围筛选
zMin =groundRegion(1);
zMax =groundRegion(2);
pcObj =pointCloud(pc(:,1:3));
pcObj.Intensity =pc(:,4);
pcOutNum =30000;%输出的点云数量
objPointVeh =zeros(pcOutNum,4,'single');
objPointVeh(:,1)=single(insRegion(2));
objPointVeh(:,2)=single(insRegion(4));
objPointVeh(:,3)=single(insRegion(6));
objPointVeh(:,4)=single(0);
% tic
%%降低点云密度 coder会报错
%    gridStep =0.05;
%    pcObj_downSample =pcdownsample(pcObj,'gridAverage',gridStep);%降低点云密度
maxNumPoints =6;
pcObj_downSample =pcdownsample(pcObj,'nonuniformGridSample',maxNumPoints);
%    percentage =0.3;
%    pcObj_downSample =pcdownsample(pcObj,'random',percentage);
%%筛选感兴趣区域(单位⽶),并排除车⾝内部的点云
xLimits =[insRegion(1),insRegion(2)];
yLimits =[insRegion(3),insRegion(4)];
zLimits =[insRegion(5),insRegion(6)];%原点在后轴中⼼,因此此处相对于轮芯⾼度
indices =find((pcObj_downSample.Location(:,2)>=yLimits(1)...
& pcObj_downSample.Location(:,2)<=yLimits(2)...
& pcObj_downSample.Location(:,1)>=xLimits(1)...
& pcObj_downSample.Location(:,1)<=xLimits(2)...
& pcObj_downSample.Location(:,3)<=zLimits(2)...
& pcObj_downSample.Location(:,3)>=zLimits(1)...
&~(pcObj_downSample.Location(:,1)<(arOverhang)...
& pcObj_downSample.Location(:,1)>(-arOverhang)...
& pcObj_downSample.Location(:,2)<vehPara.
& pcObj_downSample.Location(:,2)>-vehPara.width/2)));%设置感兴趣的点云区域
if~impty(indices)
if~impty(indices)
pcObj_downSample =lect(pcObj_downSample,indices);
%%去除噪声
习俗手抄报[pcObj_downSample,inlierIndices,~]=pcdenoi(pcObj_downSample);
pcID_noNoi =1:1:pcObj_downSample.Count;
if~impty(inlierIndices)
%分离出地⾯
% Set the maximum point-to-plane distance(2cm)for plane fitting.
高中劝学原文及翻译maxDistance =0.2;
% Set the normal vector of the plane.
referenceVector =[0,0,1];
% Set the maximum angular distance to 5 degrees.
maxAngularDistance =10;
%筛选出较低的点⽤于去除地⾯(地⾯较低)
%只对范围内的点进⾏平⾯拟合(很低的那⼀部分点)
indices =find((pcObj_downSample.Location(:,3)>= zMin ...
& pcObj_downSample.Location(:,3)<= zMax));
if~impty(indices)
pcObj_lier =lect(pcObj_downSample,indices);
pcID_lier =pcID_noNoi(indices);
% Detect the first plane, the table,and extract it from the point cloud.
%输出不是地⾯的点
[~,inlierIndices,outlierIndices]=pcfitplane(pcObj_lier,maxDistance,referenceVector,maxAngularDistance);            pcID_outlier =pcID_lier(outlierIndices);%不是地⾯的点的ID
pcID_inlier =pcID_lier(inlierIndices);%是地⾯的点的ID
%从点云中删除属于地⾯的点,获得过滤后的点云
pcID_out = pcID_noNoi;
pcID_out(pcID_inlier)=[];
%            outlierIndices =[];
if~impty(outlierIndices)%⾮空才输出
pcRemainObj =lect(pcObj_downSample,pcID_out);
el
pcRemainObj = pcObj_downSample;
end
el
pcRemainObj = pcObj_downSample;
end
cowPCRemain =size(pcRemainObj.Location)*[1;0];
if cowPCRemain>pcOutNum
cowPCRemain = pcOutNum;改变生活
end
objPointVeh(1:cowPCRemain,:)=[pcRemainObj.Location pcRemainObj.Intensity];
%        pcRemainObj = pcObj;
海底两万里全文%        cowPCRemain =size(pcRemainObj.Location)*[1;0];
%objPointVeh(1:cowPCRemain,:)= pcRemainObj.Location;
end
end
%figure(2)
%%pcshow(plane1)
%pcshow(pcPlanel)
%title('First Plane')
% cowPCRemain =length(pcObj.Location(:,1)); %pcRemain(1:cowPCRemain,:)= pcObj.Location;
%figure(3)
%%pcshow(plane1)
%pcshow(pcRemain)
%title('remainPtCloud')
objVehPoint = objPointVeh;
%%
pcObjOut =pointCloud(objVehPoint(:,1:3)); pcObjOut.Intensity =objVehPoint(:,4);
田惠萍frameID = frameID+1;
toc
view(player,pcObjOut);
pau(0.02);
end

本文发布于:2023-06-08 23:32:52,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1027440.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:去除   筛选   感兴趣   区域
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图