Open3d 使用marching cubes生成3D模型

4 篇文章 0 订阅
2 篇文章 0 订阅
该文章介绍了一个使用Python3.9.12和Open3D库将点云数据转换为体素网格,并通过MarchingCubes算法进行表面重建的过程。首先,它读取PCD文件,然后创建体素网格,接着利用MarchingCubes方法从体素网格中提取出表面的顶点和面片,最后将重建的模型保存为PLY格式并进行可视化。
摘要由CSDN通过智能技术生成

使用python 3.9.12

如果没有open3d

pip install open3d

 需要的头文件:

import numpy as np
import torch
import open3d as o3d
from skimage import measure

 通过open3d  导入数据

points=o3d.io.read_point_cloud(file)

 创建体素网格,大小以最大最小X,Y,Z创建一个立方体,然后进行创建三维数组体素化,存储数据为,点云表面为1,其他元素为0.

def pcd_to_voxel_grid(pcd, voxel_size=1.0):
    points = np.asarray(pcd.points)
    min_bound = np.min(points, axis=0)
    max_bound = np.max(points, axis=0)
    dims = np.ceil((max_bound - min_bound) / voxel_size).astype(np.int)
    voxel_grid = np.zeros(dims, dtype=np.uint8)
    for point in points:
        indices = np.floor((point - min_bound) / voxel_size).astype(np.int)
        voxel_grid[tuple(indices)] = 1
    return voxel_grid,voxel_size,min_bound #返回体素网格,体素间隔大小,以及最小的体素编号

 重建曲面:

vertices, faces, _, _ = measure.marching_cubes(voxel_grid, level,spacing=voxel)

 返回值为点以及三角面片,下面重建模型并保存:

mesh = o3d.geometry.TriangleMesh()
mesh.vertices = o3d.utility.Vector3dVector(vertices+point)
mesh.triangles = o3d.utility.Vector3iVector(faces)
o3d.io.write_triangle_mesh("rabbit.ply", mesh)

主体代码:

input_pcd_filename ="rabbit.pcd"

# Load PCD file
pcd = o3d.io.read_point_cloud(input_pcd_filename)

# Convert point cloud to voxel grid
voxel_grid,voxel_size,point = pcd_to_voxel_grid(pcd, voxel_size=0.1)

# Perform surface reconstruction using marching cubes
vertices, faces = marching_cubes(voxel_grid, level=0.5,space=(voxel_size,voxel_size,voxel_size))

# Create mesh from the reconstructed surface
mesh = o3d.geometry.TriangleMesh()
mesh.vertices = o3d.utility.Vector3dVector(vertices+point)
mesh.triangles = o3d.utility.Vector3iVector(faces)
o3d.io.write_triangle_mesh("abbit.ply", mesh)
# Visualize the result
o3d.visualization.draw_geometries([mesh])
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Marching Cubes算法是一种常用的三维体数据表面重建算法。它可以将一个体数据集转化为连续的多边形网格模型。 在三维体数据中,每个体素的值表示其在某一属性上的特征,如密度、压力等。Marching Cubes算法首先将整个体数据集划分为无数个小立方体,每个小立方体包含8个顶点。然后根据每个小立方体顶点所代表的属性值与事先设定的阈值进行比较,确定该顶点是否在表面上。若在表面上,就将相应顶点连接起来组成一个面,并将该面连接到整个网格模型上。 得到的多边形网格模型可以用于可视化、仿真和分析等应用。Marching Cubes算法具有简单、高效的特点,适用于各种不规则的三维体数据集。它广泛应用于医学图像处理、地质勘探、计算机动画等领域。 然而,Marching Cubes算法也存在一些限制。首先,它在重建过程中产生的多边形可能存在不连续性和拓扑错误。为了解决这个问题,后续研究提出了一些改进算法,如Dual Marching Cubes和Extended Marching Cubes。其次,Marching Cubes算法对数据集的分辨率要求较高,对于过于细致的结构可能无法很好地重建。 总的来说,Marching Cubes算法在三维体数据表面重建领域具有重要的应用价值,其简单、高效的特点使其成为一种常用的算法。随着相关技术的不断发展,对Marching Cubes算法的改进和优化将进一步推动其在各个领域的应用。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值