本次我们分享一种基于 Open3D 的快速、稳健方法,用于从激光点云中自动提取“地面”并计算其投影面积。算法先自适应估计地面高程,再将地面点投影至水平面,随后用凸包或最小外接矩形求取面积。整个流程无需人工干预,单文件即可运行,已封装成 Python 模块与图形界面,可直接嵌入地形测绘、建筑规划、农林监测、灾害评估等应用。

一、实现流程  
1. 加载点云:支持 PCD/PLY/XYZ 等常见格式。  
2. 地面分割:采用类 Otsu 自适应阈值,自动分离地面与非地面点。  
3. 二维投影:将地面点正射投影至 XY 平面。  
4. 边界提取:提供凸包与最小旋转矩形两种策略。  
5. 面积输出:返回平方米数值,可选可视化边界与文件报告。

二、应用场景  
- 地形制图:一键估算裸露地表面积,辅助 DEM 生产。  
- 城市规划:批量计算建筑底面轮廓,快速统计容积率。  
- 农林生态:量测植被或农田冠层投影,评估生长状况与产量。  
- 灾害应急:震后/滑坡区域快速圈定受灾范围,指导救援。  
- 土方计量:开挖前后两次点云对比,自动计算实际填挖面积与体积。

三、特点  
- 零依赖 GUI:拷贝即用,无需编写代码。  
- 自动阈值:对高低起伏、植被遮挡数据依然稳健。  
- 双模式面积:凸包(精确边界)与 Min-BBox(规则轮廓)任意切换。  
- 结果可溯源:同步输出边界矢量(GeoJSON),方便导入 GIS 平台。

        本次我们使用的数据——————————————兔砸!!!(当然,任意点云都可以)

一、投影面积计算程序

import tkinter as tk
from tkinter import filedialog, messagebox
import open3d as o3d
import numpy as np
from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg# ---------- 业务逻辑 ----------
def read_pcd():# """弹出文件选择框并读取点云"""# file = filedialog.askopenfilename(#     title="选择点云文件",#     filetypes=[("点云", "*.pcd *.ply *.xyz"), ("所有文件", "*.*")])# if not file:#     return Nonefile = "E:/CSDN/规则点云/bunny.pcd"pcd = o3d.io.read_point_cloud(file)if pcd.is_empty():messagebox.showerror("错误", "点云读取失败!")return Nonereturn pcddef auto_height_threshold(points):"""简单 Otsu 思想取地面阈值"""z = points[:, 2]z_min, z_max = z.min(), z.max()best_th, best_var = z_min, 0for th in np.linspace(z_min, z_max, 100):back, fore = z[z <= th], z[z > th]if fore.size == 0 or back.size == 0:continuew0, w1 = back.size / z.size, fore.size / z.sizemean0, mean1 = back.mean(), fore.mean()mean_all = w0 * mean0 + w1 * mean1inter_var = w0 * (mean0 - mean_all) ** 2 + w1 * (mean1 - mean_all) ** 2if inter_var > best_var:best_var, best_th = inter_var, threturn best_thdef calc_area(pcd, draw=False):"""返回面积,可选弹出投影图"""pts = np.asarray(pcd.points)th = auto_height_threshold(pts)ground = pts[pts[:, 2] <= th, :2]if ground.shape[0] < 3:messagebox.showerror("错误", "地面点不足 3 个!")return Nonehull = ConvexHull(ground)area = hull.volume  # 2D 凸包 volume = areaif draw:# 弹出新窗口画投影win = tk.Toplevel()win.title("地面投影与凸包")fig, ax = plt.subplots(figsize=(4, 4))ax.scatter(ground[:, 0], ground[:, 1], s=1, c='g')for simplex in hull.simplices:ax.plot(ground[simplex, 0], ground[simplex, 1], 'r-')ax.set_aspect('equal')ax.set_title(f"Convex-Hull Area = {area:.3f}")canvas = FigureCanvasTkAgg(fig, master=win)canvas.draw()canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)return area# ---------- 按钮回调 ----------
def on_convex_hull():pcd = read_pcd()if pcd is None:returnarea = calc_area(pcd, draw=False)if area is not None:messagebox.showinfo("结果", f"凸包占地面积:{area:.4f} 平方单位")def on_convex_hull_with_plot():pcd = read_pcd()if pcd is None:returnarea = calc_area(pcd, draw=True)if area is not None:# 信息已在弹窗标题passdef on_exit():root.quit()root.destroy()# ---------- GUI ----------
root = tk.Tk()
root.title("点云地面面积计算")
root.geometry("300x160")
root.resizable(False, False)btn1 = tk.Button(root, text="1. 凸包面积", width=25, command=on_convex_hull)
btn2 = tk.Button(root, text="2. 凸包面积+投影图", width=25,command=on_convex_hull_with_plot)
btn3 = tk.Button(root, text="3. 退出", width=25, command=on_exit)btn1.pack(pady=10)
btn2.pack(pady=10)
btn3.pack(pady=10)root.mainloop()

