Python實現生成矩形框、三角形框、六邊形框和圓環點云

????????本節我們分享上節提到的不填充點云。在點云處理、計算機視覺與工業檢測中,幾何輪廓(邊框/環)點云比實心點云更能反映物體的邊緣特征、結構骨架與形貌突變區域。Python 借助 NumPy 即可快速生成矩形邊框、三角形邊框、六邊形邊框與圓環點云,并可按需附加噪聲、局部加密或升維到 3-D。

下文給出統一范式: ?
① 參數定義 → ② 邊界方程 → ③ 等距/隨機采樣 → ④ 可視化/保存 → ⑤ 典型應用。

?一、共性流程

步驟關鍵操作常用 API
① 幾何參數邊長、頂點、線寬、采樣密度`np.array`
② 邊界方程參數方程 / 隱式方程`np.linspace` + 方向向量
③ 采樣策略等距采樣、隨機擾動、局部加密`np.random.rand`
④ 可視化2-D 散點或 3-D 點云`matplotlib`, `Open3D`
⑤ 保存格式`.xyz`, `.ply`, `.pcd``np.savetxt`, `open3d.io`

二、矩形邊框點云

????????1. 生成步驟
- 輸入:中心`(cx,cy)`、邊長`L,W`、線寬`w`、單點平均密度`ρ`
- 計算四條骨架線 → 對每條邊按長度×ρ采樣 → 在線寬方向±w/2 加隨機偏移
- (可選)加高程`z=0` 或擠出成“框柱”3-D 點云

????????2. 核心代碼

import numpy as np
def rectangle_frame(cx=0, cy=0, L=10, W=5, w=0.2, rho=200):seg = [L, W, L, W]dir = [np.array([1,0]), np.array([0,1]), np.array([-1,0]), np.array([0,-1])]pts = []start = np.array([cx-L/2, cy-W/2])for k in range(4):n = int(seg[k]*rho)t = np.linspace(0, 1, n)line = start[:,None] + t[None,:]*dir[k][:,None]*seg[k]noise = np.random.uniform(-w/2, w/2, (2, n))pts.append(line + noise)start = start + dir[k]*seg[k]return np.hstack(pts).Tframe = rectangle_frame()
import matplotlib.pyplot as plt
plt.figure(figsize=(5,3))
plt.scatter(frame[:,0], frame[:,1], s=1)
plt.title("Rectangle Frame Point Cloud")
plt.gca().set_aspect('equal'); plt.show()

????????3. 典型應用
- 建筑平面圖提取——僅保留墻體輪廓,用于 BIM 逆向
- PCB 焊盤邊緣定位——快速驗證 2-D 視覺測量算法
- 文檔掃描糾偏——檢測紙張四邊,估計傾斜角

三、三角形邊框點云

????????1. 生成步驟
- 輸入:三頂點`A,B,C`、線寬`w`、密度`ρ`
- 對三條邊分別參數化:`P = (1-t)Vi + tVj`
- 每條邊按長度×ρ采樣,橫向±w/2 擾動;頂點處做圓弧過渡防止斷裂

????????2. 核心代碼

def triangle_frame(A, B, C, w=0.15, rho=300):vert = [A, B, C, A] ?# 閉合pts = []for i in range(3):v1, v2 = np.array(vert[i]), np.array(vert[i+1])L = np.linalg.norm(v2-v1)n = int(L*rho)t = np.linspace(0, 1, n)line = (1-t)[:,None]*v1 + t[:,None]*v2norm = np.array([-(v2-v1)[1], (v2-v1)[0]])); norm /= np.linalg.norm(norm)noise = np.random.uniform(-w/2, w/2, n)pts.append(line + noise[:,None]*norm)return np.vstack(pts)tri = triangle_frame([0,0], [8,2], [4,7])
plt.scatter(tri[:,0], tri[:,1], s=1)
plt.title("Triangle Frame Point Cloud")
plt.gca().set_aspect('equal'); plt.show()

????????3. 典型應用
- 結構光標定板——三角形鏤空靶標邊緣提取
- 三角面片質量檢測——掃描網格后對比設計邊框
- 有限元邊界條件可視化——僅顯示殼單元外輪廓

