open3D:三維點云處理

open3d 點云數據處理

爆肝5萬字??Open3D 點云數據處理基礎(Python版)_python 點云 焊縫-CSDN博客

如何用NumPy讀取和保存點云數據 - 知乎

讀取并可視化點云

np.loadtxt 從txt中讀取點集,并open3d顯示單個點云

?txt內容:每行皆為一個點 xyz,逗號隔開,xy為圖像坐標,z為圖像序號,所有圖的點集皆存入一個txt

import open3d as o3d
import numpy as np# points_data = np.loadtxt("E:/vsproject/勛儀交接/標克艾芬達暖水管/測量主管尺寸/vp/11pnts.txt", delimiter=",", dtype=np.float32)
points_data = np.loadtxt("E:/vsproject/勛儀交接/標克艾芬達暖水管/測量主管尺寸/vp/11pnts.txt", delimiter=",")
print('shape: ', points_data.shape)
print('data type: ', points_data.dtype)points_data[:,2] = points_data[:,2] * 21 # 將所有行的第三列乘以 21# points_data = np.random.rand(100, 3)  # 示例數據:100 個隨機 3D 點
colors_data = np.random.rand(100, 3)  # 100 個隨機 RGB 顏色數組pcd = o3d.geometry.PointCloud() # 創建一個空的點云對象
pcd.points = o3d.utility.Vector3dVector(points_data[:, :3]) # 從NumPy數組points_data中分配3D點(取前3列作為 x,y,z 坐標)
pcd.colors = o3d.utility.Vector3dVector(colors_data)  # 分配顏色信息
o3d.visualization.draw_geometries([pcd]) # 可視化點云

?

讀取.pcd文件

import open3d as o3d
import numpy as npprint("->正在加載點云... ")
pcd = o3d.io.read_point_cloud("test.pcd")
print(pcd)print("->正在可視化點云")
o3d.visualization.draw_geometries([pcd])

讀取.pts文件,并進行網格化 (Mesh化)

原始點云為.pts文件,內容為x,y,z的坐標

import open3d as o3d
import numpy as np# 讀取.pts文件
def read_pts_file(filename):with open(filename, 'r') as f:lines = f.readlines()pts = []for line in lines:data = line.strip().split()pts.append([float(data[0]), float(data[1]), float(data[2])])return np.array(pts)# 加載.pts文件
pts_filename = "E:\Airplane.pts"  # 替換為.pts文件路徑
pts = read_pts_file(pts_filename)# 創建open3d格式的點云對象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(pts)# 創建alpha shape并進行mesh化
alpha = 0.015  # 設置alpha值
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha)# 可視化網格化后的結果
o3d.visualization.draw_geometries([mesh], window_name="網格化結果")

同一窗口可視化多個點云

o3d.visualization.draw_geometries([pcd1, pcd2, ... ,pcdn])

# 加載點云1
pcd1 = o3d.io.read_point_cloud("bunny.pcd")
print(pcd1)# 加載點云2
pcd2 = o3d.io.read_point_cloud("bunny0.pcd")
print(pcd2)# 可視化兩個點云
o3d.visualization.draw_geometries([pcd1, pcd2])
space = 2500
pnts_r = np.loadtxt("E:/vsproject/勛儀交接/標克艾芬達暖水管/測量主管尺寸/vpr/11pnts.txt", delimiter=",")
pnts_r[:,2] = pnts_r[:,2] * 36 # 將所有行的第三列乘以 21
pnts_r[:,1] = pnts_r[:,1] + space
pnts_r[:,0] = pnts_r[:,0] * 4
pnts_d = np.loadtxt("E:/vsproject/勛儀交接/標克艾芬達暖水管/測量主管尺寸/vpd/11pnts.txt", delimiter=",")
pnts_d[:,2] = pnts_d[:,2] * 36 # 將所有行的第三列乘以 21
pnts_d[:,1] = pnts_d[:,1] + space*2
pnts_d[:,0] = pnts_d[:,0] * 2
pnts_s = np.loadtxt("E:/vsproject/勛儀交接/標克艾芬達暖水管/測量主管尺寸/散熱片劃痕/11pnts.txt", delimiter=",")
pnts_s[:,2] = pnts_s[:,2] * 16 # 將所有行的第三列乘以 21
pnts_s[:,1] = pnts_s[:,1] + space*3
pnts_s[:,0] = pnts_s[:,0] * 2def get_pcd(points_data):pcd = o3d.geometry.PointCloud()  # 創建一個空的點云對象pcd.points = o3d.utility.Vector3dVector(points_data[:, :3])  # 從NumPy數組points_data中分配3D點(取前3列作為 x,y,z 坐標)pcd.colors = o3d.utility.Vector3dVector(colors_data)  # 分配顏色信息return pcdpcd_r = get_pcd(pnts_r)
pcd_d = get_pcd(pnts_d)
pcd_s = get_pcd(pnts_s)
o3d.visualization.draw_geometries([pcd_r,pcd_d,pcd_s]) # 可視化點云