二、投影面积计算结果

        这次依然沿用以前的GUI风格(主要是太好用了,谁用谁知道)。可以看到,两种投影面积计算方法得到的投影面积差不多。因为我们选用了自适应参数,所以效果基本上是最佳的。同学们如果有兴趣,可以自己调调参数试试,可以更加记忆深刻哦。就酱,下次见^-^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/98090.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/98090.shtml
英文地址,请注明出处:http://en.pswp.cn/web/98090.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AXI4 协议

一、AXI4简介AXI4&#xff08;Advanced eXtensible Interface 4&#xff09;是ARM公司推出的高性能片上总线协议&#xff0c;属于AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;标准的一部分。它专为高带宽、低延迟的片上通信设计&#xff0c;广泛应用…

《饿殍:明末千里行》Switch版试玩发布 3月13日发售

使用jQuery的常用方法与返回值分析 jQuery是一个轻量级的JavaScript库&#xff0c;旨在简化HTML文档遍历和操作、事件处理以及动画效果的创建。本文将介绍一些常用的jQuery方法及其返回值&#xff0c;帮助开发者更好地理解和运用这一强大的库。 1. 选择器方法 jQuery提供了多种…

[特殊字符] 认识用户手册用户手册(也称用户指南、产品手册)是通过对产品功能的清

一份优秀的用户手册能有效降低用户的使用门槛&#xff0c;提升用户体验和工作效率。下面我将为你梳理编写用户手册的核心要点、步骤和技巧。&#x1f4d6; 认识用户手册用户手册&#xff08;也称用户指南、产品手册&#xff09;是​​通过对产品功能的清晰解释&#xff0c;为特…

苹果软件代码混淆,iOS混淆、iOS加固、ipa安全与合规取证注意事项(实战指南)

在移动软件交付与合规审计中&#xff0c;苹果软件代码混淆已成为保护知识产权与用户数据的常规手段。但混淆带来的不仅是逆向难度的提升&#xff0c;也会触发崩溃取证、符号化&#xff08;symbolication&#xff09;、审计合规与法律证据保存等问题。本文从工程与合规双视角出发…

Redis框架详解

目录 1. redis是什么 主要特点 2. redis中存储的数据类型 2.1 String类型 2.2 List类型 2.3 Hash类型 2.4 Set类型 2.5 Zset类型 2.6 其它类型 3.redis高可用框架 1. redis是什么 Redis 是一个开源的、基于内存的数据结构存储系统&#xff0c;是 Remote Dictionary…

每日随机展示10个wordpress置顶文章

WordPress 置顶文章是博主根据自己的需要设置的&#xff0c;通常用于展示重要或热门的文章。 以下是一个示例代码&#xff0c;用于在 WordPress 主题中展示 10 个置顶文章&#xff1a; <?php // 查询置顶文章 $sticky get_option(sticky_posts); $args array(post__in …

金融工程vs金融数学:谁更贴近量化交易?

在金融行业迈向高度数字化的今天&#xff0c;量化交易已成为顶尖金融机构的核心竞争力之一。它以数学模型为基础&#xff0c;借助编程技术实现策略自动化&#xff0c;在高频、中低频、套利、因子投资等多个领域展现出强大生命力。对于有志于此的大学生而言&#xff0c;选择一个…

实测AI Ping,一个大模型服务选型的实用工具

作为一名长期奋战在一线的AI应用工程师&#xff0c;我在技术选型中最头疼的问题就是&#xff1a;“这个模型服务的真实性能到底如何&#xff1f;” 官方的基准测试总是在理想环境下进行&#xff0c;而一旦投入使用&#xff0c;延迟波动、吞吐下降、高峰期服务不可用等问题就接踵…

深信服软件:aTrustAgent异常占用问题处理

问题&#xff1a;aTrustAgent占用CPU 大早上开电脑&#xff0c;风扇转的飞起&#xff0c;任务管理器看&#xff0c;发现是有几个 aTrustAgent 进程搞得鬼。 印象中&#xff0c;好像没有装过这个软件&#xff0c;搜了下&#xff0c;是深信服的软件&#xff0c;不知道是不是装哪…