四、六邊形邊框點云

????????1. 生成步驟
- 輸入:中心`C`、外接圓半徑`R`、線寬`w`、密度`ρ`
- 計算六頂點 → 六條邊等距采樣 → 徑向噪聲±w/2
- 可做成“蜂窩環”用于拼接測試

????????2. 核心代碼

def hexagon_frame(C, R, w=0.2, rho=250):ang = np.linspace(0, 2*np.pi, 7)[:-1]verts = np.array([C + R*np.array([np.cos(a), np.sin(a)]) for a in ang])pts = []for i in range(6):v1, v2 = verts[i], verts[(i+1)%6]L = R ? ? ? ? ? ? ? # 正六邊形邊長=Rn = int(L*rho)t = np.linspace(0, 1, n)line = (1-t)[:,None]*v1 + t[:,None]*v2norm = verts[i] - C; norm /= np.linalg.norm(norm) ?# 徑向noise = np.random.uniform(-w/2, w/2, n)pts.append(line + noise[:,None]*norm)return np.vstack(pts)hex = hexagon_frame([0,0], 5)
plt.scatter(hex[:,0], hex[:,1], s=1)
plt.title("Hexagon Frame Point Cloud")
plt.gca().set_aspect('equal'); plt.show()

????????3. 典型應用
- 蜂窩夾芯板缺陷檢測——僅掃描蜂窩壁
- 無人機集群區域圍欄——生成六邊形邊界用于路徑規劃
- 游戲六邊形地圖編輯器——快速生成可交互邊界點云

五、圓環(Ring)點云

????????1. 生成步驟
- 輸入:圓心`C`、內半徑`r`、外半徑`R`、環寬`w=R-r`、點數`N`
- 極坐標隨機采樣:半徑`rho = sqrt(rand*(R^2-r^2)+r^2)`,角度`theta = rand*2pi`
- 若僅需“環”而非實心圓,則限制`r>0`;若只要細環,可令`w`很小且加高斯徑向噪聲

????????2. 核心代碼

def ring_point_cloud(C, r, R, N):theta = np.random.uniform(0, 2*np.pi, N)rad = np.sqrt(np.random.uniform(r**2, R**2, N))x = C[0] + rad*np.cos(theta)y = C[1] + rad*np.sin(theta)z = np.zeros(N)return np.vstack((x,y,z)).Tring = ring_point_cloud([0,0], 4, 5, 2000)
plt.scatter(ring[:,0], ring[:,1], s=1)
plt.title("Ring Point Cloud"); plt.show()

????????3. 典型應用
- 管道焊縫掃描——僅保留管壁環帶
- 激光雷達標定靶——黑白環形靶點云提取
- 軸承磨損測量——對比設計環帶與實測點云偏差

六、綜合對比表

輪廓類型采樣關鍵線寬/環寬控制主要應用場景
矩形邊框四邊獨立參數化橫向噪聲建筑墻體、文檔邊界
三角邊框三邊+頂點過渡法向噪聲標定板、面片質檢
六邊形框六邊+徑向噪聲徑向噪聲蜂窩夾芯、無人機圍欄
圓環極坐標+半徑限幅內外半徑差管道、軸承、環形靶

七、進階技巧

????????1. 3-D 擠出:給邊框點云加`z=height` 或沿`z`隨機拉伸,生成“框柱”“環柱”
??????2. 局部加密:在拐角/焊縫區域提高`rho` 2×–5×,模擬人工掃描重點區
3. 噪聲模型:徑向高斯噪聲模擬激光光斑擴散;切向均勻噪聲模擬手持抖動

八、總結

????????利用 Python + NumPy,可在 30 行內完成**矩形邊框、三角形邊框、六邊形邊框與圓環點云的生成;通過調節線寬/環寬、密度與噪聲,可直接服務于**工業檢測、機器人導航、虛擬現實與測繪建模**等多個下游任務。掌握“輪廓點云”生成技術,為后續**邊緣配準、缺陷測量與骨架提取**提供了高信噪比的輸入數據。

