Open3d体素化

文章介绍了Open3D库在处理3D数据时如何使用体素进行数据结构化。体素化能有序存储点云和三角网数据,但也可能导致信息丢失和内存占用增加。Open3D提供了创建VoxelGrid的方法,可以从点云和三角网构建体素,并用Octree进行进一步处理。此外,文章还提到了点云的下采样和体素内的点查询功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Open3D 体素介绍

定义:体素(voxel)是体积(volume)、像素(pixel)的组合词,相当于3D空间中的像素。
体素化优点:
1、点云数据将在内存中有序存储
2、数据有序存储和降采样,能够处理大规模的数据
体素化缺点:
1、丢失信息,与分辨率有关
2、占用内存,与分辨率有关

为了能够完全表示三维模型,通常采用模型的AABB包围盒来构建体素空间,并根据分辨率𝑁将整个AABB包围盒按照长宽高划分为𝑁 × 𝑁 × 𝑁个体素cell,通过设置flag记录每个体素cell与三维模型的关系(在模型内部,在模型外部,在模型上)。对于表面体素空间,每个体素cell的flag则只需分辨与模型是相交还是分离即可,不必再区分在模型内部或是外部。

二、Open3D 体素函数解析

Open3d中从点云构建体素

voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd,voxel_size=0.05)

Open3d中从三角网构建体素

voxel_grid = o3d.geometry.VoxelGrid.create_from_triangle_mesh(mesh,voxel_size=0.05)

从体素中构建八叉树

octree = o3d.geometry.Octree(max_depth=4)
octree.create_from_voxel_grid(voxel_grid)

体素下采样
voxel_size为体素的尺寸大小,体素的尺寸越大,下采样的倍数越大,点云也就越稀疏。voxel_size越小,会生成更细的网格和更多的点。空间八叉树的叶子结点里,选择一个点代表叶子里的所有点。

pcd_down = pcd.voxel_down_sample(voxel_size=0.05)

判断点是否在占用的体素内

queries = np.asarray(pcd.points)
output = voxel_grid.check_if_included(o3d.utility.Vector3dVector(queries))

Open3d提供了carve_depth_map和 carve_silhouette方法用于体素雕刻。

三、代码实现


import open3d as o3d
import numpy as np

if __name__ == "__main__":

    N = 2000
    armadillo_data = o3d.data.ArmadilloMesh()
    mesh = o3d.io.read_triangle_mesh(armadillo_data.path)

    # Fit to unit cube.
    mesh.scale(1 / np.max(mesh.get_max_bound() - mesh.get_min_bound()),
              center=mesh.get_center())
    pcd = mesh.sample_points_poisson_disk(N)
    # pcd.scale(1 / np.max(pcd.get_max_bound() - pcd.get_min_bound()),
    #           center=pcd.get_center())
    pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1,
                                                              size=(N, 3)))
    print('Displaying input point cloud ...')
    o3d.visualization.draw([pcd])

    print('Displaying voxel grid ...')
    # voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd,
    #                                                             voxel_size=0.05)
    voxel_grid = o3d.geometry.VoxelGrid.create_from_triangle_mesh(
        mesh, voxel_size=0.05)

    o3d.visualization.draw([voxel_grid])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值