pcl分割原理欧式距离分割以及代码分析

欧式距离分割

基于欧式距离的分割和基于区域生长的分割本质上都是用区分邻里关系远近来完成的。由于点云数据提供了更高维度的数据,故有很多信息可以提取获得。欧几里得算法使用邻居之间距离作为判定标准,而区域生长算法则利用了法线,曲率,颜色等信息来判断点云是否应该聚成一类

不管欧式距离分割还是其他分割,在电脑上进行实时处理都有点难度。

下面是欧式距离分割的具体算法伪代码:

  1. 在空间找一点p1,用kdTree找到离他最近的n个点,判断这n个点到p的距离,如果距离小于某个阈值r,则点p1,p2,p3,放入簇Q中
  2. 然后在Q里p2点处找n个点,判断距离,重复1
  3. 在 Q\p1,p2 找到一点,重复1,找到p12,p13,p14….全部放进Q里
  4. 当 Q 再也不能有新点加入了,则完成搜索了

因为点云总是连成片的,很少有什么东西会浮在空中来区分。

下面是代码的实现:

/*首先从相机获取点云数据,由于过密集点过多,先对其进行稀疏处理,但是保留其原来特性*/
pcl::ApproximateVoxelGrid<pcl::PointXYZ> approximate_voxel_filter;
approximate_voxel_filter.setLeafSize (0.02, 0.02, 0.02);
approximate_voxel_filter.setInputCloud (cloud_blob);// 第二次扫描点云数据作为源点云
approximate_voxel_filter.filter (*cloud);

/*对处于离群点的数据进行过滤*/
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;//创建滤波器对象
sor.setInputCloud(cloud);			//设置待滤波的点云
sor.setMeanK(50);				//设置在进行统计时考虑查询点临近点数
sor.setStddevMulThresh(1.0);				//设置判断是否为离群点的阀值
sor.filter(*cloud_filtered);
	
/*对过滤的点云进行欧式距离分割*/
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud (cloud_filtered);		// 桌子平面上其他的点云
std::vector<pcl::PointIndices> cluster_indices;	// 点云团索引
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;// 欧式聚类对象
ec.setClusterTolerance (0.02);			// 设置近邻搜索的搜索半径为2cm
ec.setMinClusterSize (100);			// 设置一个聚类需要的最少的点数目为100
ec.setMaxClusterSize (25000);			// 设置一个聚类需要的最大点数目为25000
ec.setSearchMethod (tree);			// 设置点云的搜索机制
ec.setInputCloud (cloud_filtered);
ec.extract (cluster_indices)

/*簇的种类以及簇里的点云进行保存*/
int j = 0;
for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it)
{ //迭代容器中的点云的索引,并且分开保存索引的点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster (new 
        pcl::PointCloud<pcl::PointXYZ>);
	for (std::vector<int>::const_iterator pit = it->indices.begin (); pit != it->indices.end (); ++pit)
     //设置保存点云的属性问题
      cloud_cluster->points.push_back (cloud_filtered->points[*pit]); //*
       cloud_cluster->width = cloud_cluster->points.size ();
       cloud_cluster->height = 1;
       cloud_cluster->is_dense = true;


	*add_cloud+=*cloud_cluster;
	std::cout << "PointCloud representing the Cluster: " << cloud_cluster->points.size () << " data points." << std::endl;

	  }

 

分类: PCL

标签:PCL欧式距离分割

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值