一、總體程序

# tk_edge_shapes.py
import tkinter as tk
from tkinter import messagebox
import open3d as o3d
import numpy as np
import os
import threading# -------------------------------------------------
# 1. 通用工具
# -------------------------------------------------
def random_colors(n):return np.random.rand(n, 3)def save_and_show(pc, name):o3d.visualization.draw_geometries([pc])# os.makedirs("output", exist_ok=True)# path = os.path.join("output", name)# o3d.io.write_point_cloud(path, pc)# messagebox.showinfo("完成", f"已保存邊緣點云:{path}")# -------------------------------------------------
# 2. 邊緣采樣生成器
# -------------------------------------------------
def generate_circle(center, r, n):"""圓環邊緣"""theta = np.linspace(0, 2*np.pi, n, endpoint=False)x = center[0] + r * np.cos(theta)y = center[1] + r * np.sin(theta)return np.column_stack((x, y, np.zeros(n)))def generate_rectangle(center, w, h, n):"""矩形邊框"""w2, h2 = w/2, h/2n4 = n // 4# 下→右→上→左x1 = np.linspace(-w2, w2, n4, endpoint=False) + center[0]y1 = np.full(n4, -h2) + center[1]y2 = np.linspace(-h2, h2, n4, endpoint=False) + center[1]x2 = np.full(n4, w2) + center[0]x3 = np.linspace(w2, -w2, n4, endpoint=False) + center[0]y3 = np.full(n4, h2) + center[1]y4 = np.linspace(h2, -h2, n - 3*n4, endpoint=False) + center[1]x4 = np.full_like(y4, -w2) + center[0]return np.column_stack((np.hstack((x1, x2, x3, x4)),np.hstack((y1, y2, y3, y4)),np.zeros(n)))def generate_triangle(v0, v1, v2, n):"""三角形邊框"""n3 = n // 3def edge(p, q, cnt):t = np.linspace(0, 1, cnt, endpoint=False).reshape(-1, 1)return p + t * (q - p)return np.vstack([edge(v0, v1, n3),edge(v1, v2, n3),edge(v2, v0, n - 2*n3)])def generate_hexagon(center, r, n):"""六邊形邊框"""angles = np.linspace(0, 2*np.pi, 7, endpoint=False)[:-1]verts = np.array([[r*np.cos(a), r*np.sin(a), 0] for a in angles])n6 = n // 6pts = []for i in range(6):p, q = verts[i], verts[(i+1)%6]t = np.linspace(0, 1, n6, endpoint=False).reshape(-1, 1)pts.append(p + t * (q - p))return np.vstack(pts)# -------------------------------------------------
# 3. 按鈕回調
# -------------------------------------------------
def _build_pc(points, name):pc = o3d.geometry.PointCloud()pc.points = o3d.utility.Vector3dVector(points)pc.colors = o3d.utility.Vector3dVector(random_colors(len(points)))threading.Thread(target=save_and_show, args=(pc, name), daemon=True).start()def on_rect():pts = generate_rectangle([0, 0], 2, 1, 10000)_build_pc(pts, "rectangle_edge.pcd")def on_circle():pts = generate_circle([0, 0], 1, 10000)_build_pc(pts, "circle_edge.pcd")def on_triangle():v0 = np.array([0, 0.5, 0])v1 = np.array([-0.5, -0.5, 0])v2 = np.array([0.5, -0.5, 0])pts = generate_triangle(v0, v1, v2, 10000)_build_pc(pts, "triangle_edge.pcd")def on_hexagon():pts = generate_hexagon([0, 0], 1, 12000)_build_pc(pts, "hexagon_edge.pcd")def on_exit():root.destroy()# -------------------------------------------------
# 4. GUI
# -------------------------------------------------
root = tk.Tk()
root.title("Open3D 邊緣點云生成器")
root.resizable(False, False)tk.Label(root, text="選擇要生成的形狀(僅邊緣):", font=("微軟雅黑", 14)).grid(row=0, column=0, columnspan=2, pady=10)btn_style = {"width": 15, "font": ("微軟雅黑", 12)}
tk.Button(root, text="矩形", command=on_rect, **btn_style).grid(row=1, column=0, padx=15, pady=8)
tk.Button(root, text="三角形", command=on_triangle, **btn_style).grid(row=1, column=1, padx=15, pady=8)
tk.Button(root, text="六邊形", command=on_hexagon, **btn_style).grid(row=2, column=0, padx=15, pady=8)
tk.Button(root, text="圓形", command=on_circle, **btn_style).grid(row=2, column=1, padx=15, pady=8)
tk.Button(root, text="退出", command=on_exit, **btn_style).grid(row=3, column=0, columnspan=2, pady=15)root.mainloop()

