1.open3d处理点云数据的常见方法

1. 点云的读取、可视化、保存

在这里是读取的点云的pcd文件,代码如下:

import open3d as o3d


if __name__ == '__main__':

    #1.点云读取
    point= o3d.io.read_point_cloud("E:\daima\huawei\img\change2.pcd")
    print("====>",point)
    
    #2.点云可视化
    o3d.visualization.draw_geometries([point])

    # 4.保存点云
    o3d.io.write_point_cloud("1.pcd", point, write_ascii=True)

2. 常见的点云处理方法

2.1 显示点云法向量

代码如下:

  #3.显示法向量
  
  radius=0.01 # 搜索半径
  max_nn=30 # 邻域内用于估算法线的最大点数
 
  pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius,max_nn))
  o3d.visualization.draw_geometries([pcd],window_name="o3d",width=1920,height=1080,
                                  #left=50,top=50,point_show_normal=True)

2.2 素体质心下采样

       原理:体素下采样(Voxel downsampling)采用规则体素格网从输入点云中创建分布均匀的下采样点云,是许多点云处理任务的预处理步骤。该算法主要分为两步:创建指定大小(分辨率)的体素网络;当点云中至少有一个点落在某个体素内,则认为该体素被占用,体素的颜色(属性)是该体素内所有点的平均值。

计算如下:

代码如下:

downpcd = point.voxel_down_sample(voxel_size=0.05)#voxel_size表示体素网格的距离,对该距离范围内的所有点求平均值,即为密度为1的质心
o3d.visualization.draw_geometries([downpcd])

2.3 点云的正态分布

原理:离散的数据匹配,包括图像,点云等数据,很难基于匹配的连续的评估函数,使之难以匹配到一个可微的优化框架中求解。为了解决该问题,我们希望能够为离散的数据形式建立一个相对连续的表示形式,并得到连续可导的评价函数。基于此,NDT被提出。其具体步骤为:

1). 将离散数据划分在不同的区域中;

2). 在每一个区域,求中点:

3). 计算子区域中基于每一个点到中点差值的协方差矩阵:

4). 得到针对于离散数据的NDT表示形式N,具体表示为:

可以看到,NDT的形式是一个基于概率分布的表示形式。下图给出一个直观的示例,来实现对NDT的可视化。

之前我们提到,之所以建立这样一种形式,是为了得到一个针对匹配评估的一个连续的函数形式,以方便建立优化。基于NDT的表示形式,这个评估函数就能够被构建:

Score代表我们希望得到的评估函数,p是自变量,也是匹配希望获得的变换矩阵。与ICP一致,p由旋转与平移组成:

整个NDT算法的步骤可以精简为6步:

1). 对一个点云P1或图像建立其NDT表示形式;

2). 初始化参数p(赋0或某一个间隔数据);

3). 将另外一个准备匹配的点云P2或图像的点按照p变换;

4). 计算Score (xi为P2的一个点,xi‘为xi经过p变换后的位置),如果满足退出条件,则退出;

5). 使用牛顿法建立对p的更新;

6). Loop step 3。

在交互页面,可以通过N查看点法线,+,-控制法线长度。

作为点云的基本操作之一,点云正态估计通过指定算法参数估测每个点可能的法向量,estimate_normals查找指定搜索半径内的临近点,通过这些临近点的协方差计算其主轴,从而估计法向量。正常情况下会产生两个方向相反的法向量,在不知道几何体的全局结构下,两者都可以是正确的。Open3D会尝试调整法线的方向,使其与原始法线对齐。

代码如下:

downpcd.estimate_normals(
        search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
    o3d.visualization.draw_geometries([downpcd],
                                      zoom=0.3412,
                                      front=[0.4257, -0.2125, -0.8795],
                                      lookat=[2.6172, 2.0475, 1.532],
                                      up=[-0.0694, -0.9768, 0.2024],
                                      point_show_normal=True)

2.4 引导滤波

原理:引导滤波 Guilter Filter:主要作用是消除或减少噪声,同时保留对目标有用的关键信息。引导滤波器通常会利用一部分已经分类或者标记的点云数据(通常被称为“引导点”或“引导数据”)来指导滤波过程,通过优化这些引导点的分布来达到滤波的效果。这种方法可以有效地减少滤波过程中的噪声,同时保留对目标有用的关键信息。
具体来说,引导滤波器可以用于以下情况:

1.减少噪声:引导滤波器通过利用一部分已知的、可靠的点云数据来指导滤波过程,可以有效地减少噪声的影响,提高点云的精度和准确性。
2.简化数据结构:引导滤波器可以自动地选择并删除不重要的点,从而简化点云数据结构,降低数据处理和分析的难度。
3.提高特征提取的准确性:引导滤波器可以通过去除无关或冗余的点,提高后续特征提取的准确性,从而更好地进行3D物体识别、检测和建模等任务。

代码如下:

import open3d as o3d
import numpy as np


if __name__ == '__main__':
    # 1.首先读取原始点云和求异点云
    point= o3d.io.read_point_cloud("E:\daima\huawei\img\change2.pcd",remove_nan_points=True,remove_infinite_points=True)
    point2 = o3d.io.read_point_cloud("1.pcd", remove_nan_points=True,
                                    remove_infinite_points=True)

    dist = point2.compute_point_cloud_distance(point)
    idx = [i for i, distance in enumerate(dist) if distance > 0.5]

    # 最后将点云中相同的部分和不同的部分分别取出来进行显示
    same_part = point2.select_by_index(idx)
    diff_part = point2.select_by_index(idx, invert=True)
    same_part.paint_uniform_color([0, 0, 1])
    diff_part.paint_uniform_color([1, 0, 0])
    o3d.visualization.draw_geometries([same_part, diff_part])
    

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Open3D是一个开源的3D计算库,它支持多种点云格式。点云是由一系列的三维坐标点组成的数据集,常用于表示三维场景或物体的几何形状。 Open3D可以读取和写入常见点云格式,如PLY、PCD和XYZ等。使用Open3D库中的函数,我们可以方便地将这些点云格式导入到程序中进行处理,或将处理后的点云保存为指定的格式。 以PLY格式为例,PLY是Polygon File Format的缩写,是一种常用的三维模型数据格式。Open3D提供了`read_point_cloud`函数和`write_point_cloud`函数,通过这两个函数可以轻松实现PLY格式的读取和写入。读取PLY格式的点云数据后,我们可以对点云进行各种操作,如点云配准、滤波、重建等,然后再将处理后的点云保存为PLY格式或其他格式,如PCD或XYZ等。 除了PLY格式,Open3D还支持其他格式的点云数据。例如,使用`read_point_cloud`和`write_point_cloud`函数,我们可以读取和写入PCD格式的点云数据,该格式常用于点云库PCL(Point Cloud Library)中。此外,Open3D还可以读取和写入XYZ格式的点云数据,该格式简单而常用,只包含点的坐标信息。 综上所述,Open3D支持多种点云格式,包括PLY、PCD和XYZ等。无论是从这些常见点云格式中读取数据,还是将处理后的点云数据保存为指定的格式,Open3D都提供了方便易用的函数来实现这些操作。这使得Open3D成为一个功能强大且灵活的工具,能够满足不同的点云处理需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值