RealSenseDevice

Introducción a RealSense y el método de nube de puntos

En el desarrollo de aplicaciones gráficas, existe un método llamado “nube de puntos”, el cual, con respecto a la programación 3D, se refiere a no más que un conjunto de vectores o puntos que representan una forma.

En la representación 3D tradicional, los puntos no son suficientes por sí mismos para proporcionar una representación visual de la forma, porque representan una única coordenada en el espacio, no un volumen o alguna asociación con puntos circundantes que pudiese implicar una superficie. Por lo general, corresponde al programador unir estos puntos para formar polígonos, o recurrir a otras técnicas que definan superficies, y obtener de esa manera una representación sólida de la forma en cuestión.

Hay mucha información disponible sobre captura, manipulación y representación de conjuntos de datos de nubes de puntos, pero muy pocos consejos sobre cómo aplicar este concepto a la creación de aplicaciones Intel RealSense. (link )

En este artículo se verán recomendaciones sobre API, técnicas básicas y tecnología que se puede investigar a fin de contar con algunas herramientas más. Para entender el contenido es conveniente, tener conocimientos básicos del SDK de Intel RealSense, programación 3D y estructuras geométricas.

nube de puntos
nube de puntos
  1. Por qué es importante

Cuando se consideran los datos que se obtienen de las cámaras de profundidad típicas, son más bien una nube de puntos alineada dentro de una cuadrícula común, no una figura tridimensional. Esta sutil distinción es clave para encontrar soluciones innovadoras a las dificultades que enfrentamos en la actualidad.

También cabe decir que todavía se debe resolver el problema de manipular con precisión espacios 3D virtuales solo con las manos, como tomar una pelota virtual desde el aire o esculpir una estatua de arcilla. Este tipo de actividades parece adecuarse con naturalidad a la tecnología Intel RealSense, pero crear las técnicas que lo permitirían supera lo que se puede hacer con la mayoría de los kits de desarrollo de software (SDK) y deja en manos de los programadores innovar para encontrar soluciones.

Además de las posibilidades de colisión ya mencionadas, otro aspecto importante de pensar en los datos de profundidad en bruto como una nube de puntos es que nos permite combinar esos datos en representaciones 3D más exactas de formas tridimensionales. Por ejemplo, es posible escanear una habitación desde distintas perspectivas y ángulos, recopilar los datos como puntos y luego detectar puntos en común para unir los datos.

  1. El punto de partida

EJEMPLO DE CÓDIGO 1. Creación de la estructura de datos de la nube de puntos

// estructura vectorial basica y arreglo de conjunto de datos de nube de puntos
struct vec3
{
	float x;
	float y;
	float z;
}
vec3* dataset = new vec3[depthwidth*depthheight];
dataset[(y*depthwidth)+x].x=(float)x;
dataset[(y*depthwidth)+x].y=(float)y;
dataset[(y*depthwidth)+x].z=(float)depthdistance;

Repasemos y resumamos:

Cuando ya hayamos inicializado la cámara de profundidad y obtenido un flujo de datos de profundidad, podremos rellenar un arreglo 2D de valores cortos (16 bits) que contienen la distancia desde la cámara hasta un objeto sólido detectado. El tamaño del arreglo 2D refleja la resolución del formato de datos de profundidad que se ha elegido. Existen varias cámaras que ofrecen resoluciones de profundidad de 320 x 240 a 640 x 480 y producen una nube de entre 76.800 y 307.200 puntos. Como es razonable suponer que cada punto consume 12 bytes (4 bytes por eje de vértice), estamos hablando de más de 900 kB para guardar un solo conjunto de datos de nube de puntos sin comprimir.

  1. Un poco de color

Un aspecto que no hemos comentado de los datos provenientes de la cámara es que el flujo de color adicional es a menudo una imagen de mayor resolución. El SDK de Intel RealSense proporciona un flujo de asignación con búsqueda para poner en correlación el punto de profundidad con el color en la ubicación correspondiente.

EJEMPLO DE CÓDIGO 2. Estructura de datos ampliada con el componente RGB

// estructura vectorial básica y arreglo de conjunto de datos de nube de puntos

struct vec3
{
float x;
float y;
float z;
unsigned char red;
unsigned char green;
unsigned char blue;
}
vec3* dataset = new vec3[depthwidth*depthheight];
int datasetindex = (y*depthwidth)+x;
dataset[datasetindex].x=(float)x;
dataset[datasetindex].y=(float)y;
dataset[datasetindex].z=(float)depthdistance;
dataset[datasetindex].red=((*(DWORD*)colorStreamPtr)&0xFF0000)>>16;
dataset[datasetindex].green=((*(DWORD*)colorStreamPtr))&0xFF00)>>8
dataset[datasetindex].blue=((*(DWORD*)colorStreamPtr))&0xFF);

Aumentar la estructura de datos de puntos para incluir un componente RGB hace posible reconstruir no solo la forma, sino también la textura del objeto. Únicamente el hardware “LiDAR” (link) más costoso es capaz de capturar a la vez información de color y de profundidad precisa. Por lo tanto, es muy recomendable aprovechar esta información proveniente del aparato del consumidor si se desea crear la mejor representación visual de lo que hay frente a la cámara.

 

 

Comments

comments

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *