miércoles, 22 de enero de 2014

Lectura de nubes de puntos desde archivos PCD

En la librería PCL podemos acceder a los archivos de nubes de puntos de diferentes formatos, aunque lo mas usual es que la lectura se haga desde un formato PCD que es el mas completo para nuestra librería.

Primero vamos a escribir el código mediante el cual acedemos a un archivo .pcd y lo guardamos en la memoria de la máquina para su posterior visualización.

#include <stdio.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
 
int user_data;

int main (int argc, char** argv){


pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);


pcl::io::loadPCDFile("test.pcd",*cloud);


pcl::visualization::CloudViewer viewer("Cloud Viewer");
    viewer.showCloud(cloud);
    while (!viewer.wasStopped ())
    {
      }

 return(0);
 }


En el encabezado es importante para la lectura de archivos la librería de IO , donde se encuentran las diferentes funciones de escritura, lectura y escritura de los diferentes formatos con los que podemos trabajar, aunque lo recomendable es trabajar con el formato PCD. Por eso incluimos el siguiente archivo en el encabezado:

#include <pcl/io/pcd_io.h>

 Los demás archivos incluidos son necesarios para reconocer el tipo de datos que se utilizan, funciones de la biblioteca estándar y la visualización para comprobar que hemos leído el archivo que pretendíamos.
 

Luego indicamos los datos que vamos a recoger del archivo, que en nuestros caso serán las las coordenadas cartesianas x,y,z además de las componentes del color R(rojo),G(verde),B(azul).  Y además en este caso será de tipo  puntero para poder entregar los datos a la función de visualización.



pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>);

Luego tenemos la función de lectura del archivo, que nos pide un archivo en formato pcd, por lo que su extensión no es pcd saldremos de la función con error.Si indicamos solo el nombre del archivo como es en nuestro caso, dicho archivo tendrá que estar dentro de la misma carpeta donde se encuentra el archivo de ejecución, en caso contrario tendremos que especificar la ruta y el archivo en una misma cadenas de caracteres de tipo string.

Luego en el segundo dato que tenemos que especificar es la variable que hemos declarado previamente en nuestro caso "  cloud " y que es un puntero pero no tiene por que ser puntero.

Luego tendremos la función de visualización que en nuestro caso es algo extra para comprobar lo que hemos leído. Donde tendremos un resultado como el siguente: