open3D Mesh转换为点云

本文介绍了使用Open3D库在Python中创建和操作几何体,如长方体和地板,然后将其转换为点云的过程,展示了均匀采样和Poisson采样的两种方法。

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

创建一个平面和长方形体,采样转换为点云 

对mesh进行采样,变换为点云

import time
import open3d as o3d;
import numpy as np;

mesh_box = o3d.geometry.TriangleMesh.create_box(width=0.4,
                                                height=0.6,
                                                depth=0.11)
mesh_box.compute_vertex_normals()
mesh_box.paint_uniform_color([0.9, 0.1, 0.1])

mesh_tx = mesh_box.translate((0.16, 0.15, 0))
#o3d.visualization.draw_geometries([mesh_box]) 

mesh_box_Floor = o3d.geometry.TriangleMesh.create_box(width=0.9,
                                                height=0.9,
                                                depth=0.005)
mesh_box_Floor.compute_vertex_normals()
mesh_box_Floor.paint_uniform_color([0.3, 233.3, 0.2])
pcdmesh=mesh_tx +mesh_box_Floor 

#均匀采样5000个点
pcd = pcdmesh.sample_points_uniformly(number_of_points=5000)
o3d.visualization.draw_geometries([ pcd],window_name="pcd") 

#泊松采样5000个点,边缘点分布更加均匀,但是耗时更长
pcd = pcdmesh.sample_points_poisson_disk(number_of_points=5000, init_factor=10)
o3d.visualization.draw_geometries([ pcd],window_name="pcd") 

 

### 将深度图转换点云并进行3D重建 #### 深度图像到点云转换过程 在计算机视觉领域,将深度图像转换点云是一个常见的操作。对于每一个像素 (u, v),其对应的深度值 d 可以通过相机内参矩阵 K 转换成三维空间中的坐标 (X,Y,Z)[^1]。 假设已知相机内参数矩阵 \(K\) 和深度图像 \(depth\_image\) ,则可以利用如下公式计算每个像素对应的空间位置: \[ \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=K\cdot \begin{bmatrix} X/Z\\ Y/Z\\ 1 \end{bmatrix}\] 从而解得: \[ Z=d(u,v)\] \[ X=Z*(u-c_x)/f_x\] \[ Y=Z*(v-c_y)/f_y\] 其中 \(c_x,c_y,f_x,f_y\) 是相机内部参数的一部分,在实际应用中通常由校准工具提供[^1]。 ```python import numpy as np import open3d as o3d def depth_to_point_cloud(depth_image, intrinsics): """ Convert a depth image to point cloud. Parameters: depth_image : array_like Depth values of the scene. intrinsics : tuple or list Camera intrinsic parameters [fx, fy, cx, cy]. Returns: pcd : PointCloud object from Open3D library """ fx, fy, cx, cy = intrinsics height, width = depth_image.shape[:2] row_indices = np.arange(height).reshape(-1, 1) col_indices = np.arange(width) z_values = depth_image.flatten() valid_mask = ~np.isnan(z_values) & (z_values != 0.) x_coords = ((col_indices.reshape(1,-1)-cx)*z_values/fx)[valid_mask].flatten() y_coords = ((row_indices.T-cy)*z_values/fy)[valid_mask].flatten() points_3d = np.stack([x_coords,y_coords,z_values[valid_mask]],axis=-1) colors = plt.get_cmap('viridis')(points_3d[:,2]/max(points_3d[:,2]))[:,:3] pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(points_3d) pcd.colors = o3d.utility.Vector3dVector(colors) return pcd ``` 完成上述步骤之后就可以获取到基于原始深度信息构建出来的点云模型了。接下来如果希望进一步做表面重建,则可以选择不同的算法来实现这一目标,比如 α-shapes 或者 Poisson surface reconstruction 方法等。 #### 表面重建技术简介 当获得了初步形成的点云后,为了形成更加完整的物体表示形式——即所谓的 watertight mesh ——就需要采用特定的技术来进行表面重建工作。两种常用的方法分别是 Alpha Shapes 和 Poisson Surface Reconstruction 。前者依赖于 Delaunay triangulation 的概念;后者则是通过对隐函数求解的方式来逼近真实曲面形态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值