es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

View post on imgur.com

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:

View post on imgur.com

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 cloud;
PointCloud::Ptr cloud_ptr(&cloud);

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,>

Tags:  , , ,

Answer

  1. Avatar for 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:

    • El radio de búsqueda elegido para los vecinos más cercanos es demasiado pequeño o demasiado grande, lo que resulta en estimaciones de normales inexactas o pocas.
    • La orientación del mallado de la nube de puntos no es compatible con el algoritmo de estimación de normales. Asegúrese de que el mallado esté correctamente orientado con sus vectores normales apuntando hacia afuera.
    • El algoritmo utilizado para la estimación de normales no es el más adecuado para sus datos. Pruebe a cambiar el algoritmo o experimentar con diferentes parámetros para ver si mejora los resultados.

    Para investigar más a fondo este problema, puede probar los siguientes pasos:

    • Imprima las normales calculadas para comprobar si son correctas. También puede visualizarlas con un PCLVisualizer separado para asegurarse de que se están calculando correctamente.
    • Intente cambiar el radio de búsqueda para los vecinos más cercanos para ver si afecta la calidad de las estimaciones de normales.
    • Verifique la orientación del mallado de la nube de puntos para asegurarse de que sea compatible con el algoritmo de estimación de normales utilizado.
    • Experimente con diferentes algoritmos y parámetros de estimación de normales para ver si se pueden obtener mejores resultados. Por ejemplo, puede probar usar los métodos IntegralImageNormalEstimation o CovarianceEstimation.

    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.

Comments are closed.