三种点云下采样方法(一) — open3d python

        点云下采样是对点云以一定的采样规则重新进行采样,目的是在保证点云整体几何特征不变的情况下,降低点云的密度,进而可以降低相关处理的数据量和算法复杂度。下面介绍三种点云下采样方式。最远点采样等方法后续会在深度学习章节中进行详细介绍。

1 体素下采样

        体素是将三维空间划分成一个个小的立体网格,相关介绍请参考:点云体素介绍_Coding的叶子的博客-CSDN博客。体素下采样就是把落在每个体素中的点用一个点来表示。这个点的坐标取值就是体素中所有点坐标的平均值。这个点也就是体素中各个点的质心。

open3d中体素下采样的函数为voxel_down_sample,其参数为体素的尺寸大小。体素尺寸越大,则下采样的倍数越大,点云也就会变得更加稀疏。

voxel_down_sample(voxel_size=0.1)

        除了voxel_down_sample之外,voxel_down_sample_and_trace也是采用相同的体素下采样方法。但函数的输入输出有一定差别。voxel_down_sample_and_trace输入除了voxel_size体素尺寸外,还有min_bound、max_bound和approximate_class。

voxel_down_sample_and_trace(self, voxel_size, min_bound, max_bound, approximate_class=False)
输入:
voxel_size ( float ) -- 要下采样的体素大小。
min_bound ( numpy.ndarray [ numpy.float64 [ 3 , 1 ] ] ) – 体素边界的最小坐标
max_bound ( numpy.ndarray [ numpy.float64 [ 3 , 1 ] ] ) - 体素边界的最大坐标
approximate_class(布尔,可选,默认=假)–

输出:
1、稀疏后点云坐标
2、稀疏后点云中各个点在原点云中的索引

        由于点云不是充满整个点云空间,只是占用一部门的点云空间,因而可以用min_bound和max_bound来限制需要下采样的点云范围。min_bound和max_bound分别对应点云范围的下边界和上边界。也就是可以用min_bound和max_bound指定点云需要下采样的部分,从而实现对局部进行下采样。get_min_bound()和get_max_bound()函数可以直接获取整个点云的上下边界。【这个解释似乎并不正确,没有验证成功,等待后续纠正】

        open3d中的pcd格式数据可以为点云中每个点分配特定的颜色,例如可以为点云属于不同的部分赋予不同的颜色。approximate_class就是用来控制采样后的点云颜色。当approximate_class=True时,体素采样后的点的颜色由体素中大多数点的颜色决定。当approximate_class=False时,体素采样后的点的颜色由体素中所有点的平均颜色决定。

        输出包含如下两部分:
        (1)稀疏后点云坐标
        (2)稀疏后点云中各个点在原点云中的索引

 2 python open3d 体素下采样 

        pcd文件请参考:pcd格式点云样例文件-深度学习文档类资源-CSDN下载。

# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""

import open3d as o3d
from copy import deepcopy


if __name__ == '__main__':
    file_path = 'rabbit.pcd'
    pcd = o3d.io.read_point_cloud(file_path)
    pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
    print(pcd)

    pcd1 = deepcopy(pcd)
    pcd1.paint_uniform_color([0, 0, 1])#指定显示为蓝色
    pcd1.translate((20, 0, 0)) #整体进行x轴方向平移
    pcd1 = pcd1.voxel_down_sample(voxel_size=1)
    print(pcd1)

    pcd2 = deepcopy(pcd)
    pcd2.paint_uniform_color([0, 1, 0])#指定显示为绿色
    pcd2.translate((0, 20, 0)) #整体进行y轴方向平移
    res = pcd2.voxel_down_sample_and_trace(1, min_bound=pcd2.get_min_bound()-0.5, max_bound=pcd2.get_max_bound()+0.5, approximate_class=True)
    pcd2 = res[0]
    print(pcd2)

    
    # 点云显示
    o3d.visualization.draw_geometries([pcd, pcd1, pcd2], #点云列表
                                      window_name="体素下采样",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600)  # 窗口高度

                         

3 体素下采样效果

        灰色图片为原始点云,蓝色为voxel_down_sample体素下采样结果,绿色为voxel_down_sample_and_trace下采样结果。

三种点云下采样方法(一) — open3d python_第1张图片

python三维点云从基础到深度学习_Coding的叶子的博客-CSDN博客_3d点云 python从三维基础知识到深度学习,将按照以下目录持续进行更新。https://blog.csdn.net/suiyingy/article/details/124017716

 更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。

你可能感兴趣的:(三维点云,python,体素下采样,点云下采样,open3d,python)