Cámara estéreo 3D sincronizada (genlocked) de fotogramas de bajo coste

Estoy tratando de capturar video estéreo con 2 cámaras web USB Microsoft LifeCam Studio. Hasta ahora, el mejor enfoque que he encontrado es mi propia herramienta escrita con OpenCV para capturar secuencias de video de las cámaras en Ubuntu 14.04. Estoy usando un código VideoCapture muy simple ( fuente aquí ) y estoy tratando de ver al menos dos videos que están sincronizados entre sí.

Utilicé aplicaciones de cronómetro de Android ( UltraChron Stopwatch Lite y Stopwatch Timer ) en mi Samsung Galaxy S3 mini para darme cuenta de que las imágenes que veía no estaban sincronizadas (muestran una hora diferente en el cronómetro).

Los cuadros se sincronizan tal vez en el 50% del tiempo. Las diferencias de tiempo de cuadro que obtengo son de 0 a aproximadamente 300 ms con un promedio de aproximadamente 120 ms. Parece que la cantidad de tiempo de espera utilizado tiene muy poco efecto en la sincronización (lo mismo para 1000ms o 2000ms). Ejecuto FullHD pero bajar la resolución a 640x480 no tuvo ningún efecto.

Estoy tratando de grabar video estéreo con una configuración de bajo costo. Un resultado ideal sería una transmisión de video estéreo 100% sincronizada que tenga alrededor de 10 FPS. ¿Hay algún enfoque alternativo que resulte en una mejor sincronización?

EDITAR : en mi búsqueda de hardware de bajo costo, descubrí que probablemente sea posible piratear hardware básico ( enlace aquí ) e inyectar una sola señal de reloj en varios módulos de cámara simultáneamente para obtener la sincronización deseada. El tipo que hizo eso parece haber desarrollado su placa de cámara GENLOCK (llamada NerdCam1) e incluso una placa de cámara estéreo sincronizada que ahora vende por unos 200 €.

Sin embargo, tengo una habilidad casi nula para piratear hardware. Además, no estoy seguro de si dicha inyección de reloj es posible para resoluciones superiores al estándar NTSC/PAL (¿ya que parece ser una solución "analógica"?). Además, preferiría una opción de línea de base variable donde ambas cámaras no estarían soldadas en una sola placa.

También encontré esta publicación relacionada: Solución económica para disparar con múltiples (> 2) cámaras sincronizadas (¿genlock o LANC?)

Traté de minimizar el tiempo de espera de la tecla de espera (usando 1 ms para que el ciclo funcionara) y verifiqué cada iteración número 100 del ciclo para guardar el par fijo. Todavía recibo a veces un retraso de hasta 12 ms desde la primera cámara hasta la segunda... Supongo que necesito un cronómetro mejor, ya que a menudo no se pueden leer en los fotogramas mientras se vuelven a dibujar los números (o mis tiempos de obturación son demasiado largos).
Hubo un poco de discusión sobre esta pregunta entre los moderadores y acordamos mantenerla cerrada, aunque esencialmente la pregunta no está fuera de tema, pero su enfoque está muy centrado en la visión por computadora. Preguntar acerca de cómo hacer un video estéreo sincronizado es totalmente pertinente aquí, solo tiene que hacer la pregunta un poco más general. Si edita la pregunta para reflejar eso, con gusto la volveré a abrir. De lo contrario, si definitivamente necesita un enfoque programático con cámaras web, la pregunta podría ser más adecuada para SO.
Volví a redactar la pregunta para omitir el tema del CV. Me encantaría que esto se reabriera. Siéntase libre de editar la pregunta para obtener el tema de video deseado.
Eliminé algunas de las partes pesadas del código, agregué una conclusión a la pregunta, abrí la pregunta para soluciones de cámara diferentes a las cámaras web y volví a abrir. El hecho de que se concentrara en las cámaras web, la codificación en OpenCV y la visualización en vivo de sus cámaras lo hizo bastante inutilizable para cualquier otra cosa relacionada con la producción de video, excepto la visión por computadora (que no es el tema aquí sino en SO) ¿Eso todavía refleja su pregunta?
Gracias por una edición. Sí, solo necesito grabar video estéreo sincronizado, ese es el objetivo principal.
Cambié el requisito de "X FPS" a un "10 FPS" más concreto.

Respuestas (1)

Probablemente no logrará un resultado 100% perfecto con su configuración. Que los hayas sincronizado con una precisión de 1FPS es bastante sorprendente en realidad.

