Reconocimiento de objetos con OpenNI

Reconocimiento de objetos con OpenNI

Como ya hemos visto en la unidad didáctica segunda, OpenNI permite identificar objetos en la escena a través del nodo de producción de tipo generador de Usuario.  Este nodo analiza la información extraída de un mapa de profundidad para identificar los objetos de interés en la escena (usuarios), distinguiéndolos de otros elementos no relevantes e identificándolos individualmente, además de ejercer otras funciones importantes a través de sus capacidades (como por ejemplo, la extracción del esqueleto).

En esta imagen, podemos apreciar cómo se han detectado un total de tres usuarios distintos en una misma escena. El resto de información no relevante en la imagen de profundidad se muestra en escala de grises, mientras que a cada usuario se le asigna un color

A efectos del reconocimiento de objetos, los comandos más relevantes en OpenNI son:

  • Obtención de los píxeles del usuario:

XnStatus xn::UserGenerator::GetUserPixels( XnUserID user, SceneMetaData &smd);

Esta función permite obtener el mapa de píxeles asociado al usuario "user", donde "user" es un valor numérico positivo mayor o igual a la unidad. Si no se desea especificar ningún usuario, "user" toma un valor nulo. Como resultado se genera un nuevo mapa de píxeles, de forma que cada píxel toma un valor o etiqueta según dicho píxel pertenezca a uno u otro usuario, o a ninguno. La información generada se guarda en la variable de tipo SceneMetaData smd.

  • Metadatos de escena

La clase SceneMetaData almacena la información relativa al mapa de etiquetas generado por el generador de usuario. En particular, accediendo al método Data(), se accede al mapa de etiquetas, que se presenta en formato XnLabel (tipo de datos entero de 16 bits).

  • Lista de usuarios detectados

XnStatus xn::UserGenerator::GetUsers (XnUserID aUsers[], XnUInt16 &  nUsers);

función obtiene los identificadores o etiquetas asociados a cada usuario detectado, y los almacena en el array aUsers. El tamaño máximo del array se especifica con el parámetro nUsers.

  • Número de usuarios detectados

XnUInt16 xn::UserGenerator::GetNumberOfUsers();

Esta función devuelve el número de usuarios detectados en la escena. Su uso más habitual es utilizar esta función para calcular la variable nUsers a la hora de llamar al método GetUsers comentado anteriormente.

 

Además de estos comandos y clases, de cara a realizar aplicaciones lúdico-interactivas que aprovechen el reconocimiento de objetos, también resulta interesante disponer de información localizada en el espacio asociada a cada usuario. En este sentido, el método GetCoM permite extraer el centro de masas asociado a los píxeles que un determinado usuario cubre (se especifica el identificador o etiqueta del usuario en cuestión, y una variable de tipo XnPoint3D para almacenar las coordenadas cartesianas del centro de masas)

XnStatus xn::UserGenerator::GetCoM(XnUserID user, XnPoint3D &com)

Con estas funciones podemos comenzar a trabajar con una escena en la que se desee identificar a los usuarios presentes para un determinado fin. En caso de que se quiera profundizar más en cuanto a las clases, métodos y estructuras utilizados por OpenNI para la generación de datos de usuario, nos remitimos a su guía de referencia

 

Obra publicada con Licencia Creative Commons Reconocimiento 3.0