欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《思路存档》基于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提供了大量能使我们快速便捷地处理数据的函数和方法。

相关标签: matlab