基于MATLAB的点云建筑物轮廓提取与基于平面探测法的点云建筑物提取

博客中轮廓提取使用的点云数据
建筑物平面检测使用的点云数据

**两个小的点云处理实验项目,(源码资源****有常(注意目前是有常哦)私我vx:xdsqczkyqs713
,第一个项目点云建筑物轮廓提取比较简单仅源码及相关测试文件20圆,第二个建筑物平面探测
源码30圆,带一份完整的方法实现论文40圆,报告仅供参考,可以就着写,节省时间,但宝儿你可千
万别傻乎乎的直接拿去上交鸭!)给的联系方式有常求源码的小可爱们加!非诚勿扰/<->认真脸)**

点云建筑物轮廓提取

1、txt文件点云数据导入:
使用uigetfile读取文件,加载后提取出点云x,y,z坐标,为了减少运算量提高速度,将坐标移动到原点,具体做法就是每个坐标值减去该坐标方向下的最小值:

[filename,pathname]=uigetfile({'*.txt';'*.ply';'*.las';},'载入点云数据');
if isequal(filename,0)||isequal(pathname,0)
    errordlg('没有选中文件','出错');
    return;
else
    file=[pathname,filename];
end
pointData = load(file);
x = pointData(:,1);
y = pointData(:,2);
z = pointData(:,3);
x = x-min(x);
y = y-min(y);
z = z-min(z);%移动到原点

2、点云图像散点图显示,主要是使用scatter3函数:

figure()
scatter3(x,y,z,'.')
grid on%显示网格
axis equal%每个坐标方向缩放比例设置为相同

在这里插入图片描述3、依据高程着色,可以直接使用matlab自带的pcshow函数:

figure()
pcshow([x,y,z],'MarkerSize',500)%以点云文件格式显示,点大小设置为500,默认以z的大小作为点的颜色深度大小
axis off
saveas(gca,strcat(pathname,filename,'.png'));%保存影像化图片

在这里插入图片描述
4、将图片保存后,采用图像处理的方法来提取建筑物轮廓,主要是应用Canny算法的边缘检测:

BW = edge(I,'Canny');
figure()
imshow(BW)

在这里插入图片描述5、在边缘检测的基础上,提取出最外围的轮廓即可
在这里插入图片描述

基于平面探测法的点云建筑物轮廓提取

1、方法流程图:
在这里插入图片描述
2、实验所采用的点云散点图显示结果如下:

在这里插入图片描述
3、使用pcshow函数,按照高程着色
在这里插入图片描述
4、基本上可以看出建筑物分布情况,大致可分为两个部分,按照高程切成两片区域:
在这里插入图片描述在每个区域中,对区域进行切块遍历,采用平面探测的方法,检测平面点:

for  i=1:znum1%从z方向开始遍历,第一块,低洼区
    zind=find(z>zpiece1(i)&z<=zpiece1(i)+stepz);%先找到符合块内z方向的点
    if length(zind)>200%如果找到的点大于200,认为有可能拟合出平面
        for j=1:ynum1%再从y方向遍历
            yind=find(y>ypiece1(j)&y<=ypiece1(j)+stepy);%找到符合块内y方向的点
            yzCommon = intersect(yind,zind);%求交集,即得到既符合z方向又符合y方向的点
            if length(yind)>50&&length(yzCommon)>50%如果满足条件的点大于30个,认为有可能拟合出平面
                for k=1:xnum%最后从x方向开始遍历
                    xind=find(x>xpiece(k)&x<=xpiece(k)+stepx);%找到符合块内x方向的点
                    pointInd = intersect(yzCommon,xind);%求交集,找到符合块内xyz三个范围的点
                    if length(xind)>50&&length(pointInd)>50%如果符合的点数大于30,开始拟合
                        xt = x(pointInd);
                        yt = y(pointInd);
                        zt = z(pointInd);
                        [f,gof]= fit([xt,yt],zt,'poly11');%选择线性平面拟合
                        if gof.rmse<0.10%假如拟合的均方根误差小于0.15,认为拟合到了比较好的平面
                           planeNum = planeNum+1;%平面数加一
                           writematrix([xt yt zt],strcat('plane',num2str(planeNum)),'Delimiter',' ');%保存找到的平面点
                        else
                            continue%continue的意思是如果不符合条件,直接进入下一轮循环遍历
                        end
                    else
                        continue
                    end
                end
            else
                continue
            end
        end
    else
        continue
    end
end

5、最终检测的结果如下:

在这里插入图片描述

  • 6
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值