一、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])