下采樣,兩種去除離群點,均值濾波

# points_data = np.loadtxt("E:/vsproject/勛儀交接/標克艾芬達暖水管/測量主管尺寸/vp/11pnts.txt", delimiter=",", dtype=np.float32)
points_data = np.loadtxt("E:/vsproject/勛儀交接/標克艾芬達暖水管/測量主管尺寸/vpc/11pnts.txt", delimiter=",")
print('shape: ', points_data.shape)
print('data type: ', points_data.dtype)points_data[:,2] = points_data[:,2] * 36 # 將所有行的第三列乘以 21
points_data[:,0] = points_data[:,0] * 4# points_data = np.random.rand(100, 3)  # 示例數據:100 個隨機 3D 點
colors_data = np.random.rand(100, 3)  # 100 個隨機 RGB 顏色數組pcd = o3d.geometry.PointCloud() # 創建一個空的點云對象
pcd.points = o3d.utility.Vector3dVector(points_data[:, :3]) # 從NumPy數組points_data中分配3D點(取前3列作為 x,y,z 坐標)
pcd.colors = o3d.utility.Vector3dVector(colors_data)  # 分配顏色信息# 1. 下采樣(降采樣)
down_pcd = pcd.voxel_down_sample(voxel_size=0.05)
print("下采樣后的點云數量:", len(np.asarray(down_pcd.points)))# 2. 去除離群點
# 統計離群點移除
cl, ind = down_pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)
statistical_outlier_removed = down_pcd.select_by_index(ind)
print("統計離群點移除后的點云數量:", len(np.asarray(statistical_outlier_removed.points)))# 半徑離群點移除
# cl, ind = statistical_outlier_removed.remove_radius_outlier(nb_points=16, radius=0.05)
cl, ind = statistical_outlier_removed.remove_radius_outlier(nb_points=6, radius=11)
radius_outlier_removed = statistical_outlier_removed.select_by_index(ind)
print("半徑離群點移除后的點云數量:", len(np.asarray(radius_outlier_removed.points)))# 3. 濾波(平滑) - 自定義均值濾波
def mean_filter(pcd, k=5):''' 對每個點找到其k個最近的鄰居并計算均值作為濾波后的點坐標 '''points = np.asarray(pcd.points)filtered_points = np.zeros_like(points)for i in range(len(points)):# 找到k個最近的鄰居(這里簡化處理,實際應用中可以使用KD樹等高效方法)distances = np.linalg.norm(points - points[i], axis=1)nearest_indices = np.argsort(distances)[:k]filtered_points[i] = np.mean(points[nearest_indices], axis=0)filtered_pcd = o3d.geometry.PointCloud()filtered_pcd.points = o3d.utility.Vector3dVector(filtered_points)return filtered_pcdfiltered_pcd = mean_filter(radius_outlier_removed, k=5)
print("均值濾波后的點云數量:", len(np.asarray(filtered_pcd.points)))# 可視化原始點云和處理后的點云
# o3d.visualization.draw_geometries([pcd]) # 可視化點云
o3d.visualization.draw_geometries([pcd], window_name="原始點云")
o3d.visualization.draw_geometries([down_pcd], window_name="下采樣后的點云")
o3d.visualization.draw_geometries([statistical_outlier_removed], window_name="統計離群點移除后的點云")
o3d.visualization.draw_geometries([radius_outlier_removed], window_name="半徑離群點移除后的點云")
o3d.visualization.draw_geometries([filtered_pcd], window_name="均值濾波后的點云")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908595.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908595.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用聯邦多軌跡圖神經網絡(GNNs)結合稀缺數據預測嬰兒腦連接|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Predicting infant brain connectivity with federated multi-trajectory GNNs using scarce data 使用聯邦多軌跡圖神經網絡(GNNs)結合稀缺數據預測嬰兒腦連接 01 文獻速遞介紹 多模態影像下的嬰兒腦連接演化預測:聯邦學習與…

