首页 > 编程语言 >【Python-Open3D学习笔记】005Mesh相关方法

【Python-Open3D学习笔记】005Mesh相关方法

时间:2024-11-29 19:32:54浏览次数:6  
标签:triangle Python hull vertices mesh 005Mesh Open3D 三角形 triangles

TriangleMesh相关方法

文章目录

1. 查看mesh三角形面信息

def view_hull_triangles(hull: o3d.geometry.TriangleMesh):
    """
    查看mesh三角形面信息(顶点索引、顶点坐标)
    :param hull:
    :return:
    """
    # 获取三角形的顶点索引
    triangles = np.asarray(hull.triangles)  # 每个三角形由三个顶点的索引组成
    # 获取顶点坐标
    vertices = np.asarray(hull.vertices)  # 所有顶点的坐标

    print(f"总共有 {len(triangles)} 个三角形面")
    for i, triangle in enumerate(triangles):
        print(f"三角形 {i + 1}: 顶点索引 {triangle}, 顶点坐标:")
        for idx in triangle:
            print(f"  顶点 {idx}: {vertices[idx]}")

    return triangles, vertices

2. 可视化三角形

def highlight_triangle(hull: o3d.geometry.TriangleMesh, triangle_idx: int):
    """
    可视化单个三角形
    :param hull:
    :param triangle_idx:
    :return:
    """
    # 获取三角形索引
    triangles = np.asarray(hull.triangles)
    vertices = np.asarray(hull.vertices)

    # 获取特定三角形的顶点
    triangle = triangles[triangle_idx]
    triangle_vertices = vertices[triangle]

    # 创建一个新点云,表示高亮的三角形
    highlight = o3d.geometry.TriangleMesh()
    highlight.vertices = o3d.utility.Vector3dVector(triangle_vertices)
    highlight.triangles = o3d.utility.Vector3iVector([[0, 1, 2]])
    highlight.paint_uniform_color([1, 0, 0])  # 高亮颜色:红色

    # 绘制原始凸包和高亮三角形
    o3d.visualization.draw_geometries([hull, highlight], window_name="Highlight Triangle")
def highlight_all_triangles(hull: o3d.geometry.TriangleMesh, show=False):
    """
    可视化所有三角形
    :param hull:
    :param show: 是否直接显示
    :return:
    """
    # 获取三角形索引和顶点坐标
    triangles = np.asarray(hull.triangles)
    vertices = np.asarray(hull.vertices)

    # 创建一个新三角网格,用于高亮显示
    highlight_mesh = o3d.geometry.TriangleMesh()

    # 存储所有高亮的顶点和三角形
    all_highlighted_vertices = []
    all_highlighted_triangles = []
    colors = []

    for i, triangle in enumerate(triangles):
        # 获取三角形顶点
        triangle_vertices = vertices[triangle]

        # 偏移索引(因为顶点需要连续编号)
        base_index = len(all_highlighted_vertices)

        # 添加当前三角形的顶点
        all_highlighted_vertices.extend(triangle_vertices)

        # 添加当前三角形的索引(注意偏移)
        all_highlighted_triangles.append([base_index, base_index + 1, base_index + 2])

        # 为每个三角形分配随机颜色
        random_color = np.random.rand(3)  # RGB 随机颜色
        colors.append(random_color)

    # 设置高亮网格的顶点、三角形和颜色
    highlight_mesh.vertices = o3d.utility.Vector3dVector(all_highlighted_vertices)
    highlight_mesh.triangles = o3d.utility.Vector3iVector(all_highlighted_triangles)
    highlight_mesh.vertex_colors = o3d.utility.Vector3dVector(
        np.repeat(colors, 3, axis=0)  # 每个顶点与其三角形共享同样的颜色
    )

    # 绘制原始凸包和高亮网格
    # o3d.visualization.draw_geometries([hull, highlight_mesh], window_name="Highlight All Triangles")
    if show:
        o3d.visualization.draw_geometries([highlight_mesh], window_name="Highlight All Triangles")
    return highlight_mesh

显示效果:

在这里插入图片描述

3. 上采样

def upsample_by_mesh(mesh: o3d.geometry.TriangleMesh, number_of_points: int = 10000):
    """
    通过mesh进行上采样
    :param mesh:
    :param number_of_points:
    :return:
    """
    dense_pcd = mesh.sample_points_uniformly(number_of_points=number_of_points)
    return dense_pcd

