使用Python 构建球体/正方体/多面体/兔子/八面体等点云,Open3D可视化及重建

news2024/11/24 22:57:29

使用Python 构建球体/正方体/多面体/兔子/八面体等点云,Open3D可视化及重建 点云生成8面体点并拟合绘制表面重建结果。(官方示例兔子,8面体,多面体,球体)

    • 1. 效果图
      • 8面体
      • 多面体效果图
      • **俩个整8面体效果图**
      • 球形/正方体点云
      • **兔子效果图**
    • 2. 源码
      • 2.1 icosahedron.ply
      • 2.2 pcd_tn.py
    • 参考

点云生成8面体点并拟合绘制表面重建结果。(官方示例兔子,8面体,多面体,球体)

1. 效果图

8面体

原始点云:
在这里插入图片描述在这里插入图片描述

多面体效果图

原始点云
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

俩个整8面体效果图

在这里插入图片描述

在这里插入图片描述

球形/正方体点云

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

在这里插入图片描述

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

兔子效果图

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

2. 源码

2.1 icosahedron.ply

ply
format ascii 1.0
comment VTK generated PLY File
obj_info vtkPolyData points and polygons: vtk4.0
element vertex 12
property float x
property float y
property float z
element face 20
property list uint8 uint32 vertex_indices
end_header
0.0000 -0.0000 -1.0000
0.8912 -0.0000 -0.4536
0.2754 0.8476 -0.4536
-0.7210 0.5238 -0.4536
-0.7210 -0.5238 -0.4536
0.2754 -0.8476 -0.4536
0.7210 0.5238 0.4536
-0.2754 0.8476 0.4536
-0.8912 0.0000 0.4536
-0.2754 -0.8476 0.4536
0.7210 -0.5238 0.4536
0.0000 -0.0000 1.0000
3 0 1 2
3 0 2 3
3 0 3 4
3 0 4 5
3 0 5 1
3 1 2 6
3 1 5 10
3 1 6 10
3 2 6 7
3 2 3 7
3 3 7 8
3 3 4 8
3 4 8 9
3 4 5 9
3 5 9 10
3 6 7 11
3 7 8 11
3 8 9 11
3 9 10 11
3 6 10 11

2.2 pcd_tn.py

# pcd_tn.py
# 构建球体/正方体/多面体/兔子/八面体等点云及可视化,重建

import random

import numpy as np
import open3d as o3d

# 随机种子,以便复现结果

random.seed(123)


# 八面体
def octahedron():
    """Construct an eight-sided polyhedron"""
    f = np.sqrt(2.0) / 2.0
    verts = np.float32([(0, -1, 0), (-f, 0, f), (f, 0, f), (f, 0, -f), (-f, 0, -f), (0, 1, 0)])
    triangles = np.int32([(0, 2, 1), (0, 3, 2), (0, 4, 3), (0, 1, 4), (5, 1, 2), (5, 2, 3), (5, 3, 4), (5, 4, 1)])
    val = verts[triangles].tolist()
    points = []
    for i in val:
        print(i,len(points))
        for ttt in zip(np.linspace(i[0][0], i[1][0], 15), np.linspace(i[0][1], i[1][1], 15),
                       np.linspace(i[0][2], i[1][2], 15)):
            # print(ttt)
            points.append(ttt)
        print(len(points))
        # for ttt in zip(np.linspace(i[1][0], i[1][0], 15),np.linspace(i[0][1],i[1][1],15),np.linspace(i[0][2],i[1][2],15)):
        #     # print(ttt)
        #     points.append(ttt)
        # for ttt in zip(np.linspace(i[2][0], i[2][0], 15),np.linspace(i[0][1],i[1][1],15),np.linspace(i[1][2],i[1][2],15)):
        #     # print(ttt)
        #     points.append(ttt)
        for j in i:
            points.append(j)
    return points


# 球体
def point_generator(npoints, r):
    result = []
    # 0 < theta < 2*np.pi
    # 0 < phi < np.pi
    for i in range(npoints):
        theta = random.random() * 2 * np.pi
        phi = random.random() * np.pi
        x = r * np.cos(theta) * np.sin(phi)
        y = r * np.sin(theta) * np.sin(phi)
        z = r * np.cos(phi)
        result.append([x, y, z])
    return result


