zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

Python方法 三种 采样 Open3D
2023-09-27 14:27:52 时间

本文为博主原创文章,未经博主允许不得转载。
本文为专栏《python三维点云从基础到深度学习》系列文章,地址为“https://blog.csdn.net/suiyingy/article/details/124017716”。

         点云下采样是对点云以一定的采样规则重新进行采样,目的是在保证点云整体几何特征不变的情况下,降低点云的密度,进而可以降低相关处理的数据量和算法复杂度。上一节介绍了体素下采样的方法https://blog.csdn.net/suiyingy/article/details/124458903。本节将介绍均匀下采样和随机下采样。最远点采样等方法后续会在深度学习章节中进行详细介绍。

1 均匀下采样

        均匀采样是指每隔固定的点数采样一次。样本按点的顺序执行,始终选择从第 1 个点开始,而不是随机选择。显然点存储的顺序不同,得到的结果也会不一样。从这个角度来看,这种方法比较适合有序点云的降采样。这种方法适合均匀采集到的点云,如果点云本身不均匀,那么以固定点数采样很有可能造成某一部分的点云没被采样到。相比于体素的采样方法,点云均匀采样后的点数是固定可控的,而体素采样后的点云数量是不可控的。

        open3d中的均匀采样函数为uniform_down_sample。

pcd.uniform_down_sample(100)#每隔100个点采样一次

2 随机下采样

        顾名思义,随机下采样就似乎在原始点云中随机采样一定点数的点。这种方法最终得到的点云数量也是固定的。

        open3d中的随机采样函数为random_down_sample,其参数是采样后点云数量相对于原始点云数量的比例。

pcd = pcd.random_down_sample(0.1)#采样1/10的点

        除open3d的方法外,也可以自己自定义随机采样的方式,这样会更加灵活。

points = np.array(pcd.points)
n = np.random.choice(len(points), 500, replace=False) #s随机采500个数据,这种随机方式也可以自己定义
pcd.points = o3d.utility.Vector3dVector(points[n])

       

3 python open3d 体素下采样 

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

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

import open3d as o3d
from copy import deepcopy
import numpy as np


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.uniform_down_sample(100)#每100个点采样一次
    print(pcd1)

    pcd2 = deepcopy(pcd)
    pcd2.paint_uniform_color([0, 1, 0])#指定显示为绿色
    pcd2.translate((0, 20, 0)) #整体进行y轴方向平移
    pcd2 = pcd2.random_down_sample(0.1)#采1/10的点云
    print(pcd2)

    #自定义随机采样
    pcd3 = deepcopy(pcd)
    pcd3.translate((-20, 0, 0)) #整体进行x轴方向平移
    points = np.array(pcd3.points)
    n = np.random.choice(len(points), 500, replace=False) #s随机采500个数据,这种随机方式也可以自己定义
    pcd3.points = o3d.utility.Vector3dVector(points[n])
    pcd3.paint_uniform_color([1, 0, 0])#指定显示为红色
    print(pcd3)
    
    # # 点云显示
    o3d.visualization.draw_geometries([pcd, pcd1, pcd2, pcd3], #点云列表
                                      window_name="均匀随机采样",
                                      point_show_normal=False,
                                      width=800,  # 窗口宽度
                                      height=600)  # 窗口高度

                                      

4 点云下采样效果

        灰色图片为原始点云,蓝色为open3d均匀下采样结果,绿色为open3d随机下采样结果,红色为自定义随机下采样结果。

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

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

本文为博主原创文章,未经博主允许不得转载。
本文为专栏《python三维点云从基础到深度学习》系列文章,地址为“https://blog.csdn.net/suiyingy/article/details/124017716”。