Una fotografía/vídeo estereoscópica es aquella técnica que permite reproducir la sensación de relieve y volumen de los objetos en quien contempla la imagen. La técnica básicamente consiste en hacer llegar a cada ojo del espectador dos imágenes ligeramente diferentes de tal manera que al procesarlas el cerebro recree la sensación de profundidad de la escena original.
Para conseguir esto hay multitud de técnicas más o menos exitosas, desde un simple GIF animado realizado con una sola cámara que muestra alternativamente el ojo izquierdo/derecho, hasta modernas técnicas cinematográficas de imagen a todo color, a gran resolución de imágenes perfectamente visibles con gafas especiales o sin ellas.
La técnica más primitiva consistiría por tanto en grabar dos imágenes al mismo tiempo y proyectarlas en paralelo para hacer llegar mediante un dispositivo a cada ojo la imagen que le corresponde. Sin embargo hacer llegar dos imágenes con calidad fotográfica y diferentes a cada ojo no es fácil (ni barato si se aspira a cierta calidad). Con el abaratamiento de la electrónica los cascos de realidad virtual se han vuelto razonablemente accesibles en los últimos años, pero aún siguen siendo raros y poca gente dispone de ellos habitualmente, pero lo que sí tiene mucha gente hoy en día es un smartphone, y aquí es donde entra el ingenio de algún ingeniero de Google ¿porqué no usar la pantalla del teléfono móvil y transformarla en un casco de realidad virtual? solo hace falta un poco de cartón, dos lentes y una tijeras y ya tenemos unas Google Cardboard

.

Las Google Cardboard son básicamente un recortable de cartón dentro del cual instalamos el teléfono móvil que proyecta un vídeo partido en dos frames, uno para cada ojo (además de un ingenioso sistema de imán para transmitir «clicks» ar una aplicación en nuestro Android). Google distribuye los susodichos planos/instrucciones para construir tu propio casco de realidad virtual en casa y en Ebay las podéis comprar por 3-4 euros. Una vez tenemos nuestro casco de realidad virtual ya solo falta generar nuestro vídeo estereoscópico para el casco.

Vídeo estereoscópico

Como ya he contado muchas veces tengo en casa varias cámaras tipo CCTV. Desde que conseguí mis Google Cardboard llevo queriendo experimentar a juntar dos de estas cámaras y producir mis propias películas 3D caseras, y eso es lo que hice estos días pasados.
La conexión del hardware no tiene más truco, se cogen dos cámaras conectadas al ordenador con idéntico objetivo (6 mm en mi caso) se sitúan en paralelo (teóricamente con una separación de 63 mm entre el centro de ambos objetivos, que es la separación media entre pupilas) y se graban dos vídeos al mismo tiempo de todo lo que se quiera.

Grabadora estereoscópicaGrabadora estereoscópica

Problemas de calidad

La calidad de estas cámaras no es para tirar cohetes como os podéis imaginar, dan para un vídeo de 640×480 px y poco más. No lo que no me esperaba es que dos cámaras idénticas con idéntico objetivo y ubicadas en el mismo sitio dieran imágenes tan sorprendentemente distintas, no ya en nitidez/saturación/contraste (estos miniobjetivos si se les aprieta mucho la rosca del enfoque podemos hacer saltar hacer saltar las lentes por los aires con mucha facilidad. Ya he tenido que montar los cristalitos de algunos de estos objetivos varias veces.)… sino pura y simplemente en encuadre. Me explico: si situamos las dos cámaras una al lado de otra y grabamos a una persona a 2 metros con un encuadre tipo busto/retrato, si la cámara A la encuadra bien, la cámara B la encuadra de los ojos para abajo.

Salida de vídeo a distintas alturasSalida de vídeo a distintas alturas

Esto es, como si una de las cámaras tuviera un ligero cabeceo hacia abajo y viera una porción de espacio por debajo de lo que veía la otra. Deduje que esto es muy probablemente producido por ligeras variaciones en la posición del sensor y en el cono de luz que proyecta el objetivo. Una variación de 1-2 mm produce un desplazamiento enorme en la imagen capturada (y no vale con «levantar» ó «agachar» algunas de las cámaras porque al cambiar la altura del centro del objetivo se produce un cambio en las perspectiva/paralelaje que desbarata cualquier intento de 3d).
Estuve probando diversas cámaras pero el resultado era siempre el mismo, no tengo dos cámaras que situadas de forma contigua graben lo mismo a la misma altura.

Después de diversas pruebas, incluida el intento de reajustas la posición del sensor interno de las cámaras opté por un solución salomónica: recortar la salida de ambas cámaras al área compartida por ambas, de tal manera que el fotograma válido por ambas cámaras pasaba de 640×480 a 640×332, se desechaba una franja de 148 en ambas cámaras, en una por arriba y la otra por abajo. Bueno, siempre me han gustado las panorámicas.

Software FFMPEG

Para la grabación y composición de la panorámica de vídeos he usado ffmpeg, un potente editor/conversor de vídeo en linea de comandos pero que ha traído otro pequeño problema: al tomar dos dispositivos y codificarlos a mp4 para producir la composición final producía un ligerísimo retardo (apenas 4-5 frames) en uno de los vídeos de manera que cualquier movimiento en la imagen se producía un poco antes en el ojo izquierdo que en el derecho. Aunque era un retardo muy pequeño, había que fijarse mucho para descubrirlo pero en cambio producía un efecto muy incomodo de falta de sincronía. Nada especialmente grabe que no se pudiera arreglar con la opción itsoffset desde el propio FFMPEG.

Estas son algunos de las líneas de comandos ffmpeg utilizadas para producir el vídeo estereoscópico:

Comando básico para reproducir un dispositivo conectado a la capturadora del ordenador
ffplay -s 640x480 -f v4l2 /device/video4

Capturar, componer y mostrar en tiempo real dos dispositivos de vídeo
ffmpeg -s 640x480 -f v4l2 -i /dev/video4 -s 640x480 -f v4l2 -i /dev/video8 -filter_complex "[0]pad=iw*2:ih[a];[a]overlay=w" -b 2200k -f mpegts - | ffplay -

Retardar ligeramente el «ojo derecho»
ffmpeg -s 640x480 -f v4l2 -i /dev/video4 -s 640x480 -f v4l2 -itsoffset 0:0:00.08 -i /dev/video8 -filter_complex "[0]pad=iw*2:ih[a];[a]overlay=w" -b 2200k -f mpegts - | ffplay -

Recortar (crop) fotogramas, corregir luminancia en ojo derecho y guardar a mp4
ffmpeg -y -s 640x480 -f v4l2 -i /dev/video4 -s 640x480 -f v4l2 -itsoffset 0:0:00.08 -i /dev/video8 -filter_complex "[0]crop=640:340:0:140[a];[1]mp=eq2=0.8:1:0:2[b];[a]pad=iw*2:ih[a];[a][b]overlay=w" video_final.mp4

Todavía quiero hacer algunas pruebas, desplazando cámaras cambiando objetivos, etc.. pero ya se puede ver algo. Si tenéis las Google Cardboard o similar podéis ver el vídeo en grande en esta dirección.