Para empezar con la definición, la reconstrucción es un modelo 3D de un objeto desarrollado sobre la base del procesamiento de datos de largo alcance. La reconstrucción puede realizarse utilizando una gran variedad de principios: estereométricos, estereofotométricos, eliminación de volúmenes o datos de movimiento.

Este trabajo es una guía que explica cómo desarrollar una aplicación sencilla para reconstruir la forma de un objeto utilizando la GPU, es decir, una tarjeta de vídeo.

Entre los principios mencionados anteriormente, hemos elegido el algoritmo de eliminación de volumen, sugerido por Brian Cureless y Mark Levoy en su artículo titulado «A Volumetric Method for Building Complex Models from Range Images».

La figura siguiente aclara el principio básico del algoritmo. El objeto a reconstruir a partir de un conjunto de imágenes se muestra a la izquierda. Al procesar una imagen, el algoritmo elimina los puntos 3D situados en la parte delantera del objeto (los autores aplicaron la técnica de luz estructurada para el mapeo de profundidad), y más allá. El resultado del primer procesamiento de la foto se muestra en el centro. Utilizando los datos obtenidos de la segunda cámara, el programa elimina puntos 3D adicionales. Cuantos más ángulos se utilicen, más puntos 3D adicionales se eliminan; al final, sólo quedan los puntos que pertenecen al objeto.

En la aplicación, implementamos una versión simplificada del algoritmo que sólo elimina los puntos situados más allá del contorno del objeto en las imágenes. Siguiendo el artículo original, dividimos todo el espacio en un conjunto de elementos cúbicos (voxels).

Para determinar si un voxel pertenece al objeto 3D, aplicamos el renderizado de la GPU y hacemos coincidir la proyección obtenida con la silueta del objeto.

Para obtener la proyección, se utiliza la siguiente función:

Para explicarlo con más detalle,

pixelBuffer->makeCurrent () – cambia el contenido del dibujo al buffer QGLPixelBuffer fuera de la pantalla.

Cuando se inicializa el buffer de salida, se desactiva el recorte, la prueba de profundidad y la mezcla, ya que el único objetivo es determinar la posición espacial del voxel en relación con el objeto.

Después de cambiar el contenido en HComparator::render, el buffer de salida se borra y los parámetros de proyección se establecen.

Para renderizar un voxel, se llama a la función glCallList(voxelList) para ejecutar una lista preformada de comandos. La función de inicialización es:

Después de dibujar, la posición espacial del voxel en relación con el objeto se determina utilizando la función HComparator::compareData.

La función compareData copia el contenido del buffer y lo compara con la silueta del objeto basándose en las tres opciones posibles (ver la figura de abajo):

a) el voxel está completamente situado dentro del objeto (código 1);

b) el voxel pertenece al borde (código 2);

c) el voxel está completamente situado más allá del objeto (código 0).

El conjunto de ángulos utilizados para desarrollar el modelo 3D es procesado secuencialmente por la función HReconstruction::process. Partimos de la suposición de que cada uno de los vóxeles pertenece al objeto. Si se determina la ubicación de un vóxel fuera del objeto para uno de los ángulos, su procesamiento se detiene y se elimina del modelo. Todo el procesamiento se lleva a cabo hasta que se consideran todos los ángulos. Al final, sólo quedan los vóxeles que pertenecen al modelo del objeto.

Para hacer coincidir el vóxel y la silueta del objeto, deben conocerse los parámetros de proyección. Están definidos por las matrices GL_PROJECTION y GL_MODELVIEW (ver la función setGL).

La matriz GL_PROJECTION está definida por los parámetros de la cámara, en concreto, la distancia focal y el tamaño de la imagen (la función HFrame::loadIntrisicParameters).

La posición 3D de la cámara se puede determinar utilizando el marcador de realidad aumentada, lo tomamos de la biblioteca aruco. El marcador es una imagen especial que se imprime en un pedazo de papel (ver la imagen de abajo).

Al fotografiar un objeto, el marcador debe mantenerse inmóvil y entrar en el campo de visión de la cámara en cada una de las fotos del objeto.

La biblioteca detecta los puntos de control del marcador y, a continuación, utilizando la distancia focal de la cámara, calcula la posición 3D del marcador (rvec y tvec).

Los parámetros rvec y tvec determinan la matriz GL_MODELVIEW (ver la función HFrame::loadExtrisicParameters).

Así, hemos aprendido a proyectar vóxeles en el plano de la imagen, determinar la posición del vóxel con respecto a la imagen del objeto, calcular los parámetros de proyección y determinar si el vóxel pertenece al volumen del objeto, mediante el procesamiento de los datos de varias cámaras; es decir, una técnica simplificada pero completa para reconstruir objetos 3D.

Dejar un comentario

Tu dirección de correo electrónico no será publicada.