# 正六面体
def point_generator_square(npoints, r):
    result = []
    for i in range(npoints // 6):
        x = random.random() * 100
        y = random.random() * 100
        z = 0
        result.append([x, y, z])
        x = random.random() * 100
        z = random.random() * 100
        y = 0
        result.append([x, y, z])
        y = random.random() * 100
        z = random.random() * 100
        x = 0
        result.append([x, y, z])
        x = random.random() * 100
        y = random.random() * 100
        z = 100
        result.append([x, y, z])
        x = random.random() * 100
        z = random.random() * 100
        y = 100
        result.append([x, y, z])
        y = random.random() * 100
        z = random.random() * 100
        x = 100
        result.append([x, y, z])
        y = random.random() * 100
        z = random.random() * 100
        x = random.random() * 100
        result.append([x, y, z])

    return result


def test_rabbit():
    bunny = o3d.data.BunnyMesh()
    print(bunny.path)
    mesh = o3d.io.read_triangle_mesh(bunny.path)
    print(mesh)
    mesh.compute_vertex_normals()

    pcd = mesh.sample_points_poisson_disk(750)
    print(pcd)
    o3d.visualization.draw_geometries([pcd], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)
    alpha = 0.03
    print(f"alpha={alpha:.3f}")
    mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha)
    print(mesh)
    mesh.compute_vertex_normals()
    o3d.visualization.draw_geometries([mesh], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=True)

    tetra_mesh, pt_map = o3d.geometry.TetraMesh.create_from_point_cloud(pcd)
    for alpha in np.logspace(np.log10(0.5), np.log10(0.01), num=4):
        print(f"alpha={alpha:.3f}")
        mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(
            pcd, alpha, tetra_mesh, pt_map)
        mesh.compute_vertex_normals()
        o3d.visualization.draw_geometries([mesh], "Open3D origin points " + str(alpha), width=800, height=600, left=50,
                                          top=50,
                                          point_show_normal=True, mesh_show_wireframe=False,
                                          mesh_show_back_face=True)

    bunny = o3d.data.BunnyMesh()
    gt_mesh = o3d.io.read_triangle_mesh(bunny.path)
    gt_mesh.compute_vertex_normals()

    pcd = gt_mesh.sample_points_poisson_disk(3000)
    o3d.visualization.draw_geometries([pcd], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)

    radii = [0.005, 0.01, 0.02, 0.04]
    rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
        pcd, o3d.utility.DoubleVector(radii))
    o3d.visualization.draw_geometries([pcd, rec_mesh], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)


def test_rabbit2(path):
    print(path)
    mesh = o3d.io.read_triangle_mesh(path)
    mesh.compute_vertex_normals()
    pcd = mesh.sample_points_poisson_disk(750)
    print(pcd)
    o3d.visualization.draw_geometries([pcd], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)
    alpha = 0.03
    print(f"alpha={alpha:.3f}")
    mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha)
    print(mesh)
    mesh.compute_vertex_normals()
    o3d.visualization.draw_geometries([mesh], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=True)

    tetra_mesh, pt_map = o3d.geometry.TetraMesh.create_from_point_cloud(pcd)
    for alpha in np.logspace(np.log10(0.5), np.log10(0.01), num=8):
        print(f"alpha={alpha:.3f}")
        mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(
            pcd, alpha, tetra_mesh, pt_map)
        mesh.compute_vertex_normals()
        o3d.visualization.draw_geometries([mesh], "Open3D origin points " + str(alpha), width=800, height=600, left=50,
                                          top=50,
                                          point_show_normal=True, mesh_show_wireframe=False,
                                          mesh_show_back_face=True)

    gt_mesh = o3d.io.read_triangle_mesh(path)
    gt_mesh.compute_vertex_normals()

    pcd = gt_mesh.sample_points_poisson_disk(3000)
    o3d.visualization.draw_geometries([pcd], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)

    radii = [0.005, 0.01, 0.02, 0.04]
    rec_mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(
        pcd, o3d.utility.DoubleVector(radii))
    o3d.visualization.draw_geometries([pcd, rec_mesh], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=False)


def test_demo(path, pcd):
    o3d.visualization.draw_geometries([pcd], "Open3D origin points", width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=True)
    print(path)
    mesh = o3d.io.read_triangle_mesh(path)
    print(mesh)
    mesh.compute_vertex_normals()

    # pcd = mesh.sample_points_poisson_disk(750)
    # print(pcd)
    # o3d.visualization.draw_geometries([pcd], width=800, height=600, left=50,
    #                                   top=50,
    #                                   point_show_normal=True, mesh_show_wireframe=False,
    #                                   mesh_show_back_face=False)
    alpha = 0.03
    print(f"alpha={alpha:.3f}")
    mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha)
    print(mesh)
    mesh.compute_vertex_normals()
    o3d.visualization.draw_geometries([mesh], width=800, height=600, left=50,
                                      top=50,
                                      point_show_normal=True, mesh_show_wireframe=False,
                                      mesh_show_back_face=True)

    tetra_mesh, pt_map = o3d.geometry.TetraMesh.create_from_point_cloud(pcd)
    for alpha in np.logspace(np.log10(0.5), np.log10(0.01), num=4):
        print(f"alpha={alpha:.3f}")
        mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(
            pcd, alpha, tetra_mesh, pt_map)
        mesh.compute_vertex_normals()
        o3d.visualization.draw_geometries([mesh, pcd], "Open3D origin points " + str(alpha), width=800, height=600,
                                          left=50,
                                          top=50,
                                          point_show_normal=True, mesh_show_wireframe=False,
                                          mesh_show_back_face=True)