[特殊字符] 深入理解 Linux 內核進程管理:架構、核心函數與調度機制

Linux 內核作為一個多任務操作系統,其進程管理子系統是核心組成部分之一。無論是用戶應用的運行、驅動行為的觸發,還是系統調度決策,幾乎所有操作都離不開進程的創建、調度與銷毀。本文將從進程的概念出發,深入探討 Linux 內核中進…

第16節 Node.js 文件系統

Node.js 提供一組類似 UNIX(POSIX)標準的文件操作API。 Node 導入文件系統模塊(fs)語法如下所示: var fs require("fs") 異步和同步 Node.js 文件系統(fs 模塊)模塊中的方法均有異步和同步版本&#xff…

《探秘局域網廣播:網絡世界的 “大喇叭”》

揭開局域網廣播的神秘面紗 在當今數字化時代,網絡已成為人們生活和工作中不可或缺的一部分。從日常的網頁瀏覽、社交媒體互動,到企業級的數據傳輸、云計算應用,網絡通信無處不在。在這個龐大而復雜的網絡世界里,數據如同信息流在各個節點之間穿梭,而局域網廣播則是其中一種…

基于Ubuntu22.04安裝SVN服務器之倉庫遷移

基于Ubuntu22.04安裝SVN服務器之倉庫遷移 第一步: 停止svn服務器 第一步: 停止svn服務器 1)建議遷移的時候先把SN服務器停掉,以免操作失敗。 svnserve -d -r /usr/svn第二步:dump出svn代碼庫 1)通過dump出舊的svn服務器上的代碼…

Unity UI 性能優化終極指南 — Image篇

🎯 Unity UI 性能優化終極指南 — Image篇 🧩 Image 是什么? Image 是UGUI中最常用的基本繪制組件支持顯示 Sprite,可以用于背景、按鈕圖標、裝飾等是UI性能瓶頸的頭號來源之一,直接影響Draw Call和Overdraw &#x1…

「Java基本語法」代碼格式與注釋規范

Java代碼的基本格式 Java代碼的規范格式是編寫和維護Java程序的基礎,其中包括類定義、方法定義、代碼縮進、大括號位置等。 1.核心規則 每個Java文件必須包含一個公共類(public class),且Java源文件的文件名必須和這…

2025年AI編程工具推薦

目錄 👑 **一、全能型AI開發環境(IDE)**🛠? **二、AI代碼助手與插件**🎯 **三、垂直領域工具**🇨🇳 **四、國產工具精選**🔮 **五、創新前沿工具**?? **選型建議** 2025年&#x…

【工具使用】STM32CubeMX-FreeRTOS操作系統-信號標志、互斥鎖、信號量篇

一、概述 無論是新手還是大佬,基于STM32單片機的開發,使用STM32CubeMX都是可以極大提升開發效率的,并且其界面化的開發,也大大降低了新手對STM32單片機的開發門檻。 ????本文主要講述STM32芯片FreeRTOS信號標志、互斥鎖和信號…

