PCL: La estimación o visualización normal no funciona.
Estoy tratando de comenzar a trabajar con PCL y hacer este ejemplo básico:
https://pcl.readthedocs.io/projects/tutorials/en/latest/howfeatureswork.html#how-3d-features-work
Sin embargo, ni la estimación normal ni la visualización de las normales estimadas funcionan como deberían.
Como algunos datos de prueba, generé esta malla simple en Blender:
Estoy usando este objeto de prueba porque tengo algunos datos de nube de puntos que fueron grabados con un sensor 3D-LIDAR real que es más complejo, así que solo por el bien de resolver este problema, estoy usando este objeto más simple aquí.
Convierto esta malla en una nube de puntos PCL y también funciona bien.
Aquí está la vista del visualizador de nube de puntos PCL incorporado:
https://i.stack.imgur.com/EHFPb.png
Sin embargo, después de hacer una estimación normal de superficie e intentar visualizarla, el resultado es muy rudimentario:
Me hubiera esperado una vista similar a la visualización normal de la nube de puntos, ya que pasé la nube de puntos original Y las normales, sin embargo, solo obtengo once (los conté) normales de las cuales algunas ni siquiera parecen apuntar en la dirección correcta y ninguna visualización de la nube de puntos original tampoco.
La nube de puntos tiene 1024 puntos en ella y el conjunto de normales estimadas también tiene 1024 normales estimadas en ella, así que no estoy seguro de qué está yendo mal aquí.
Ejecuté este programa con diferentes parámetros para la búsqueda de radio de esfera (0.03, 0.06, 0.3, 0.6, 1, 3) pero obtuve resultados similares.
Aquí está mi código:
int main()
{
PointCloud
PointCloud
string filename = "C:\\Users\\ilmu0\\Desktop\\Blendertestobjects\\planeconcave.obj";
int readresult = OBJReader::readPointCloudFromFile(filename, cloud_ptr); //Mi misma clase que lee archivos ".obj" de Blender
if (readresult != 0)
{
cout << "No se ha podido leer el archivo" << endl;
return 1;
}
cout << "Tamaño de la nube: " << cloud.size() << endl; // -> 1024
NormalEstimation<pointxyz, normal=""> estimation;
estimation.setInputCloud(cloud_ptr);
KdTree<pointxyz>::Ptr tree_ptr(new KdTree<pointxyz>());
estimation.setSearchMethod(tree_ptr);
PointCloud<normal>::Ptr normalCloud_ptr(new PointCloud<normal>());
estimation.setRadiusSearch(0.6);
estimation.compute(*normalCloud_ptr);
cout << "Normales: " << normalCloud_ptr->size() << endl; // -> 1024
string result;
cin >> result;
//Esto se utiliza para mostrar solo la nube de puntos original
//CloudViewer viewer("Visualizador de nube de puntos simple");
//viewer.showCloud(cloud_ptr);
//mientras que (!viewer.wasStopped())
//{
//}
PCLVisualizer viewer("Visualizador PCL");
viewer.setBackgroundColor(0.0, 0.0, 0.5);
viewer.addPointCloudNormals<pointxyz, normal="">(cloud_ptr, normalCloud_ptr);
mientras que (!viewer.wasStopped())
{
viewer.spinOnce();
}
return 0;
}</pointxyz,></pointxyz,>
davy.ai
Parece que la estimación y visualización normales no están funcionando correctamente en su programa PCL. Está pasando la nube de puntos original y las normales estimadas al PCLVisualizer, pero solo se muestran unas pocas normales y no parecen apuntar en la dirección correcta.
Las posibles causas de este problema podrían ser:
Para investigar más a fondo este problema, puede probar los siguientes pasos:
En general, es importante experimentar gradualmente con diferentes parámetros y visualizar los resultados intermedios para comprender mejor lo que está sucediendo en el programa y cómo mejorarlo.