pcl 분할 원리 유럽식 거리 분할 및 코드 분석

2951 단어 pcl
유럽식 거리 분할
유럽식 거 리 를 바탕 으로 하 는 분할 과 지역 성장 을 바탕 으로 하 는 분할 은 본질 적 으로 이웃 관 계 를 구분 하 는 원근 으로 이 루어 진다.점 클 라 우 드 데 이 터 는 더욱 높 은 차원 의 데 이 터 를 제공 하기 때문에 많은 정 보 를 추출 하여 얻 을 수 있다.유클리드 알고리즘 은 이웃 간 거 리 를 판정 기준 으로 하고 지역 성장 알고리즘 은 법 선, 곡률, 색채 등 정 보 를 이용 하여 점 구름 이 한 종류 로 모여 야 하 는 지 여 부 를 판단 한다.
유럽식 거리 분할 이 든 다른 분할 이 든 컴퓨터 에서 실시 간 으로 처리 하 는 것 은 좀 어렵다.
다음은 유럽식 거리 분할 의 구체 적 인 알고리즘 위조 코드 입 니 다.
  • 공간 에서 p1 을 찾 고 kdTree 로 그 와 가장 가 까 운 n 개 점 을 찾 아 n 개 점 에서 p 까지 의 거 리 를 판단 합 니 다. 거리 가 특정한 한도 값 r 보다 작 으 면 p1, p2, p3 를 누 르 고 클 러 스 터 Q 에 넣 습 니 다
  • 그리고 Q 리 p2 시 에서 n 개의 점 을 찾 아 거 리 를 판단 하고 반복 1
  • Q \ \ p1, p2 에서 한 점 을 찾 고 1 을 반복 하 며 p12, p13, p14 를 찾 습 니 다. 모두 Q 에 넣 습 니 다
  • Q 가 더 이상 새로운 점 이 가입 되 지 않 으 면 검색 이 완 료 됩 니 다
  • 점 운 은 항상 연결 되 어 있 기 때문에 공중 에 떠 서 구분 하 는 것 이 매우 적다.
    다음은 코드 의 실현 입 니 다.
    /*           ,        ,         ,         */
    pcl::ApproximateVoxelGrid<: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<:pointxyz> sor;//       
    sor.setInputCloud(cloud);			//        
    sor.setMeanK(50);				//                 
    sor.setStddevMulThresh(1.0);				//             
    sor.filter(*cloud_filtered);
    	
    /*              */
    pcl::search::KdTree<:pointxyz>::Ptr tree (new pcl::search::KdTree<:pointxyz>);
    tree->setInputCloud (cloud_filtered);		//           
    std::vector<:pointindices> cluster_indices;	//      
    pcl::EuclideanClusterExtraction<: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<:pointindices>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it)
    { //           ,           
    	pcl::PointCloud<:pointxyz>::Ptr cloud_cluster (new 
            pcl::PointCloud<:pointxyz>);
    	for (std::vector::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 유럽식 거리 분할

    좋은 웹페이지 즐겨찾기