import open3d as o3d
import numpy as np
def pass_through(pcd, pass_min, pass_max, pass_axis='x'):
"""
Args:
pcd: 点云数据
pass_min: 下限
pass_max: 上限
pass_axis: 坐标轴
Returns: 直通滤波后的点云数据
"""
# 将点云数据转换为ndarray
points = np.array(pcd.points)
# 判断处理的轴
if pass_axis=='x':
pass_axis = 0
elif pass_axis=='y':
pass_axis = 1
else:
pass_axis = 2
# 获得筛选后的数据下标
index = np.where((points[:, pass_axis] >= pass_min) & (points[:, pass_axis] <= pass_max))[0]
# 获得筛选后的点云数据
pcd = pcd.select_by_index(index)
return pcd
if __name__ == '__main__':
# 直通滤波
pcd = o3d.io.read_point_cloud('点云数据')
pcd = pass_through(pcd)
o3d.visualization.draw_geometries([pcd])
原理
Open3D 中的直通滤波(PassThrough Filter)用于过滤点云中的点,只保留位于指定范围内的点。这在一些情况下非常有用,比如去除点云中的地面或者天空等。(补充:主要是关于numpy数组的、直通滤波处理数据自己手写 np.where来适用点云项目,后面会主要讲一期numpy和点云处理的。。)
参数修改
`pcd`: 点云数据
`pass_min`: 设置下限
`pass_max`: 设置上限
`pass_axis`: 坐标轴
downPcd = pcd.voxel_down_sample(voxel_size=体素大小float类型)
原理
在 Open3D 中,voxel_down_sample
方法用于对点云进行体素下采样(Voxel Down Sampling),以减少点云的密度和复杂度。
参数
voxel_size
:体素大小,即用于下采样的立方体的边长。较小的体素大小会产生更密集的下采样结果,而较大的体素大小会产生更稀疏的下采样结果。这是一个必需的参数。例如voxel_size
设置为 0.05,这意味着在每个 0.05x0.05x0.05 的立方体内,只保留一个代表点。
downPcd = pcd.uniform_down_sample(every_k_points=多少点保留一个点数目 int)
原理
通过构建球体,选择距离球心最近的点采样,比起体素下采样,均匀下采样不移动点本身的位置
参数
every_k_points
:每k个点保留一个点
# 移除统计上的离群点
# nb_neighbors:最近k个点 std_ratio:基于标准差的阈值,越小滤除点越多
cl, index = pcd.remove_statistical_outlier(nb_neighbors=2, std_ratio=0.3)
原理
去除分布稀疏的点,对于点云中的每个点,计算到最近k个点的平均距离,然后假设结果构成高斯分布,过滤平均距离大于标准差的点。
参数
nb_neighbors
:最近k个点
std_ratio
:基于标准差的阈值,越小滤除点越多
返回值
cl
:返回处理后的点云
index
:去除数据的下标索引
cl, index = pcd.remove_radius_outlier(nb_points=10,radius=0.5)
原理
也是去除分布稀疏的点,以每个点为中心建立给定半径的球体,移除球体中点的数量小于给定阈值的点。
参数
nb_points
:指定在计算离群点时考虑的邻居点的最小数量。如果在指定半径范围内的邻居点数量少于此值,则当前点将被标记为离群点。
radius
:指定用于确定邻居点的搜索半径。在给定半径范围内搜索邻居点以确定每个点是否为离群点。
返回值
cl
:返回处理后的点云
index
:去除数据的下标索引
点云数据:百度链接:https://pan.baidu.com/s/1ovbrFzrqeM409Lp-O51gyw
提取码:sg6x