二、結果運行顯示

????????喏,不填充版本依舊使用上節的GUI,好看又好用。關于圖形邊界的寬度,同學們可以自己動動小手調節嘗試下。就醬,下次見^-^

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

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

相關文章

2025年本體論:公理與規則的挑戰與趨勢

摘要本文章旨在深入探討本體論(Ontology)中公理(Axioms)與規則(Rules)的核心概念、技術實現、驗證方法、性能評估及其在2025年的前沿趨勢與挑戰。公理與規則是構建嚴謹、一致知識模型的邏輯基石&#xff0c…

【51單片機】【protues仿真】基于51單片機PM2.5空氣質量檢測系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、LCD1602液晶顯示 2、按鍵?設置閾值 3、PM2.5大于閾值時啟動聲光警報 二、使用步驟 基于51單片機的PM2.5空氣質量檢測系統通常采用STC89C51/52作為核心控制器,結合…

【目錄-單選】鴻蒙HarmonyOS開發者基礎

用哪一種裝飾器修飾的組件可作為頁面入口組件?Look at the answer下面是ArkTS中類名、枚舉名推薦的代碼風格是 Look at the answer向服務器提交表單數據,以下哪種請求方式比較合適 Look at the answer使用http發起網絡請求,需要以下哪種權限&…

maven【maven】技術詳解

MavenMaven的本質是項目管理工具,將項目開發和管理過程抽象成一個項目對象模型(POM)Project Object Model:項目對象管理模型作用: 項目構建:提供標準的、跨平臺的自動化項目構建方式依賴管理:方…

【操作系統-Day 25】死鎖 (Deadlock):揭秘多線程編程的“終極殺手”

Langchain系列文章目錄 01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

【嵌入式C語言】七

8.4函數的聲明和定義聲明一個函數意味著向編譯器描述函數名、返回值、參數個數和類型,但并不會為函數分配存儲空間定義一個函數意味著在聲明變量的同時還要有具體的實現,并且會為函數分配存儲空間8.5多源文件的函數聲明和定義8.6預處理指令#Include#incl…

hardhat3 源神 -- 啟動!

Hardhat 項目開發環境搭建完整指南 1. 從 GitHub 下載項目 # 使用 SSH 方式克隆(需要配置 SSH key) git clone gitgithub.com:NomicFoundation/hardhat.git# 或使用 HTTPS 方式 git clone https://github.com/NomicFoundation/hardhat.git# 進入項目目錄…

遇到 Git 提示大文件無法上傳確實讓人頭疼

遇到 Git 提示大文件無法上傳確實讓人頭疼,但別擔心,我們可以一步步來解決。為了讓你更清晰地了解整個流程,我先用一個表格來概括主要步驟:步驟核心操作關鍵命令/工具示例 (用于刪除歷史中的大文件)1. 定位大文件使用 Git 命令或工…

機器人控制器開發(傳感器層——奧比大白相機適配)

編譯OrbbecSDK_ROS2的代碼 執行命令 colcon buildros2 launch orbbec_camera dabai.launch.py問題1: 運行時報錯: [component_container-1] [ERROR] [1757153916.450795107] [camera.camera_container]: Failed to load library: Could not load library…

C語言(長期更新)第15講 指針詳解(五):習題實戰