def get_pcd(path, type="ball"):
    npoints = 5000
    r = np.sqrt(3)
    if type == "ball":
        points = point_generator(npoints, r)
    elif type == "square":
        points = point_generator_square(npoints, r)
    else:
        points = octahedron()
    val = np.array(points)
    # 计算点云均值点,并插入到原点云点的第一个点
    avg_point = np.mean(val, axis=0)  # axis=0,计算每一列的均值
    origin_points = np.row_stack((avg_point, val))
    # 构造点云数据
    pcd = o3d.geometry.PointCloud()
    points = o3d.utility.Vector3dVector(origin_points)
    pcd.points = points
    print(pcd)

    o3d.io.write_point_cloud(path, pcd)
    return pcd


path = "D:/study/python-scripts/p230531/input/test_ball.pcd"
ball_pcd = get_pcd(path, type="ball")
o3d.visualization.draw_geometries([ball_pcd], "Open3D origin points", width=800, height=600, left=50,
                                  top=50,
                                  point_show_normal=True, mesh_show_wireframe=False,
                                  mesh_show_back_face=True)

path = "D:/study/python-scripts/p230531/input/test_square.pcd"
test_demo(path, get_pcd(path, type="square"))
path = "D:/study/python-scripts/p230531/input/test_eight.pcd"
test_demo(path, get_pcd(path, type="eight"))

test_rabbit2("D:/study/python-scripts/p230531/input/icosahedron.ply")
test_rabbit()

参考

  • http://www.open3d.org/docs/release/tutorial/geometry/surface_reconstruction.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/549124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学生宿舍信息管理系统

系列文章 任务6 学生宿舍信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试宿舍信息录入宿舍信息浏览查询学生所住宿舍楼号、宿舍号…

WPF MaterialDesign 初学项目实战(6):设计首页(2),设置样式触发器

原项目视频 WPF项目实战合集(2022终结版) 26P 源码地址 WPF项目源码 其他内容 WPF MaterialDesign 初学项目实战&#xff08;0&#xff09;:github 项目Demo运行 WPF MaterialDesign 初学项目实战&#xff08;1&#xff09;首页搭建 WPF MaterialDesign 初学项目实战&…

npm、cnpm、yarn、pnpm区别以及pnpm 是凭什么对 npm 和 yarn 降维打击的

安装 1、安装npm需要安装nodejs&#xff0c;node中自带npm包管理器 node下载地址&#xff1a;node.js 2、cnpm安装&#xff08;需要安装npm&#xff09; cnpm是淘宝团队做的npm镜像&#xff0c;淘宝镜像每 10分钟 进行一次同步以保证尽量与官方服务同步。 npm install -g …

secure CRT 自定义主题

文章目录 如何切换 SecureCRT 主题如何新建SecureCRT 主题如何拷贝我的主题,主题名为pic如何设置 SecureCRT 关键字高亮 如何切换 SecureCRT 主题 SecureCRT 自带主题 选择 options -> Edit Default Session -> Terminal -> Emulation -> Terminal xterm optio…

【Linux】-vim的介绍,教你手把手使用vim

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点…

一台电脑同时安装多个tomcat服务器教程,window同时安装tomcat7、tomcat8、tomcat9三个服务器教程

一台电脑同时安装多个tomcat服务器 . 介绍 A. 解释为什么有时需要同时安装多个Tomcat服务器 应用程序隔离&#xff1a;当你需要在同一台设备上运行多个独立的应用程序时&#xff0c;每个应用程序可能需要使用不同的Tomcat配置和环境。通过同时安装多个Tomcat服务器&#xff0…

车载以太网 - SomeIP - 协议用例 - Messages_02

目录 13.1、验证SomeIP-SD中订阅报文Subscribe和SubscribeAck中IPv4 Endpoint Option中ServiceID一样

【JAVA进阶】Stream流

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;JAVASE基础 目录 1.Stream流的概述 2.Stream流的获取 3.Stream流的常用方法 1.Stream流的概述 什么是Stream流&#xff1f; 在Java 8中&#xff0c;得益于Lambda所带来的函数式编程&#xff0…

