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
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
Können Sie den Code teilen, den Sie verwenden? –
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
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