C語言(長期更新)第15講 指針詳解(五):習題實戰 跟著潼心走,輕松拿捏C語言,困惑通通走,一去不回頭~歡迎開始今天的學習內容,你的支持就是博主最大的動力。博主主頁&#…

數據倉庫概要

什么是數據倉庫? 數據倉庫是一個面向主題的、集成的、相對穩定的、反映歷史變化的數據集合,用于支持管理決策。 核心特征 1. 面向主題 數據倉庫圍繞核心業務主題(如客戶、產品、銷售、財務)來組織數據,而不是圍繞具體的…

python庫 Py2exe 的詳細使用(將 Python 腳本變為Windows獨立軟件包)

更多內容請見: python3案例和總結-專欄介紹和目錄 文章目錄 一、Py2exe 概述 1.1 Py2exe介紹 1.2 Py2exe安裝 1.3 替代工具推薦 二、基礎使用 2.1 編寫打包腳本 2.2 執行打包命令 2.3 完整案例 2.4 配置選項詳解 2.5 構建和分發 三、高級配置 3.1 包含隱藏導入 3.2 處理特殊包…

CuTe C++ 簡介02,gemm_device cuda kernel 的實現

《CuTe C 簡介01,從示例開始 》 中,最后看到了 計算 gemm 的cuda kernel,使用 NVIDIA CUTLASS 的 CUTe (CUDA Tile) 庫實現的高性能 GEMM (通用矩陣乘法) CUDA kernel。接下來解釋一下這個內核的各個部分。文末再貼一遍代碼,方便查…

萬代《寶可夢》主題新品扭蛋公開!史上最大尺寸

使用jQuery的常用方法與返回值分析 jQuery是一個輕量級的JavaScript庫,旨在簡化HTML文檔遍歷和操作、事件處理以及動畫效果的創建。本文將介紹一些常用的jQuery方法及其返回值,幫助開發者更好地理解和運用這一強大的庫。 1. 選擇器方法 jQuery提供了多種…

【FastDDS】Layer Transport ( 05-Shared Memory Transport)

6.4 共享內存傳輸 共享內存(SHM)傳輸依靠主機操作系統提供的共享內存機制,實現了在同一處理單元/機器上運行的實體之間的快速通信。注意 Fast DDS 利用域參與者(DomainParticipant)的 GuidPrefix_t 來識別在同一主機上…

記 2025/9/6

人工智能常見的模型按照處理問題分為6大類:處理權重問題的權重模型、處理狀態問題的狀態模型、處理序列問題的問題模型、處理表示問題的表示模型、處理相似度的相似模型、處理分類問題的分類模型。權重是計算特定狀態下事物的重要性。狀態問題是刻畫權重動態變化的過…

開啟Python之路,第一節學習大綱-從入門到進階

前端開啟Python之路,前端有沒有必要卷后端技術,歡迎各位大神批評指正 第一階段:基礎入門 (打好根基) 目標: 理解編程基本概念,掌握 Python 核心語法,能編寫簡單的腳本程序。 1、環境搭建與開發工具 安裝 Py…

webshell及冰蝎雙擊無法打開?

什么是webshell? web:萬維網 shell:是指一種應用程序,為用戶和系統之間建立連接,通過這個界面訪問操作系統內核的服務 webshell:是以asp、aspx、php、jsp或者cgi等網頁文件形式存在的一種命令執行環境,也可以將其稱做…

【星閃】Hi2821 | PWM脈寬調制模塊 + 呼吸燈例程

1. 簡介PWM(Pulse Width Modulation),全稱脈寬調制,通過對一系列脈沖的寬度進行調制,等效出所需波形。即對模擬信號電平進行數字編碼,通過調節頻率、占空比的變化來調節信號的變化。一個 PWM 周期內由一段高…

51單片機---硬件學習(電子琴、主從應答模式、modbus模型、DS18B20傳感器顯示溫度)

一、串行通信與并行通信1、串行通信定義:數據一位一位地按順序通過單條傳輸線進行傳輸的通信方式。優點:傳輸線少,成本低,適合長距離傳輸缺點:傳輸速度相對較慢2、并行通信定義:數據的各位同時通過多條并行…