基于国产银河麒麟服务器SP3项目实战(Nginx+Keepalive)实现高可用负载均衡

一、环境准备 192.168.113.11NginxKeepalive(Master)192.168.113.22Nginxkeepalive(Backup)192.168.113.33Nginx(web服务器)192.168.113.44 Nginx(服务器&#xff09; 二、环境搭建准备 2.1 Nginx源码编译安装 参考作责之前发布《Nginx源码编译安装》https://blog.csdn.net…

K近邻:从理论到实践

K近邻&#xff1a;从理论到实践 文章目录K近邻&#xff1a;从理论到实践1. 核心思想2. 距离度量3. k的选择与误差分析3.1 近似误差3.2 估计误差3.3 总误差4. kd树的构造与搜索4.1 kd树的构造4.2 kd树的搜索5. 总结6. K近邻用于iris数据集分类6.1加载数据6.2加载模型并可视化1. …

Dokcer的安装(ubuntu-20.04.6):

Dokcer的安装(ubuntu-20.04.6)&#xff1a; 1.添加Docker仓库 #更新本地软件包索引&#xff0c;获取最新的软件包信息 sudo apt-get update #安装依赖包 sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release #创建密钥存储目录 sudo mkdir -p /etc/apt/…

CT图像重建原理

一、CT到底测了什么&#xff1f;硬件动作X 射线源与探测器阵列对置&#xff0c;围着物体旋转。每转到一个角度 θ&#xff08;也叫一个视角 / view&#xff09;&#xff0c;源发射扇形/平行的射线束&#xff0c;探测器阵列上有很多“通道/像素/bin”&#xff08;记作索引 n&…

【pycharm】 ubuntu24.04 搭建uv环境

通过uv配置python环境 一直是conda环境 现在有个开源项目说用uv更快更好 所以在pycharm搞起。 一开始在在一个conda项目的里面某个项目里搞 发现会被conda 环境影响。 导致deepseed 安装不了。 python 环境不对 # NOTE: We must explicitly request them as `dependencies` abo…

从软件工程角度谈企业管理

从软件工程角度谈企业管理企业管理&#xff0c;本质上是人与人之间的博弈。 管理的最大难题&#xff0c;不是定目标、不是写流程&#xff0c;而是&#xff1a;如何让个体的利益最大化路径&#xff0c;与组织的整体目标一致&#xff1f; 这就是经济学里的“激励相容”。 在互联网…

vue3 实现前端生成水印效果

vue3 实现前端生成水印效果首先一点哈&#xff0c;就是单纯web前端生成水印只能作为警示使用&#xff0c;如果享彻底防住几乎是不可能的&#xff0c;有无数种方式去掉web前端生成的水印&#xff0c;所以这种方式只当是一个君子协议吧。编写水印组件 首先直接把这部分封装成一个…

Armonia Mall超级数字生态WEB3商城的引领者

Armonia Mall是一个基于Web3技术的超级数字生态商城&#xff0c;旨在打造全球首家Web3数字普惠商城&#xff0c;帮助千万行销人实现数字生态创业&#xff0c;让全球一亿家庭共享数字经济红利。 Armonia Mall商城创始人&#xff1a;石玉华Armonia Mall七大超级机制&#xff08;模…

Axios与Java Spring构建RESTful API服务集成指南

1 前后端分离时代的技术选择 现在的Web开发&#xff0c;前后端分离已经不是什么新鲜事了。前端用什么&#xff1f;很多团队选择Axios。后端呢&#xff1f;Java Spring依然是企业级应用的首选。 Axios这个JavaScript库确实好用&#xff0c;Promise-based的设计让异步请求变得简单…

Django ORM多对多关系实战指南

一、Django 多对多关系的原理 在关系型数据库中&#xff0c;多对多关系通常需要 第三张中间表 来维护两张表之间的对应关系。 在 Django 中&#xff0c;你只需要定义 ManyToManyField&#xff0c;Django 会自动帮你创建这张中间表。 特点&#xff1a; 可以双向查询&#xff08;…

STM32 单片机开发 - TIM 定时器(PWM)

一、硬件定时器高级控制定时器 Advanced Control Timers (TIM1/TIM8)通用定时器 General Purpose Timers (TIM2/TIM3/TIM4/TIM5)通用定时器 General Purpose Timers (TIM15/TIM16/TIM17)基本定时器 Basic Timers (TIM6/TIM7)表 1 定时器种类二、TIM 中 PWM 概念PWM 的基本原理就…