一、算法原理
Open3D中的隐藏点去除算法(Hidden Point Removal)的作用是从给定视点渲染点云时,去除背景中未被其他点遮挡的点,从而提高点云的可视化效果。Open3D库中实现了[Katz2007]提出的一种基于点云可见性近似计算的隐藏点去除方法。该方法不需要进行曲面重构或法向量估计,直接利用点云数据计算点的可见性。
1.算法介绍
凸包构造:open3d 凸包-CSDN博客
二、代码
_, pt_map = pcd.hidden_point_removal(camera, radius)
import numpy as np
import open3d as o3d
if __name__ == '__main__':
pcd = o3d.io.read_point_cloud('res/monkey.ply')
# 计算体对角线
diameter = np.linalg.norm( # 点云数据中包围盒的对角线长度
np.asarray(pcd.get_max_bound()) # 返回包围框最大值坐标
- np.asarray(pcd.get_min_bound())) # 返回包围框最小值坐标
# o3d.visualization.draw_geometries([pcd])
# 设置参数
camera = [0, 0, diameter] # 设置点云视角
radius = diameter * 0.1 # 半径参数
# 查看点云视角位置(可删除)
camera_cloud = o3d.geometry.PointCloud() # 使用numpy生成点云
camera_cloud.points = o3d.utility.Vector3dVector([camera]) # points numpy数组
camera_cloud.paint_uniform_color([1, 0, 0]) # 渲染颜色
# 记录点云中每个点的保留状态
_, pt_map = pcd.hidden_point_removal(camera, # 确定哪些点被相机视野所覆盖,即哪些点应该被保留
radius) # 相机视野内的范围
# 获得移除隐藏点后结果
pcd = pcd.select_by_index(pt_map)
o3d.visualization.draw_geometries([pcd, camera_cloud])
三、结果展示
3.1 原数据
3.2 隐藏点后
四、相关数据
算法来源(论文 Direct Visibility of Point Sets):katz_tal_basri_-_direct_visibility_of_point_sets.pdf (weizmann.ac.il)
隐藏点云方法解释:hidden point removal - 知乎 (zhihu.com)
凸包构造:open3d 凸包-CSDN博客