2026/2/11 0:26:42
网站建设
项目流程
哪个网站可以做翻译赚钱,wordpress首页导航设置,网站开发html的题,网店运营数据分析前言
2 代码实现
2.1 代码行实现
2.2 将半径-中值组合滤波实现封装到 pointCloud_radius_median_filter() 函数中 前言
第十一课Open3D点云数据处理#xff1a;中值滤波-CSDN博客
第七课 Open3D点云数据处理#xff1a;半径滤波-CSDN博客
2 代码实现
2.1 代码行实现
…前言2 代码实现2.1 代码行实现2.2 将半径-中值组合滤波实现封装到 pointCloud_radius_median_filter() 函数中前言第十一课Open3D点云数据处理中值滤波-CSDN博客第七课 Open3D点云数据处理半径滤波-CSDN博客2 代码实现2.1 代码行实现import open3d as o3d import numpy as np # 读取点云文件 pcd o3d.io.read_point_cloud(data\desk.pcd) # 定义中值滤波半径 radius 0.05 # 构建kdtree进行邻域搜索 kdtree o3d.geometry.KDTreeFlann(pcd) np_points np.array(pcd.points) # 存放半径滤波过滤掉的点的索引 index_r [] # 遍历点云 for i in range(len(pcd.points)): # 获取当前点的坐标 point pcd.points[i] # 使用kdtree搜索当前点的邻域 [k, idx, _] kdtree.search_radius_vector_3d(point, radius) # 如果邻域内没有点则跳过并记录当前点索引 if k 20: # 将当前点索引添加到index_r数组中 index_r.append(i) continue # 计算邻域内所有点的坐标中位数 median np.median(np.asarray(pcd.points)[idx], axis0) # 更新当前点的坐标 np_points[i] median # 中值滤波numpy数组转PointCloud点云 pcd_median o3d.geometry.PointCloud() pcd_median.points o3d.utility.Vector3dVector(np_points) # 将索引转换为numpy数组 indices_to_delete np.asarray(index_r) # 构建存放组合滤波点云的容器pcd_filter pcd_filter o3d.geometry.PointCloud() # 从点云中删除指定索引的点相当于半径滤波 pcd_filter .points o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_median.points), indices_to_delete, axis0)) # 若点云中包含其他信息如颜色、反射强度、法向量等也需要删除。 # 下面以删除颜色为例要保证点云中确实包含颜色信息否则删除时会报错。 # pcd_filter.colors o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_median.colors), indices_to_delete, axis0)) # 打印滤波前后点云 print(pcd,pcd) print(pcd_filter,pcd_filter) print(删除点数,len(index_r)) # 可视化滤波结果 # 可视化滤波结果 pcd.paint_uniform_color([1,0,0]) o3d.visualization.draw_geometries([pcd], width900, height600, window_name 半径-中值组合滤波原始点云红) pcd_filter.paint_uniform_color([0,1,0]) o3d.visualization.draw_geometries([pcd_filter], width900, height600, window_name 半径-中值组合滤波滤波点云绿)2.2 将半径-中值组合滤波实现封装到pointCloud_radius_median_filter()函数中import open3d as o3d import numpy as np describe: 半径-中值组合滤波 param[I]: pointCloud, 待滤波点云 param[I]: radius, 滤波窗口半径 param[I]: min_ptNum, 半径滤波最小点数 return: pointCloud_filter: 组合滤波结果点云 def pointCloud_radius_median_filter(pointCloud,radius,min_ptNum): # 构建kdtree进行邻域搜索 kdtree o3d.geometry.KDTreeFlann(pointCloud) np_points np.array(pointCloud.points) # 存放半径滤波过滤掉的点的索引 index_r [] # 遍历点云 for i in range(len(pointCloud.points)): # 获取当前点的坐标 point pointCloud.points[i] # 使用kdtree搜索当前点的邻域 [k, idx, _] kdtree.search_radius_vector_3d(point, radius) # 如果邻域内没有点则跳过并记录当前点的索引 if k min_ptNum: # 将当前点索引添加到index_r数组中 index_r.append(i) continue # 计算当前点邻域内所有点的坐标中位数 median np.median(np.asarray(pointCloud.points)[idx], axis0) # 更新当前点的坐标 np_points[i] median # 中值滤波numpy数组转PointCloud点云 pointCloud_median o3d.geometry.PointCloud() pointCloud_median.points o3d.utility.Vector3dVector(np_points) # 将索引转换为numpy数组 indices_to_delete np.asarray(index_r) # 构建存放组合滤波点云的容器pointCloud_filter pointCloud_filter o3d.geometry.PointCloud() # 从点云中删除指定索引的点相当于半径滤波 pointCloud_filter.points o3d.utility.Vector3dVector(np.delete(np.asarray(pointCloud_median.points), indices_to_delete, axis0)) # 若点云中包含其他信息如颜色、反射强度、法向量等也需要删除。 # 下面以删除颜色为例要保证点云中确实包含颜色信息否则删除时会报错。 # pointCloud_filter.colors o3d.utility.Vector3dVector(np.delete(np.asarray(pcd_median.colors), indices_to_delete, axis0)) # 返回组合滤波点云 return pointCloud_filter if __name__ __main__: # 读取点云文件 pcd o3d.io.read_point_cloud(data\desk.pcd) # 中值滤波半径 radius 0.05 # 半径滤波最小点数 min_ptNum 20 # 执行组合滤波 pcd_filter pointCloud_radius_median_filter(pcd,radius,min_ptNum) # 打印滤波前后点云 print(pcd,pcd) print(pcd_filter,pcd_filter) # 可视化滤波结果 pcd.paint_uniform_color([1,0,0]) o3d.visualization.draw_geometries([pcd], width900, height600, window_name 半径-中值组合滤波原始点云红) pcd_filter.paint_uniform_color([0,1,0]) o3d.visualization.draw_geometries([pcd_filter], width900, height600, window_name 半径-中值组合滤波滤波点云绿)