• (2)点云库处理学习——剔除点云值


    1、主要参考

    1.1参考地址

    (1)

    点云离群点剔除 — open3d python_Coding的叶子的博客-CSDN博客_离群点去除

    (2)

    open3d之点云异常值去除(笔记5)_Satellite_H的博客-CSDN博客

    (3)斯坦福经典兔子的点云数据下载地址

    下载地址

    Model : Bunny

    1.2兔子的实验

    (1)代码

    1. import open3d as o3d
    2. import numpy as np
    3. # from copy import deepcopy
    4. # from matplotlib import pyplot as plt
    5. path = "D:/RGBD_CAMERA/python_3d_process/bunny.ply"
    6. pcd = o3d.io.read_point_cloud(path) # path为文件路径
    7. # o3d.io.write_point_cloud("chenbunny.pcd",pcd) #可以保存数据,或者修改为其它格式的如pcd
    8. o3d.visualization.draw_geometries([pcd])

    (2)通过键盘的+和-可以控制点云大小,鼠标可以滚动视角

    2、剔除的方法 

    2.1无效值剔除

    详见我的上一篇blob

    (1)点云库PCL学习——点云的格式、PCD文件的打开和显示_chencaw的博客-CSDN博客

     无效值包括空值和无限值。空值一般用NaN表示。open3d中对应的剔除函数为remove_non_finite_points。当remove_nan为True时,剔除空值。当remove_infinite为True时表示去除无限值。 

    2.2统计方式剔除

    (1)函数的具体定义

    remove_statistical_outlier(nb_neighbors,std_ratio,print_progress = False)

    该函数用于删除距离其邻居较远的点

    (2)参数定义

    1.  nb_neighbors : 目标点周围的点数。它指定考虑多少邻居来计算给定点的平均距离。
    2. std_ratio : std_ratio标准差比率。它允许根据跨点云的平均距离的标准偏差设置阈值级别。这个数字越低,过滤器就越激进。
    3. print_progress : 为True时,可以显示处理进度 打印进度条

     (3)测试代码

    1. import open3d as o3d
    2. import numpy as np
    3. from copy import deepcopy
    4. ##--(1)去除无效值------------------
    5. path = "D:/RGBD_CAMERA/python_3d_process/1_hezi.pcd"
    6. pcd = o3d.io.read_point_cloud(path) # path为文件路径
    7. # pcd.paint_uniform_color([0, 0, 1])#指定显示为蓝色
    8. pcd = pcd.remove_non_finite_points(remove_nan = True, remove_infinite = False) #剔除无效值nan
    9. ##--(2)统计方法剔除-----------------
    10. ##--拷贝一波,对比一起显示--chen 20221129
    11. pcd2 = deepcopy(pcd)
    12. # pcd2.paint_uniform_color([1, 0, 0])#指定显示为蓝色
    13. pcd2.translate((0, 800, 0)) #整体进行y轴方向平移
    14. res2 = pcd2.remove_statistical_outlier(20, 0.5, print_progress = False)#统计方法剔除
    15. # res2 = pcd2.remove_statistical_outlier(20, 0.1, print_progress = False)#统计方法剔除
    16. # res2 = pcd2.remove_statistical_outlier(20, 0.01, print_progress = False)#统计方法剔除
    17. # res2 = pcd2.remove_statistical_outlier(50, 0.1, print_progress = False)#统计方法剔除
    18. pcd2 = res2[0] #返回点云,和点云索引
    19. ##--(3)显示一下-----------------
    20. o3d.visualization.draw_geometries([pcd,pcd2], #点云列表
    21. window_name="离群点剔除对比显示",
    22. point_show_normal=False) # 窗口高度
    23. # o3d.visualization.draw_geometries([pcd,pcd2], #点云列表
    24. # window_name="离群点剔除对比显示",
    25. # point_show_normal=False,
    26. # width=800, # 窗口宽度
    27. # height=600) # 窗口高度

    (4)测试结果,

    1)左图的参数(20, 0.5)

     2)左图的参数(20, 0.1)

     3)左图的参数(20, 0.01)

     4)左图参数(50, 0.1)

    2.3 半径滤波方式剔除

    (1)函数

    remove_radius_outlier(nb_points, radius,print_progress = False)

    函数功能:删除给定半径的给定球体中小于 nb_points 的点的函数

    (2)参数说明

    nb_points (int)半径内的点数。它允许您选择球体应包含的最少点数

    radius (float)球体半径。它定义了将用于计算邻居的球体的半径

    print_progress (bool, optional, default=False)设置为 True 以打印进度条

    (3)测试代码

    (4)测试结果

    1)左图的统计滤波参数(20, 0.5),中间为原图,右侧半径滤波参数(20,2)

     2)左图的统计滤波参数(20, 0.5),中间为原图,右侧半径滤波参数(10,2)

     3)左图的统计滤波参数(20, 0.5),中间为原图,右侧半径滤波参数(10,5)

  • 相关阅读:
    集群级Kafka数据消费的挑战与实践
    设计循环队列
    Android7.1 ROOT权限的获取
    使用JavaRestClient查询文档&排序、分页、高亮
    基于C语言BP神经网络的实现
    如何看待现在的网络安全行业?
    Python学习小组课程P1-Python基础(1)语法与数组
    【Node.js】自定义模块
    安装软件显示“为了对电脑进行保护,已阻止此应用”——已解决
    Docker中实现MySQL主从复制
  • 原文地址:https://blog.csdn.net/chencaw/article/details/128096339