API de OpenNI para mapas de profundidad

API de OpenNI para mapas de profundidad

Existen una serie de clases de OpenNI que están específicamente pensadas para trabajar con mapas de profundidad. A continuación, se destacan algunas de las principales.

Para una API completa, el alumno debe visitar el siguiente enlace. En cualquier caso, para facilitar la búsqueda de información, en cada clase listada se proporciona un enlace directo a su sección en la API de OpenNI (basta con pinchar en el nombre).

El contexto (Context) es el espacio de trabajo donde la aplicación OpenNI crea el grafo de producción. El contexto se puede entender como una partición del disco, o un directorio, donde OpenNI almacena todo lo que necesita. Para usar cualquier aplicación OpenNI, es necesario crear e inicializar un contexto. Por ejemplo, con la siguiente instrucción:

rc = g_context.InitFromXmlFile(SAMPLE_XML_PATH, g_scriptNode, &errors);

se crea un contexto a partir de la información de configuración almacenada en el fichero .xml proporcionado.

Tipo de dato usado por OpenNI para almacenar valores de profundidad, en milímetros. Es una redefinición de XnUInt16, un entero sin signo de 16 bits.

Un nodo de este tipo genera, y almacena, un mapa de profundidad. El mapa se representa como un array de píxeles, donde cada valor se corresponde con una distancia al sensor, en milímetros.

Entre las funciones de esta clase, destacan las que permiten pasar de píxeles 2D de la imagen a coordenadas 3D del espacio, y viceversa. Estas funciones son ConvertRealWorldToProjective y ConvertProjectiveToRealWorld.

Como ejemplo de uso, para obtener las coordenadas (x,y) del píxel asociado a un punto 3D del espacio (spacePosition), se usaría este código:

XnPoint3D projectivePoint;
depthGenerator.ConvertRealWorldToProjective(1,spacePosition,&projectivePoint);
int x = projectivePoint.X;
int y = projectivePoint.Y;
del mismo modo se puede realizar el proceso inverso, y obtener puntos del espacio 3D a partir de píxeles.

Proporciona una forma rápida de acceder a los diferentes parámetros del mapa de profundidad (por ejemplo, el alto o el ancho). También permite acceder a los píxeles del mapa de profundidad directamente, a través del método Data(). Así, la siguiente línea de código:

const XnDepthPixel* pDepth = g_depthMD.Data();

devuelve un puntero, pDepth, que apunta al primer píxel del array en el que se almacena el mapa de profundidad.

La API AlternativeViewPoint para OpenNI alinea los pixeles del mapa de profundidad con sus homólogos de la imagen en color. No todos los sensores tienen esta capacidad. Para comprobar si un sensor Kinect concreto puede realizar este alineamiento hay que utilizar la siguiente instrucción:

XnBool isSupported = depthGenerator.IsCapabilitySupported("AlternativeViewPoint");

donde depthGenerator es un nodo de tipo DepthGenerator.

La clase AlternativeViewPoint, simplemente, desplaza los puntos capturados por un sensor para que aparezcan como si el sensor estuviese colocado en otra posición. Incluye funciones para fijar nuevas posiciones virtuales para el sensor, para fijar la posición de un sensor a partir de la de otro, etc. Esta clase puede usarse para muchas funciones aparte de alinear el mapa de profundidad con la imagen en color.

 

 

 

 

Obra publicada con Licencia Creative Commons Reconocimiento 3.0