2016-10-12 1 views
0

Je suis en train de trouver Normales d'un nuage de points avec l'aide de PointCloudLibrary suivant est le code que j'utilisecomment calculer la distance moyenne des points dans un nuage de points

 pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; 

     ne.setInputCloud (test1.cloud); 

     pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>()); 

     ne.setSearchMethod (tree); 

     ne.setKSearch (150); 

     ne.setRadiusSearch (1.5); 

     ne.compute (*Normalcloud); 

J'utilise les deux méthodes KDsearch et Méthode de recherche sphérique, mais je dois décider manuellement ou basculer entre les deux doivent également entrer manuellement la recherche et/ou le nombre de points voisins.

pour éviter tout ce tracas, je pense à l'aide de la distance du point moyenne du nuage de points à faire tout ce genre de choses quelque chose comme ça

ne.setKSearch (0.8*Avg_point_Distance); 

ne.setRadiusSearch (1.5*Avg_point_Distance); 

, mais je ne sais pas comment obtenir le distance moyenne pour l'ensemble du nuage de points?

REMARQUE: si quelqu'un peut modifier la question de manière plus compréhensible, je ne me dérange pas que :)

+1

Quelle est la question exactement? – Dexter

+0

@Dexter "Je pense utiliser la distance moyenne du nuage de points pour faire toutes ces choses ......." cette partie .... A édité le post. –

+0

@Dexter il est résolu maintenant. –

Répondre

0

Je suis passé par la documentation PCL et trouvé la méthode Kd recherche, à partir que je viens calculé point voisin le plus proche et accumulé toutes les distances et divisé avec le nombre de points présents dans le nuage de points.

extrait de code pour la méthode est la suivante:

totalcount = inputCloud->width * inputCloud->height ; 

    EuclidianDistance = new float [totalcount]; 

    kdtree.setInputCloud (inputCloud); 

    int K = 2; //first will be the distance with point it self and second will the nearest point that's why "2" 

    std::vector<int> pointIdxNKNSearch(K); 
    std::vector<float> pointNKNSquaredDistance(K); 

    for (int i = 0; i < totalcount; ++i) 
    { 
     std::cout << "\nK nearest neighbor search at (" << inputCloud->points[i].x 
      << " " << inputCloud->points[i].y 
      << " " << inputCloud->points[i].z 
      << ") with K=" << K << std::endl; 

     if (kdtree.nearestKSearch (inputCloud->points[i], K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0) 
      { 
       for (size_t j = 0; j < pointIdxNKNSearch.size(); ++j) 
       { 
        //saving all the distance in Vector 
        EuclidianDistance[i] = pointNKNSquaredDistance[j]; 

       } 
      } 
     } 

    for(int i = 0; i < totalcount; i++) 
    { 
     //accumulating all distances 
     totalDistance = totalDistance + EuclidianDistance[i]; 
    } 

    //calculating the mean distance 
    meanDistance = totalDistance/totalcount; 

    //freeing the allocated memory  
    delete [] EuclidianDistance;