2017-06-09 17 views
0

私の目標は、ボクセルの辺の長さを定義する必要があるボクセルに、私の点群(TLSから派生)を分割することです。ひとたびボクセルが作成されると、ある条件を満たすボクセル内にある1つの点だけを選択しなければならない。これまでのところ、私はこの目的をプログラムしましたが、私は小さな問題があります。点の一部に図形(赤ポリゴンの付いた密領域)を以下に示すように、点密度が高くなってきているクラウド:ボクセルの不規則な点群

enter image description here

私は、これがZ方向に隣接するボクセルの結果であると思いますX-Y平面に垂直である。この問題について私に助けてください。ここで

は私のコードです:

int main(int argc, char** argv) 
{ 
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); 
    //pcd'ye dönüştürülen dosyanın okunması 
    pcl::io::loadPCDFile<pcl::PointXYZ>("input/yeni_proje_V2_ENTIRE_CLOUD_with_SEMI_DIAGONAL - Cloud.pcd", *cloud); 
    //voxel boyutu (metre) 
    float resolution = 0.02f; 
    //voxel index merkez ve içindeki noktalar 
    FILE *Dosya = fopen("output/yeni_proje_V2_ENTIRE_VOXELS_INDEXES_2cm_SEMI_DIAGONAL_ROTATED.xyz", "w+"); 
    //hata elipsoidlerini içeren dosya 
    FILE* Dosya2 = fopen("input/yeni_proje_V2_ENTIRE_CLOUD_with_SEMI_DIAGONAL - ROTATED.xyz", "r"); 
    //elipsoidi en küçük olan noktalar 
    FILE *Dosya3 = fopen("output/yeni_proje_V2_2cm_selected_ONLY_COORDS_SEMI_DIAGONAL_ROTATED.xyz", "w+"); 
    FILE *Dosya4 = fopen("output/yeni_proje_V2_2cm_selected_SEMI_DIAGONAL_ROTATED.xyz", "w+"); 

    //FILE *Dosya5 = fopen("input/FARO_salon010203_COORDINATES_NORMALS.xyz", "r"); 
    //FILE *Dosya6 = fopen("output/FARO_salon010203_5cm_selected_COORDINATES_and_NORMALS_SEMI_DIAGONAL.xyz", "w+"); 


    pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(resolution); 
    int index; 
    double a, b, c, deer; 
    double* r_deer = new double[cloud->points.size()];// hata parametri çekme 

    double* normal_x = new double[cloud->points.size()]; 
    double* normal_y = new double[cloud->points.size()]; 
    double* normal_z = new double[cloud->points.size()]; 
    for (index = 0; index < cloud->points.size(); index++)// hata parametri çekme 
    { 
     fscanf(Dosya2, "%lf %lf %lf %lf", &a, &b, &c, &deer);//4 lü dosya 
     r_deer[index] = deer; 
     //fscanf(Dosya5, "%lf %lf %lf %lf %lf %lf", &a, &b, &c, &normal_x[index], &normal_y[index],&normal_z[index]); 
    } 

    std::cout << normal_x[4] <<" "<<normal_y[4]<<" "<< normal_z[4] << std::endl; 
    octree.setInputCloud(cloud); 
    octree.addPointsFromInputCloud(); 
    pcl::PointXYZ searchPoint; 
    std::cout << "Voxel sayisi: " << octree.getLeafCount() << std::endl; 
    // Neighbors within voxel search 
    std::vector<pcl::PointXYZ, Eigen::aligned_allocator<pcl::PointXYZ>> pointGrid; 
    octree.getOccupiedVoxelCenters(pointGrid); 
    int k = 0; 
    int kıyas = 0; 
    /* 
    int kontrol; 
    std::cout << "kontrol satiri girin:" << std::endl; 
    std::cin >> kontrol;//kontrol 
    kontrol = kontrol - 1; 
    */ 
    for (k = 0; k < octree.getLeafCount(); k++) 
    { 
    // if (k == kontrol) std::cout << "Secili merkez" << "(" << pointGrid[k].x << " " << pointGrid[k].y << " " << pointGrid[k].z << ")" << std::endl;//kontrol 

     fprintf(Dosya, "%i %f %f %f", k + 1, pointGrid[k].x, pointGrid[k].y, pointGrid[k].z); 
     std::vector<int> pointIdxVec; 
     double limit = sqrt(3)*resolution; 
     limit = limit/2; 
     if (octree.voxelSearch(pointGrid[k], pointIdxVec)) 
     { 
      kıyas = pointIdxVec[0]; 
      for (size_t i = 0; i < pointIdxVec.size(); ++i) 
      { 

       if (pointIdxVec.size() - (i + 1) != 0)//Hata elipsoidlerini kıyasla ve en küçüğü ver 
       { 
        if (r_deer[kıyas] > r_deer[pointIdxVec[i + 1]])kıyas = pointIdxVec[i + 1]; 
       } 

       //if (kontrol == k) std::cout << pointIdxVec[i] + 1 << "(" << r_deer[pointIdxVec[i]] << ")" << std::endl; //kontrol 

       fprintf(Dosya, " %i", pointIdxVec[i] + 1); 
       if (pcl::euclideanDistance(cloud->points[pointIdxVec[i]], pointGrid[k]) >= limit) 
       { 
        std::cout << pointIdxVec[i] << " " << cloud->points[pointIdxVec[i]] << " Nokta voxelin icinde degil!!! " << std::endl; 
        std::cout << pcl::euclideanDistance(cloud->points[pointIdxVec[i]], pointGrid[k]) << " Merkezle Mesefe" << std::endl; 
        std::cout << limit << " Olması gereken maksimum mesafe" << std::endl; 
       } 
      } 


      //if (kontrol == k) std::cout << "Minimum:" << kıyas + 1 << "(" << r_deer[kıyas] << ")" << std::endl; //kontrol 
      fprintf(Dosya3, "%f %f %f\n", cloud->points[kıyas].x, cloud->points[kıyas].y, cloud->points[kıyas].z); 
      //fprintf(Dosya6, "%f %f %f %f %f %f\n", cloud->points[kıyas].x, cloud->points[kıyas].y, cloud->points[kıyas].z, normal_x[kıyas], normal_y[kıyas], normal_z[kıyas]); 
      fprintf(Dosya4, "%f %f %f %f\n", cloud->points[kıyas].x, cloud->points[kıyas].y, cloud->points[kıyas].z,r_deer[kıyas]); 
      fprintf(Dosya, "\n"); 
     } 
    } 
    fclose(Dosya); 
    fclose(Dosya2); 
    fclose(Dosya3); 
    fclose(Dosya4); 
    //fclose(Dosya5); 
    //fclose(Dosya6); 

} 