原始数据:

在这里插入图片描述

上采样后:

在这里插入图片描述

4. 计算mesh形成的面积和体积

def calculate_hull_metrics(hull: o3d.geometry.TriangleMesh):
    surface_area = 0
    volume = 0
    try:
        if not hull.is_watertight():
            # print("网格不是水密的!尝试简化修复")
            hull = hull.simplify_quadric_decimation(target_number_of_triangles=1000)

        # print("网格是水密的!")
        # 计算表面积
        surface_area = hull.get_surface_area()
        # 计算体积
        volume = hull.get_volume()
        return surface_area, volume
    except Exception as e:
        print(f"Error occurred: {str(e)}")
        return surface_area, volume

标签:triangle,Python,hull,vertices,mesh,005Mesh,Open3D,三角形,triangles
From: https://blog.csdn.net/m0_51496369/article/details/144144123

相关文章

  • 蓝桥杯备考冲刺必刷题(Python) | 3412 最小化战斗力差距
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】小蓝是机甲战队的队长,他手下共有$n$名队员,每名队员都有一个战斗力值$$w_i$$。现在他需要将这$$n$$名队友分成两组$$a$$和$$b$......
  • 蓝桥杯备考冲刺必刷题(Python) | 3236 小蓝的零花钱
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】小蓝和小桥正在玩一个游戏,他们有一个长度为$$n$$的序列,其中既有偶数也有奇数,且偶数和奇数的数量相等。小蓝有一些零花钱,他可......
  • 使用 Vyper 和 Python 进行自动化登录并处理验证码
    虽然Vyper本身并不适合直接处理网页自动化任务,但我们可以通过Vyper来编写控制逻辑,并利用Python进行验证码的处理和图像识别。我们的目标是创建一个智能合约,模拟通过调用Python脚本来完成验证码的识别与登录过程。环境准备要完成自动化登录并处理验证码,我们需要以下工具......
  • 使用 Nim 和 Python 自动化处理登录和验证码
    项目概述这个项目的目标是实现一个自动化登录过程,其中包括:使用Nim编写自动化脚本来控制浏览器。通过Selenium完成自动化操作。使用外部Python脚本处理验证码的识别。2.环境准备Nim编程语言:用于编写主脚本来自动化登录操作。Selenium(Python):用Python编写验证......
  • python中的io操作
    以下是Python中I/O操作的一些示例:一、文件输入输出写入文件:#打开文件以写入模式,如果文件不存在则创建withopen('output.txt','w')asf:f.write('Hello,world!')读取文件:#打开文件以读取模式withopen('input.txt','r')asf:content=f.read......
  • 【Python入门】绘制你的桌面应用:用Python WxPython库打造用户界面
    ......
  • python 如何伪装邮箱
    '''格式:用户名@服务器域名用户名:由字母a~z(不区分大小写)、数字0~9、点、减号或下划线组成;只能以数字或字母开头和结尾,用户名长度为4~18个字符'''import random   #随机模块import string   #定义了一些常用的常量 with open("电子邮件地址.txt",'w')as 电......
  • python字符串怎么去空格
    1、strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.strip()'a b c'2、lstrip()方法,去除字符串开头的空格>>> a = " a b c ">>> a.lstrip()'a b c '3、rstrip()方法,去除字符串结尾的空格>>> a = ......
  • Python基础1
    0.关于python2和python3的区别1.默认的编码方式不同python2:ASCII编码python3:UTF-8编码1.输入函数名不同python2:name=raw_input('请输入姓名')python3:name=input('请输入姓名')2.对整型数的处理不同python232bit机器上的整型占32bit,64bit机器上的整型占64b......
  • 毕业项目推荐:基于深度学习的茶叶等级检测系统(python+卷积神经网络)
    文章目录概要一、整体资源介绍技术要点功能展示:功能1支持单张图片识别功能2支持遍历文件夹识别功能3支持识别视频文件功能4支持摄像头识别功能5支持结果文件导出(xls格式)功能6支持切换检测到的目标查看二、数据集三、算法介绍1.YOLOv8概述简介2.YOLOv5概述简......