Las configuraciones estéreo profesionales utilizan el bloqueo de fotogramas en el hardware para garantizar que las cámaras graben en perfecta sincronización. Esto no es posible con cámaras web ordinarias. Si corrige el video grabado en la publicación, puede obtener una precisión de menos de 1/Grabación de FPS de un segundo, lo que puede ser suficiente dependiendo de su velocidad de fotogramas. Cuanto mayor sea su velocidad de fotogramas, menor será el desplazamiento.

Si las cámaras web ofrecen algún tipo de API de bajo nivel, es posible que pueda mejorar aún más los resultados, pero dudo que esté disponible, eso es algo que generalmente solo obtiene en cámaras industriales (bastante caras).

Editar: con respecto a su edición, Genlocking es el camino a seguir con casi cualquier aplicación de video si necesita una sincronización del 100% (o lo más cerca posible de eso, siempre tendrá un retraso de nano/microsegundo entre fotogramas).

Ya sea sincronizando videos que se muestran en una pared de pantallas (todas estas pantallas individuales deben mostrar la parte correcta del cuadro al mismo tiempo). O grabando con varias cámaras el mismo cuadro al mismo tiempo. La resolución no es un factor aquí.

Aunque el precio definitivamente lo es. ¿Tiene un presupuesto para este proyecto o es solo para propósitos de hobby? Definitivamente, hay cámaras (que no son de cine) que admitirían esto, aunque no son exactamente baratas como una cámara web. La solución más barata que se me ocurre es usar GoPro Stereo Rig. http://gopro.com/camera-accessories/dual-hero-system Esto le daría un presupuesto de 1000 $ en total (menos unos pocos centavos). No es exactamente barato, pero definitivamente asequible.

Y la GoPro también es una solución muy flexible. Puede disparar desde 3840x2160@15FPS hasta 848x480@240FPS. También es compatible con la salida HDMI sin procesar, lo que puede ser útil si se desea precisión de color o monitoreo en vivo de su sesión.

Una desventaja es que la GoPro tiene una lente de ojo de pez. Puede reducir la distorsión configurando el modo de visualización de la cámara en estrecho y utilizando este ingenioso truco de software , pero no se deshará por completo de él a menos que reemplace la lente .

Edición 2: si va a "construir su propia ruta electrónica", debería echar un vistazo al proyecto ArduCam. Es esencialmente un escudo para las populares placas Arduino. Te permite conectar varios módulos cmos como el OV5642 que es un sensor de 5MP que también se usa en el módulo de cámara Raspberry Pi.

De acuerdo con este hilo en el foro de RaspberryPi, estos módulos admiten genlocking. Si bien no es posible con los pines rotos en el módulo PiCam (aunque hay algunas ideas sobre cómo hacer genlocking con él en la última página), puede pedir estos módulos a un precio económico (25 $) en eBay y usarlos con la placa ArduCam. . Incluso si no conecta los módulos al mismo oscilador para hacer genlocking, debería obtener algunos resultados bastante buenos ya que trabaja bastante cerca del metal aquí, también la plataforma Arduino es muy fácil de usar.

Con una configuración de este tipo, podrías hacer un equipo 3D estéreo de 1080p por alrededor de 125 $. 50$ por los módulos cmosm, ~16$ por 2 clones de Arduino Uno y 60$ por 2 escudos ArduCam.

