【Python-Open3D学习笔记】004Mesh生成方法

news/2024/12/5 18:53:07/

PointCloud的TriangleMesh生成方法

本文使用csv文件作为点云数据(csv —> DataFrame —> PointCloud)

文章目录

  • PointCloud的TriangleMesh生成方法
    • 0. 数据展示
    • 1. Poisson表面重建
    • 2. Alpha Shapes
    • 3. 检测边界
    • 4. 小结

0. 数据展示

数据可视化方法

python">import open3d as o3d
from pandas import DataFramedef visualization_df(df: DataFrame, name: str, folder_name: str = None) -> None:"""可视化3D点云数据:param df: 3D点云数据:param name: 可视化图形名称:param folder_name: 用于创建保存过程数据的文件夹:return: None"""points = df[['X', 'Y', 'Z']].valuespcd = o3d.geometry.PointCloud()pcd.points = o3d.utility.Vector3dVector(points)o3d.visualization.draw_geometries([pcd], window_name=name, width=1024, height=768)

在这里插入图片描述

1. Poisson表面重建

python">
def surface_by_reconstruction(data: DataFrame, show=False):"""使用 Open3D 的 Poisson Surface Reconstruction 方法,将点云转为表面网格并填充缝隙:param data::param show: 是否直接显示:return:"""points = data[['X', 'Y', 'Z']].values# 读取或生成点云point_cloud = o3d.geometry.PointCloud()point_cloud.points = o3d.utility.Vector3dVector(points)  # 替换为实际点云数据# 法向量估计(构建表面的前提)point_cloud.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.01, max_nn=30))# Poisson表面重建mesh, densities = o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd=point_cloud, depth=9)# 裁剪网格(移除多余的表面)bbox = point_cloud.get_axis_aligned_bounding_box()mesh = mesh.crop(bbox)if show:# 可视化结果o3d.visualization.draw_geometries([mesh], window_name="Closed Surface")return point_cloud, mesh

重建效果:
在这里插入图片描述
在这里插入图片描述

2. Alpha Shapes

python">def surface_by_alpha_shape(data: DataFrame, show=False):"""Alpha Shapes 是通过调整参数来生成紧密包裹点云的表面:param data::param show: 是否直接显示:return:"""points = data[['X', 'Y', 'Z']].values# 读取或生成点云point_cloud = o3d.geometry.PointCloud()point_cloud.points = o3d.utility.Vector3dVector(points)# 使用 Alpha Shapes 生成表面alpha = 10  # 调整alpha值,影响封闭程度mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(point_cloud, alpha)if show:# 可视化结果o3d.visualization.draw_geometries([mesh], window_name="Closed Surface")return point_cloud, mesh

重建效果:
在这里插入图片描述
在这里插入图片描述

3. 检测边界

python">def surface_by_hull(data: DataFrame, show=False):"""如果点云的开放区域是平坦的,可以直接检测边界并填充多边形:param data::param show: 是否直接显示:return:"""points = data[['X', 'Y', 'Z']].values# 读取或生成点云point_cloud = o3d.geometry.PointCloud()point_cloud.points = o3d.utility.Vector3dVector(points)# 提取边界hull, index_list = point_cloud.compute_convex_hull()hull.orient_triangles()  # 统一法向方向if show:# 可视化结果# o3d.visualization.draw_geometries([point_cloud, hull], window_name="Closed Surface")o3d.visualization.draw_geometries([hull], window_name="Closed Surface")return point_cloud, hull, index_list

重建效果:

在这里插入图片描述
在这里插入图片描述

4. 小结

Poisson表面重建和Alpha Shapes方法需要对参数进行调整适配,单一使用该方法泛化性不强,如果点云的开放区域是平坦的,可以直接检测边界并填充多边形形成TriangleMesh


http://www.ppmy.cn/news/1551131.html

相关文章

heapq模块常用方法

heapq.heapify(x) import heapq# heapq.heapify(x)将列表x转换为堆 # 在堆数据结构中,最小元素总是位于根节点(索引为 0) # 这个操作是在原列表上进行的,会改变列表的顺序 my_list [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] heapq.hea…

【智能摄像头带电源控制的系统实现远程监控的过程】

以下是一个详细的实现方案: 一、系统概述 智能摄像头带电源控制的远程监控系统,以智能摄像头为核心,集成电源管理、网络通信、远程控制等功能,通过互联网或局域网实现远程监控和管理。 二、关键组件与技术 1. **智能摄像头**&…

宠物领养平台:SpringBoot技术解密

第2章 开发环境与技术 本章节对开发宠物领养系统需要搭建的开发环境,还有宠物领养系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生,不仅仅是创造者感觉C语言在编…

LVS-DR工作模式简介(相对nat性能更高)

LVS-DR工作模式简介(相对nat性能更高)1.工作原理:共享ip修改mac(保证识别回包的mac地址)共享ip:虚拟网卡接口lo修改mac:内核参数在这种模式下,LVS调度器(也称为Director)和后端真实服务器(Real Server)都配置有相同的V…

电销卡风控管理系统

开发背景: 1、很多业务场景下为确保服务质量,需要对手机呼出的电话进行录音备份管理,在线试听,AI质检过滤风险关键词以及话术进行预警,防止挂羊头卖猪肉。 2、对于风险客户和在跟进客户进行拦截呼叫,一个团…

Flutter 1.2:flutter配置gradle环境

1、在android的模块中进行gradle环境配置 ①在 gradle-wrapper.properties文件中将url配置为阿里云镜像,因为gradle的服务器在国外,国内下载非常慢,也可在官网进行下载 gradle版本下载 gradle版本匹配 阿里云镜像gradle下载 可以通过复制链…

原生js上传图片

无样式上传图片 创建一个 FormData 对象:这个对象可以用于存储数据。 将文件添加到 FormData 对象:通过 append() 方法,将用户选择的文件添加到 formData 对象中。 使用 fetch 发送请求:使用 fetch API 或者其他方法将 FormDat…

C语言 qsort及应用

qsort及应用 qsort:快速排序函数,需要引用stdlib.h文件. void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *, const void *) ); 参数: base:需要排序的数组 num:数据个数(数组长度) width:每个数据的字节数(sizeof(数据类型)) compa…