2017-06-09 2 views
0

Mein Ziel ist es, meine Punktwolke (abgeleitet von TLSs) zu Voxeln zu partitionieren, wo der Benutzer Seitenlänge von Voxeln definieren muss. Sobald Voxel erstellt sind, muss ich nur einen Punkt im Voxel auswählen, der eine bestimmte Bedingung erfüllt. Bisher habe ich dieses Ziel programmiert, aber ich habe ein kleines Problem. In einigen Teilen der Punktwolke der Punktdichte immer höher, wie in folgenden Figur (dichteren Bereich mit rotem Polygon markiert) dargestellt:Irreguläre Punktwolke von Voxeln

enter image description here

Ich denke, das eine Folge von benachbarten Voxeln in Z-Richtung ist, die ist senkrecht zur XY-Ebene. Könnten Sie mir bitte zu diesem Thema helfen?

Hier ist mein Code:

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); 

} 

ich mich darauf, von Ihnen zu hören

Mustafa

+0

Können Sie den Code teilen, den Sie verwenden? –

+0

Was genau wollen Sie lösen? Herausfiltern der Punkte, die außerhalb der xy-Ebene liegen, an der Sie interessiert sind? Verkleinere die Punktwolke so, dass sie gleichmäßig dicht ist? – brad

+0

Lieber David de la Iglesia Ich habe meine Frage editiert und meinen Code eingefügt. Sehr geehrte Damen und Herren, mein Ziel ist es, nur einen Punkt für jedes Voxel auszuwählen und dieser eine Punkt muss eine bestimmte Bedingung erfüllen. Nach dieser Auswahl sollte die Anzahl der Punkte gleich der Anzahl der belegten Voxel sein. Und die resultierende Punktwolke sollte ungefähr regelmäßig sein. In meinem Fall ist die Dichte in einigen Teilen der resultierenden Punktwolke jedoch nicht regelmäßig. Der Grund dafür ist, dass in dem mit rotem Polygon markierten Bereich benachbarte Voxel in z-Richtung vorhanden sind, was zu Unregelmäßigkeiten bei der Dichte führt. Kannst du mir bitte helfen? – user887912

Antwort

0

vielleicht versuchen Sie zu „Voxelize“ Ihre Daten suchen und Sie in jedem speichern möchten Voxel eine benutzerdefinierte Datenstruktur, um Ihre benutzerdefinierten Anforderungen zu erfüllen. Hier ist ein allgemeiner 3D-Mapping-Framework, die Sie in Voxel Ihre benutzerdefinierten Daten speichern lassen:

https://github.com/m4nh/skimap_ros

Sie haben ein benutzerdefinierten Daten für Sie Voxel zu schaffen, die fähig ist, eine Menge von Punkten implementig eine benutzerdefinierten Methode zu speichern :

voxel.getSatisfactoryPoint(..)

, die Ihre Business-Logik verbirgt und nur einen Punkt für jedes Voxel gibt zurück.

Verwandte Themen