C++_点云和C++函数处理

点云问题

原始点云拼接- 
   运动畸变是指在一帧时间内,激光雷达或者其载体在发生运动后,产生的点云位置不一样的问题
        点云是没有畸变的,每条激光线束最终会形成一个闭合的圆形===利用运动模型来做运动畸变补偿 和ICP方式
   这些数据包进行点云组帧
   
   激光雷达重叠区域
      
点云数量-- 
点云拼接: 
           从前往后叠帧,变为从中间向两边叠帧
		   环线下采样:环与环之间有一定的空隙,隔一个环、空一圈地去采样。常规环可以看成是空隙为0的扩张环
		   立方体滤波
点云预处理:
   噪点是指对模型处理无用的点云数据。离群点是指远离主观测区域的点云数据。	
     点云配准:ICP配准后叠帧
	     同源点云配准 是指从同一类型的传感器获取点云数据,但在不同的时间和视角下进行的点云配准
		 跨源点云配准 是指对不同类型传感器的点云进行配准
     点云滤波:直通滤波   双边滤波器  立方体滤波
	 点云下采样
点云与图像
    
点云搜索
  范围搜索
    范围搜索就是给定查询点和查询距离的阈值,从数据集中找出所有与查询点距离小于阈值的数据
	PCL 代码:
	   kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance)
       int radiusSearch (const PointT &point, double radius,
          		  std::vector<int> &k_indices,
                std::vector<float> &k_sqr_distances, unsigned int max_nn = 0) const;
				
		point[in]:查询点
        radius[in]:搜索半径
        k_indices[out]:搜索到的最近邻点在点云中的下标
        k_sqr_distances[out]:搜索到的最近邻点距离查询点的距离的平方值
        max_nn[in]:默认为0,搜索到的点的上限,如果搜索到的点数目多于它,那么丢弃超出的部分;
		如果max_nn设为0或者大于搜索点云的大小,则返回所有找到的点。
        返回值:搜索到的最近邻点的数目		
				

     # 建立KD树索引
     pcd_tree = o3d.geometry.KDTreeFlann(pcd) 
	 
	 open3d.geometry.KDTreeFlann
	 search_radius_vector_3d(self, query, radius)


      # 使用半径R近邻,将第1500个点半径(0.02)范围内的点设置为绿色
      radius = 0.02  # 设置半径大小
      [n_radius, idx_radius, _] = pcd_tree.search_radius_vector_3d(pcd.points[1500], radius)  # 返回邻域点的个数和索引
      np.asarray(pcd.colors)[idx_radius[1:], :] = [0, 1, 0]  # 跳过查询点本身,对邻域点进行赋色
      print("半径r邻域内的点数为:", n_radius)
 ###search_point
 	 search_point.x = pose.x
     search_point.y = pose.y
     search_point.z = pose.z  		 

     # 建立octree树
     octree = o3d.geometry.Octree(max_depth=4)
     octree.convert_from_point_cloud(pcd, size_expand=0.01)
	 
	 或者
	   # 体素化
      voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size=0.2)

半径滤波

  半径滤波
  在给定阈值参数nb_points后,遍历点云所有点,对于点云中任意一点,设其半径radius内有K个点,当K< nb_points时,即可识别该点为噪声点,并去除该点。
  
  pc,idx=pcd.remove_radius_outlier(nb_points, radius, print_progress=False)
   nb_points:邻域球内的最少点个数,小于该个数为噪声点
   radius: 邻域半径大小
   pc:去噪后的点云
   idx:去噪保留的点索引

  BilateralFilter 双边滤波器
  点云平滑是点云后处理的重要一环
   导向滤波 Guided Image Filtering
   
对比定位思路来看

代码实现

 函数是一段可重用的代码块,它可以接受输入参数,并返回输出结果。除了返回结果,函数还可以修改传入的数据
 python 
    传引用调用是指将实参的引用传递给形参,在函数内部对形参的修改会影响到实参。这意味着在函数内部可以修改传入的可变对象,如列表和字典
	def append_one(lst):
        lst.append(1)
 C++ 
    3.1 按值传递:该方式不改变传入参数的值;
    3.3 按地址传递:该方式改变传入参数的值;
    3.3 按引用传递:该方式改变传入参数的值

参考

 http://www.open3d.org/docs/release/python_api/open3d.geometry.KDTreeFlann.html
 详解激光雷达点云处理那些事,点云预处理、感知、定位 https://zhuanlan.zhihu.com/p/611322357
寻找两个点云重叠部分	
https://blog.csdn.net/xinxiangwangzhi_/article/details/122517017  
两个点云的重叠部分查找(附open3d python 代码)
https://blog.csdn.net/a394467238/article/details/131981798  
Guided Filter点云降噪
https://aipiano.github.io/2019/04/28/Guided-Filter%E5%AF%B9%E4%B8%89%E7%BB%B4%E7%82%B9%E4%BA%91%E9%99%8D%E5%99%AA/
https://github.com/aipiano/guided-filter-point-cloud-denoise
https://www.cnblogs.com/yibeimingyue/p/11458592.html
cv2.bilateralFilter 双边滤波
PCL 双边滤波器API使用
https://blog.51cto.com/u_14355665/6101928
 https://github.com/MNewBie/PCL-Notes/blob/master/README.md
posted @ 2023-11-02 19:12  辰令  阅读(92)  评论(0编辑  收藏  举报