Python實現計算點云投影面積

????????本次我們分享一種基于 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 的基本原理就…