私はあなたから聞い

ムスタファ

+0

使用しているコードを共有できますか? –

+0

解決したい問題は何ですか?あなたが興味を持っているxy平面の外にある点を除外しますか?均一に密集するようにポイントクラウドをダウンサイズしますか? – brad

+0

親愛なるDavid de la Iglesia私は自分の質問を編集し、自分のコードを挿入しました。私の目的は各ボクセルごとに1つの点を選択することであり、この1点は一定の条件を満たす必要があります。この選択の後、点の数は占有ボクセルの数に等しくなければならない。結果として得られるポイントクラウドは、ほぼ規則正しくなるはずです。しかし、私の場合、得られるポイントクラウドの一部の密度は規則的ではありません。理由は、赤いポリゴンでマークされた領域には、密度が不規則になるz方向に隣接するボクセルがあるからです。あなたはそれについて私を助けてくれますか? – user887912

答えて

0

多分あなたは「Voxelize」あなたのデータにしようとしているとあなたがそれぞれに格納するのを楽しみにしていますカスタム要件を満たすためのカスタムデータ構造をボクセル化します。あなたはカスタムメソッドimplementig点のセットを記憶することが可能であるあなたのボクセルのためのカスタムデータを作成する必要が

https://github.com/m4nh/skimap_ros

:ここでは、ボクセル内のカスタムデータを格納するために聞かせて、一般的な3Dマッピングフレームワークは、 :

ビジネスロジックを隠し、各ボクセルのためのちょうど1ポイントをバック与え

voxel.getSatisfactoryPoint(..)