ArrayList和LinkedList(深入源碼加擴展)

ArrayList 和 LinkedList 是 Java 集合框架中兩種常用的列表實現,它們在底層數據結構、性能特點和適用場景上有顯著的區別。以下是它們的詳細對比以及 ArrayList 的擴容機制。 1. ArrayList 和 LinkedList 的底層區別 (1) 底層數據結構 ArrayList: 基于動態數組(Dynamic Ar…

淺談 React Suspense

React Suspense 是 React 中用于處理異步操作的功能。它可以讓你"等待"某些操作,如數據獲取或組件加載完成,然后再渲染組件。Suspense 的核心理念是讓組件在準備好之前顯示一個備用的 UI,例如加載指示器,從而提高用戶體…

機器學習的數學基礎:線性模型

線性模型 線性模型的基本形式為: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回歸問題 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的參數估計$ \boldsymbol{\hat{\omega}}…

Linux【4】------RK3568啟動和引導順序

引導順序 RK3568 的啟動流程如下: 加電后,芯片首先執行 BootROM 中的代碼; BootROM 會嘗試從配置好的外部設備(如 NOR/NAND/eMMC/SD 卡)加載啟動程序; 如果這些設備都沒有有效的啟動代碼,Bo…

Deepseek/cherry studio中的Latex公式復制到word中

需要將Deepseek/cherry studio中公式復制到word中,但是deepseek輸出Latex公式,比如以下Latex代碼段,需要通過Mathtype翻譯才能在word中編輯。 $$\begin{aligned}H_1(k1) & H_1(k) \frac{1}{A_1} \left( Q_1 u_1(k) Q_{i1} - Q_2 u_2(k…

關于iview組件中使用 table , 綁定序號分頁后序號從1開始的解決方案

問題描述:iview使用table 中type: "index",分頁之后 ,索引還是從1開始,試過綁定后臺返回數據的id, 這種方法可行,就是后臺返回數據的每個頁面id都不完全是按照從1開始的升序,因此百度了下,找到了…

【機器學習】支持向量機實驗報告——基于SVM進行分類預測

目錄 一、實驗題目描述 二、實驗步驟 三、Python代碼實現基于SVM進行分類預測 四、我的收獲 五、我的感受 一、實驗題目描述 實驗題目:基于SVM進行分類預測 實驗要求:通過給定數據,使用支持向量機算法(SVM)實現分…

前端開發面試題總結-JavaScript篇(二)

文章目錄 其他高頻問題15、JS的數據類型有哪些16、如何判斷數組類型?17、解釋 this 的指向規則18、跨域問題及解決方案19、宏任務與微任務的區別是什么?列舉常見的宏任務和微任務。20、為什么微任務的優先級高于宏任務?設計目的是什么&#x…

硬件電路設計-開關電源設計

硬件電路設計-開關電源 電容選取設置輸出電壓電感的選取PCB布局典型電路 這里以杰華特的JW5359M 開關電源為例,介紹各個部分的功能電路。 當EN引腳電壓低于0.4V時,整個穩壓器關閉,穩壓器消耗的電源電流降至1μΑ以下 電容選取 1.C1和C25構成…

phosphobot開源程序是控制您的 SO-100 和 SO-101 機器人并訓練 VLA AI 機器人開源模型

?一、軟件介紹 文末提供程序和源碼下載 phosphobot開源程序是控制您的 SO-100 和 SO-101 機器人并訓練 VLA AI 機器人開源模型。 二、Overview 概述 🕹? Control your robot with the keyboard, a leader arm, a Meta Quest headset or via API 🕹?…

數據通信基礎

信道特性 1.信道帶寬W ? 模擬信道:Wf2-f1(f2和f1分別表示:信道能通過的最高/最低頻率,單位赫茲Hz)。 ? 數字信道:數字信道是離散信道,帶寬為信道能夠達到的最大數據傳輸速率,單位…