open3d 隐藏点去除算法

一、算法原理

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博客

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Open3D 是一个用于处理三维数据的开源库,其中包含了一些对云数据进行操作和可视化的功能。其中,隐藏消除是指通过一定的算法和方法,去除云数据中的一些无关或冗余的,从而使得云更加清晰和易于处理。 Open3D 提供了一种常用的隐藏消除方法,即基于法向量的滤波算法。该算法首先根据云的几何信息计算每个的法线,然后根据法线信息进行滤波操作。该操作会去除那些法线方向与周围法线方向差异较大的,从而去除了一些不平滑的表面或异常。 在 Open3D 中,我们可以通过调用 `open3d.geometry.estimate_normals()` 方法来计算云的法线,然后调用 `open3d.geometry.filter_smooth()` 方法进行滤波操作。具体的操作流程如下: 1. 导入云数据,可以使用 `open3d.io.read_point_cloud()` 方法加载云文件,得到一个 PointCloud 对象。 2. 使用 `open3d.geometry.estimate_normals()` 方法计算云的法线信息,并设置相应的参数,如搜索半径、法线的方向等。 3. 利用 `open3d.geometry.filter_smooth()` 方法对云进行滤波操作,同样可以设定滤波参数,如法线角度阈值、滤波半径等。 4. 最后,可以通过 `open3d.visualization.draw_geometries()` 方法可视化滤波后的云结果。 通过上述步骤,我们可以在 Open3D 中进行隐藏消除操作,从而提高云的质量和可用性。隐藏消除主要依靠法线信息来判断和去除不必要的,因此在进行隐藏消除时,我们需要合理地设置法线计算和滤波参数,以得到理想的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云杂项

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值