《思路存档》基于Matlab的点云数据处理方法实现1
程序员文章站
2022-06-02 21:48:37
...
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
@TOC《思路存档》基于Matlab的点云数据处理方法实现
前言
就是一些思路的存档,一些工作上能用上的或者实现的数据处理方法,包括借鉴同事的思路,改写成matlab的实现之类的
一、判断点是不是在矩形(多边形)中
之前遇到的,判断点云是不是在一个平行四边形中,提取平行四边形中的点云,也是参考了同事的代码还有一些网上的思路,后面就放个函数代码以及思路。
function [ xyzi ] = IsLimes_XZ( XYZI,x_1 )
%UNTITLED5 判断点云是否在多边形中 若生成的射线
xyzi=[];
%输入角点,并将角点加一行
x_1=[x_1;x_1(1,:)];
maxX=max(x_1(:,1));
maxZ=max(x_1(:,2));
minX=min(x_1(:,1));
minZ=min(x_1(:,2));
%输入参与判断的点云坐标
%求个最小包围盒
ind=find(XYZI(:,1)<maxX & XYZI(:,3)<maxZ & XYZI(:,3)>minZ & XYZI(:,1)>minX);
XYZI=XYZI(ind,:);
for j=1:size(XYZI,1)
%参与判断的点为
x=XYZI(j,1);
y=XYZI(j,3);
c=0;
%输入角点坐标
for i=1:size(x_1,1)-1
x1=x_1(i,1);
y1=x_1(i,2);
x2=x_1(i+1,1);
y2=x_1(i+1,2);
if (y>min(y1,y2) && y<max(y1,y2))
tempx=(x1-x2)*(y-y2)/(y1-y2)+x2;
if(x < tempx)
c=c+1;
elseif (abs(x-tempx)<0.002)
c=1;
break;
end
end
end
if(mod(c,2)~=0)
xyzi=[xyzi;XYZI(j,:)];
end
end
end
二、依据多段线进行点云裁切
之前遇到的,按照轴线进行裁切,轴线为多段线
function Node=FindNode(X_Mileage,Axis)
Distance=abs(Axis(:,1)-X_Mileage);%求已知里程与中轴线上各点里程差;
%对里程排序,找到与已知里程最近的两个中轴点。
[~,Index]=sort(Distance);
P1=Axis(Index(1),:);
P2=Axis(Index(2),:);
%按里程对上述两点进行排序
Temp=sortrows([P1;P2],1);
P1=Temp(1,:);
P2=Temp(2,:);
Dx=P2(1)-P1(1);
ky=(P2(2)-P1(2))/Dx;
kz=(P2(3)-P1(3))/Dx;
Y=ky*(X_Mileage-P1(1))+P1(2);
Z=kz*(X_Mileage-P1(1))+P1(3);
Node=[X_Mileage,Y,Z];
end
%使用方法
for j=minX:1:maxX
NodeLeft=FindNode(j,LeftAxis);
IndLeft=find(sqrt((TXYZI(:,2)-NodeLeft(2)).^2+(TXYZI(:,3)-NodeLeft(3)).^2)<Distance);
LeftXYZI=TXYZI(IndLeft,:);
if(isempty(LeftXYZI))
continue;
end
LASWrite([XYZILeftOutPath,'Left.las'], LeftXYZI);
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。