Para esta semana los cambios en el documento de la tesis se definieron en los siguientes rubros:
En cuanto a la implementación, para esta semana el avance consistió en colocar sobre el marcador localizado el modelo tridimensional correspondiente, y acomodarlo en su posición, animándolo con una simple rotación para comprobar que es un modelo 3D a diferencia del fondo que es una imagen 2D.
Para ello utilicé el plugin mencionado anteriormente, MeshViewer, que utiliza polígonos de Pygame para crear objetos en 3D en base a vértices que forman triángulos o cuadrados, los cuales a su vez combinados forman caras, para al final combinar éstas y crear modelos 3D. El plugin además permite leer archivos .obj, para a partir de ellos crear modelos más complejos a partir de ellos.
Paso a paso, el proceso es el siguiente:
- Definir un diccionario de modelos para relacionar marcadores con modelos 3D.
- Leer el video frame por frame
- Disminuir el tamaño de la imagen para acelerar el procesamiento (600x400 parece adecuado).
- Aplicar grayscale, y binarizar la imagen.
- Localizar y decodificar los marcadores QR en la imagen (ZBar)
- Para cada marcador.
- Enmarcarlo en la imagen
- Calcular su centro
- Decodificarlo, y usar el valor para obtener el modelo adecuado del diccionario
- Mostrarlo en el centro del marcador correspondiente
- Rotarlo para mostrar una animación 3D.
El diccionario es usado de referencia para poder relacionar los modelos 3D a los marcadores decodificados. Entonces si tenemos un diccionario como el siguiente:
{
"modelo1" : "modelo1.obj",
"modelo2 : "modelo2.obj"
...
}
Entonces lo que se tiene es una relación marcador => objeto tridimensional.
Teniendo el diccionario de referencias, se recorre el video frame por frame, aplicando procesamiento de imágenes básico a las mismas como:
Lo siguiente, se pasa esta imagen a ZBar para localizar y decodificar todos los marcadores en la imagen.
Estos se enmarcan con un rectángulo rojo, se calcula su centro y sobre el se coloca el modelo correspondiente. El resultado es el siguiente:
El código está disponible en el repositorio: