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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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、并行通信定义:数据的各位同时通过多条并行…