HNU数据结构与算法分析-作业4-图结构

1. (简答题) 【应用题】11.3 &#xff08;a&#xff09;画出所示图的相邻矩阵表示 &#xff08;b&#xff09;画出所示图的邻接表表示 &#xff08;c&#xff09;如果每一个指针需要4字节&#xff0c;每一项顶点的标号占用2字节&#xff0c;每一条边的权需要2字节&#xff0…

计算机体系结构存储系统

存储系统原理 两种典型的存储系统&#xff1a;Cache存储系统和虚拟存储系统。前者主要目的是提高存储器速度&#xff0c;后者有主存储器和硬盘构成&#xff0c;主要用于扩大存储器容量。 存储系统的访问效率 e T 1 T 1 H ( 1 − H ) T 2 T 1 f ( H , T 2 T 1 ) e\frac{T_…

魔改车钥匙实现远程控车:(4)基于compose和经典蓝牙编写一个控制APP

前言 这篇文章不出意外的话应该是魔改车钥匙系列的最后一篇了&#xff0c;自此我们的魔改计划除了最后的布线和安装外已经全部完成了。 不过由于布线以及安装不属于编程技术范围&#xff0c;且我也是第一次做&#xff0c;就不献丑继续写一篇文章了。 在前面的文章中&#xf…

基于torch实现模型剪枝

一、剪枝分类 所谓模型剪枝&#xff0c;其实是一种从神经网络中移除"不必要"权重或偏差&#xff08;weigths/bias&#xff09;的模型压缩技术。关于什么参数才是“不必要的”&#xff0c;这是一个目前依然在研究的领域。 1.1、非结构化剪枝 非结构化剪枝&#xff08;…

什么是可持续能源?

随着全球经济的不断发展和人口的不断增长&#xff0c;能源问题越来越受到关注。传统能源已经不能满足人们对能源的需求&#xff0c;同时也对环境和健康带来了严重的影响。为了解决这些问题&#xff0c;出现了可持续能源的概念。那么&#xff0c;什么是可持续能源呢&#xff1f;…

逐渐从土里长出来的小花

从土里逐渐长出来的小花&#xff08;这是长出来后的样子&#xff0c;图片压缩了出现了重影~&#xff09; 代码在这里&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title&g…

MySQL-索引(2)

本文主要讲解MySQL-索引相关的知识点 联合索引前缀索引覆盖索引索引下推索引的优缺点什么时候适合创建索引,什么时候不适合?如何优化索引 ? 索引失效场景 ? 为什么SQL语句使用了索引,却还是慢查询 ? 使用索引有哪些注意事项 ? InnoDB引擎中的索引策略 目录 联合索引 联合…

LeetCode高频算法刷题记录6

文章目录 1. 编辑距离【困难】1.1 题目描述1.2 解题思路1.3 代码实现 2. 寻找两个正序数组的中位数【困难】2.1 题目描述2.2 解题思路2.3 代码实现 3. 合并区间【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 爬楼梯【简单】4.1 题目描述4.2 解题思路4.3 代码实现 5. 排序链…

chatgpt赋能Python-python3_9安装numpy

Python 3.9 安装 NumPy 的完整指南 Python是一种功能强大的编程语言&#xff0c;已成为数据分析、人工智能和科学计算领域的主流语言之一。NumPy是一个Python库&#xff0c;用于执行高效的数值计算和科学计算操作。Python 3.9是Python最新版本&#xff0c;带来了许多新功能和改…

一款非常有趣的中国版本的Excalidraw作图工具drawon(桌案)

桌案工具集成了很多有趣的在线作图工具&#xff0c; 思维导图&#xff0c; 流程图&#xff0c;以及草图&#xff0c;在线ppt等功能。 而草图是基于国外有名的Excalidraw而改造而来&#xff0c;使得它更符合国人的使用习惯。 最近在 使用excalidraw时&#xff0c;发现了很多新功…

Excel | 基因名都被Excel篡改了怎么办呢!?~(附3种解决方案)

1写在前面 今天和大家分享一下在做表达矩阵处理时尝尝会遇到的一个问题&#xff0c;但又经常被忽视&#xff0c;就是Excel会修改你的基因名。&#x1f637; 无数大佬在这里都踩过坑&#xff0c;这些普遍的问题已经被写成了paper&#xff08;左右滑动&#xff09;&#xff1a;&a…

75.建立一个主体样式第一部分

我们的目标如下图所示 ● 首先建立文件夹&#xff0c;生成框架代码 ● 把页面上面的HTML元素写进去 <header><nav><div>LOGO</div><div>NAVIGATION</div></nav><div><h1>A healty meal delivered to your door, ever…