Edité mi pregunta agregando algunas posibilidades de piratería de hardware en caso de que esté interesado en responder.
@Kozuch: edité mi respuesta
Gracias por la elaboración :). Tengo algo de presupuesto (digamos miles de dólares) pero estoy tratando de desarrollar soluciones económicas para un posible proyecto comunitario. El GoPro Stereo es muy interesante debido a un hardware muy básico. Supongo que la carcasa no es necesaria, solo necesita conectar 2 HERO3 + BE con un cable de sincronización (¿propietario?) Aunque algo más barato todavía estaría bien. Probablemente necesito ingresar a la piratería / desarrollo de HW porque NerdCam1 es lo que realmente necesito (aunque probablemente no tenga esquemas de PCB abiertos) ... Pero NerdCam1 parece tener una resolución muy mala, necesito al menos 1 Mpix nítido.
Si desea seguir la ruta de la electrónica hecha a sí misma (en realidad, no es tan difícil como podría pensarse), agregué información útil.
Gracias por una gran edición. ¿Tengo razón en que la solución Arduino guardará videos o imágenes fijas en perfecta sincronización cuando se alimenta con la misma señal de reloj externa y ext. activado a través de GPIO? ¿Dónde alimentaré la señal del reloj en el módulo CMOS? ¿Qué HW necesito para ello o puedo obtenerlo de las propias placas Arduino? La aplicación será un escáner de carretera/terreno estéreo móvil desde un automóvil de pasajeros que se mueve hasta decir 100 km/h, por lo que otro problema podría ser el obturador rodante, pero entiendo que no obtendré el obturador global a bajo precio. Espero que el tiempo de exposición sea lo suficientemente corto para minimizar esto o simplemente reducir la velocidad del vehículo. Voy a ...
Continuación: también necesito fusionar los datos del sensor GPS/IMU dentro de alguna sincronización en la transmisión de imagen/video para hacer correcciones de odometría visual; ahí viene mi idea inicial de hacer todo esto en C++. Posteriormente se debe utilizar GPS de nivel DGPS/RTK. El GPS ordinario solo tendrá 10 Hz de todos modos, pero eso debería ser suficiente al principio. ¿Podría guardar los datos del GPS en algún lugar sincronizado junto con el flujo de imágenes con Arduino? El tutorial de Arduino GPS no parece muy difícil. Es probable que esto del GPS esté fuera de tema aquí. ¿Tiene alguna sugerencia sobre un mejor lugar para preguntar? Lucho por estar fuera de tema en todo SE.
Si tiene un vehículo que se mueve rápido, realmente recomendaría una GoPro a altas velocidades de cuadro. Con respecto a "guardará videos o imágenes fijas en perfecta sincronización cuando se alimenta con la misma señal de reloj externa y se activa externamente a través de GPIO", sí, con respecto a la cosa GPS / IMU, no es un problema con Arduino, en realidad es bastante fácil. Los protectores guardarán el video en la tarjeta SD, donde también puede guardar los datos de su sensor). Aunque con respecto a todas estas preguntas electrónicas, recomiendo ir a electronics.stackexchange.com . Es exactamente para este tipo de preguntas.
Es posible que desee publicar un enlace al hilo EE si pregunta cómo hacer el genlocking en estos tableros.
Gracias por su gran ayuda hasta ahora. Solo una pregunta secundaria: la sincronización estéreo GoPro solo funciona con unidades Black Edition, ¿verdad? Esto está elevando el costo porque no necesito FPS muy altos ni alta resolución. Estoy bien con 10 FPS y 1-2 Mpix. ¿También la fusión de GPS/IMU con GoPro sería un desafío? Probaré la severidad de la persiana enrollable con la esperanza de que no sea tan mala. Finalmente, continúo el viaje en EE con la siguiente publicación de HW: electronics.stackexchange.com/questions/124596/…
Otra pregunta más sobre la compatibilidad de la cámara GoPro DUAL System: video.stackexchange.com/questions/12346/…
De acuerdo con esta respuesta electronics.stackexchange.com/a/124628/29812 y este blog vanceance.blogspot.co.at/2014/02/arducam.html , parece que ArduCam solo podría tomar fotografías con una diferencia de 10 segundos (0.1 FPS) y tampoco tiene función de captura de video.
Supongo que me engañaron todos estos videos de lapsos de tiempo y la función de video en vivo de algunas de las variantes del escudo. Entonces supongo que su otra opción sería hacer exactamente lo mismo con PiCam y 2 Raspberry Pi como se sugiere en la última página del hilo, en teoría debería funcionar dando a ambos módulos pi cam la misma fuente de reloj. No lo han probado, pero creo que vale la pena intentarlo, esa solución sumaría un total de 130 $ o 120 $ si elige el módulo de cámara infrarroja (que podría ser más adecuado para la visión por computadora dependiendo de su entorno)
Hay una pregunta de seguimiento sobre la sincronización de fotogramas de la cámara estéreo Raspberry Pi: raspberrypi.stackexchange.com/questions/22696/…
Es posible que desee enviar la pregunta a EE también. El RPi SE es excelente, pero más sobre las cosas más básicas que puede hacer con el Pi y más centrado en el software, no estoy seguro de que obtenga una buena respuesta allí.
Nueva tarea: necesito hacer mi procesamiento de visión artificial en vivo y no en posprocesamiento. Necesito la señal de video en una máquina fuerte x86. Veo dos opciones para esto: 1: captura HDMI. Alimente HDMI desde RPi, CHDK/SDM (¡StereoData Maker 1.86 puede hacer sincronización de video!) o GoPro a la tarjeta PCI-E de captura HDMI (Blackmagic Design tiene algunos, aunque obtener entrada estéreo es cuestionable). Es de esperar que se pueda acceder a los datos en C+. 2: Dispositivo USB estéreo personalizado (dos cámaras en un solo cable USB): diseño y ensamblaje de hardware resistente, PCB personalizado para 2 módulos CMOS + controlador USB necesario (= caro). ¿Podrías comentar las ideas?