Sincronización/genlock de fotogramas de cámara estéreo Raspberry Pi (video o imagen fija)

Necesito sincronizar cuadros de una cámara estéreo para una aplicación de visión artificial. La sincronización debería ser la mejor posible, con suerte en un nivel de milisegundos. Me gustaría obtener alrededor de 10 FPS, ya sea como video o imágenes fijas. El requisito de resolución es de alrededor de 2 Mpix.

La aplicación será un escáner de carretera/terreno estéreo móvil desde un automóvil de pasajeros que se mueva a una velocidad de hasta 100 km/h durante el día (por lo tanto, en buenas condiciones de iluminación). El obturador rodante no debería ser un problema con la cámara Pi en FullHD según este y este video .

Mi búsqueda de hardware actual terminó con una solución Raspberry Pi. Creo que básicamente tengo 2 opciones con él:

  1. Obtenga dos unidades Raspberry Pi independientes, cada una con una cámara. Sincronícelos a través de un disparador GPIO externo. El costo es 2x25+2x16 = £82.

  2. Obtenga el nuevo kit de desarrollo del módulo de cómputo y conecte ambas cámaras a la placa única. Acople las dos cámaras para un lanzamiento simultáneo con software. El costo es 126+16+16 = £158.

¿Tendrán ambas opciones resultados de sincronización similares? También preferiría la salida de imágenes fijas que la salida de video, porque de todos modos necesitaré extraer fotogramas dados del video. Es preferible que las imágenes fijas no estén comprimidas para no perder detalles de la imagen, pero JPEG también está bien. No estoy seguro de cuántos FPS puede hacer el disparador externo GPIO con imágenes fijas.

El costo es un factor importante para mí. El uso de cámaras web USB probablemente no funcione, ya que los dispositivos USB no se pueden sincronizar fácilmente (consulte el enlace a continuación). Estaré feliz con otra recomendación de hardware si alguien conoce cosas mejores dentro de un rango de precio similar.

El origen de esta pregunta está en el sitio de Video Production SE en una publicación titulada Creación de videos estéreo sincronizados con 2 cámaras a bajo costo . Este enlace puede revelar algunos antecedentes más.

¿Quieres usar una cámara Raspberry Pi o alguna cámara web USB?
¿Qué tan alta resolución necesitas? ¿Qué condiciones de luz?
Agregué más información a la pregunta de acuerdo con lo que solicita. Planeo usar la cámara Pi, no las cámaras web USB (el USB no se puede sincronizar).
AFAIK, para cámaras como OV5640, no hay una forma claramente documentada de sincronizar cuadros en Linux a nivel de cuadro único en modo de video. Es posible que tenga más suerte con las imágenes fijas, pero aún está limitado por el diseño de linux que no es en tiempo real.
Se hizo una pregunta similar en Raspberry Pi SE .

Respuestas (2)

Creo que sus dos opciones/ideas (Pi y Compute) pueden funcionar.

Raspberry Pi GPIO es lo suficientemente rápido (10 MHz+), leer el estado de entrada de GPIO cada milisegundo no será ningún problema.

Si desea procesar datos en Raspberry Pi con OpenCV o algo así, no espere demasiado, la CPU Pi no es tan rápida como algunas personas piensan. Haga algunos experimentos con videos o imágenes pregrabados y vea cuánta potencia informática tiene.

Si encuentra que Raspberry no es lo suficientemente rápido, puede usar algo como esto (para el procesamiento de imágenes):

Kit de desarrollo Nvidia Jetson TK1

- NVIDIA Kepler GPU with 192 CUDA cores
- NVIDIA 4-Plus-1 quad-core ARM Cortex-A15 CPU
- 2 GB memory, 16 GB eMMC
- Gigabit Ethernet, USB 3.0, SD/MMC, miniPCIe
- HDMI 1.4, SATA, Line out/Mic in, RS232 serial port
- Expansion ports for additional display, GPIOs, and high-bandwidth camera interface

No sé mucho sobre esto, solo leí en alguna parte sobre estos productos Nvidia, pero cuestan menos que el módulo Pi Compute (¿192 USD son 115 GBP?), Y hay mucho más poder de cómputo.

¡Muchas gracias por tu respuesta! No planeo ningún procesamiento de CV en el Pi. Solo necesito grabar el video en sincronización de cuadros y haré el resto del trabajo en la PC. ¿No sabe si puede haber otra placa en el mercado que pueda tener 2 interfaces CSI (u otras interfaces de cámara pero no una cámara USB) y sea más barata que el kit de módulo de cómputo y pueda hacer el mismo trabajo?
¿Ha comprobado el tiempo que tarda el módulo de la cámara PI en tomar una foto y cuánta desviación hay en ese tiempo? Creo que podría tener problemas con la precisión de nivel de ms, no por el mecanismo de activación a través de GPIO, sino por los retrasos entre el disparo y la toma de la foto. Además, en un día nublado, una velocidad de obturación de 10 ms (1/100) no es desconocida.
@Kozuch Creo que Compute Module Kit es el dispositivo más barato con dos interfaces CSI.
@RJR No he probado el tiempo de respuesta de la cámara Pi, no tengo uno. Estaba usando una cámara Logitech USB barata para mi proyecto de CV.
@RJR: No me importa un retraso entre el disparo y la toma de la foto, dado que será exactamente el mismo para ambas unidades Pi. Por supuesto, una demora prolongada no sería agradable, pero nuevamente mi objetivo principal es la sincronización de fotogramas. Supongo que ambas unidades deberían comportarse exactamente igual en caso de que haga una instalación y configuración 100% iguales.
@Kozuch: el problema es que la latencia de activación puede no ser determinante, porque Linux puede estar haciendo otra cosa en segundo plano. Linux no es un sistema operativo en tiempo real. Puede salirse con la suya con lo que quiere, pero cualquier comportamiento en tiempo real será bastante frágil y es probable que se rompa si carga el sistema.
@ConnorWolf: ¿Mi opción n.º 2 (usar el módulo de cómputo con 2 cámaras) eliminaría los posibles problemas con la latencia del disparador, ya que emplearía un disparador SW que en realidad podría ser de un nivel más bajo que el disparador GPIO?
@Kozuch: no lo creo, aunque probablemente sería un poco mejor. El problema es el delta entre cuándo desea tomar la imagen y cuándo el hardware realmente toma la imagen. Si Linux está dando servicio a otro subproceso, debe esperar al siguiente cambio de contexto para que su subproceso haga algo.
@ConnorWolf: La captura de imagen/video será la única tarea en la configuración de mi Pi y no habrá otra carga. Las unidades se desconectarán de todos los COM (Ethernet, etc.). Sin embargo, debo estar de acuerdo con usted en un nivel teórico con RTOS. Pero RTOS con cámara estéreo tiene un nivel de precio totalmente diferente, ¿verdad? La pregunta es cuánto de la capacidad RTOS podrá ofrecer una instalación limpia de Raspbian. Simplemente, si obtengo la sincronización en unos pocos ms (por ejemplo, menos de 10 ms), este sigue siendo un gran resultado para mí en este rango de precios.
@Kozuch: si está disparando durante 10 ms, en lugar de 1 ms, creo que es mucho más manejable. Realmente, /probablemente/ funcionará, solo quiero asegurarme de que esté al tanto de las posibles complicaciones en el futuro, especialmente si más adelante decide comenzar a agregar otras tareas al rPi en ejecución.
Realmente, ejecutar un RTOS no significa que costará nada más, teóricamente podría incluso hacerlo bien en el rPi (ejecutar sin sistema operativo). El problema es principalmente la falta de documentación.
Probablemente no sea tan malo con una latencia de un kernel Raspbian predeterminado: emlid.com/raspberry-pi-real-time-kernel-disponible-for-download Supongo que esto puede considerarse un tiempo real suave y se adapta más a mis necesidades entonces suficiente (considerando la precisión de 1 ms)? Los valores medios son casi los mismos.

Después de mucha investigación e incluso de mí mismo tratando de configurar 2 RPis con una cámara cada uno para una captura estéreo sincronizada con cuadros, realmente no llegué hasta el final para medir con precisión la sincronización visual, pero me di cuenta de esto en ese momento a partir de varias discusiones y tecnología. especificaciones:

Aunque es posible sincronizar las propias placas RPi a través de una señal GPIO común (para cualquier tarea), no es posible sincronizar sus cámaras para una captura estéreo continua. La razón principal es que los sensores y las placas de la cámara no admiten la funcionalidad de activación externa (ni la placa de cámara v1 OmniVision OV5647 ni la v2 Sony IMX219PQ). El OV5647 en realidad tiene un pin de entrada llamado FREX que podría usarse para la sincronización de cuadros, pero no se enruta del sensor a la placa ni es compatible con el controlador/software oficial de la cámara RPi. La placa ArduCam tiene un pinout FREX integrado pero aún no tiene software para usarlo.

Sin embargo, es posible sincronizar una sola toma (sin estéreo continuo). Supongo que había un proyecto para una fotografía en tiempo de bala . Exploré su código python en github .(no recuerdo el nombre exacto del proyecto ahora): sincronizaron RPis a través de Ethernet y luego llamaron a raspistill binary sincrónicamente para una sola toma. Creo que esto puede funcionar incluso si hubo un retraso de 1000 ms al comienzo de raspistill para permitir que las cámaras establezcan la exposición (el tiempo de espera es el mismo en todas las cámaras, por lo que la sincronización debería funcionar). Sin embargo, creo que diferentes tiempos de exposición pueden ser un problema con PiFace. Una vez que se inicia raspistill (y con suerte después del primer cuadro), el sensor ingresa al llamado "modo de ejecución libre" donde el video se transmite desde el sensor a FPS dado. Debido a que cada placa de cámara tiene su propio oscilador, el FPS nunca será 100% igual para dos placas, incluso si se inician al mismo tiempo, y los cuadros se alejarán entre sí a medida que se extienda el video.

TL;RD:

Si bien es posible sincronizar una sola toma estéreo, no es posible sincronizar fácilmente dos placas de cámara RPi para una captura estéreo continua debido a la falta de una función de activación externa en los sensores de las cámaras.

Otra forma de abordar este problema es activar el reloj de la cámara. Si la cámara que elige depende de una fuente de reloj externa, como la entrada "mclk" al OV5640, entonces puede usar una FPGA o una MCU rápida para sincronizar el reloj hasta que se sincronice el HSYNC/VSYNC de ambas cámaras (usted bloquea la cámara rápida de reloj de referencia durante algunos ciclos para ralentizarlo).
@user3528438 ¿La exposición automática (=varios tiempos de exposición de fotogramas en las cámaras) arruinará la sincronización o existe una regla que establece que el tiempo de exposición no puede superar 1/FPS?
No he leído ninguna hoja de datos de la cámara y el código de firmware tan a fondo para decirte de cualquier manera, pero mi experiencia con ov5640 en este kit de diseño de referencia e-consystems.com/CX3-Reference-Design-Kit.asp confirma que la configuración de FPS anula exposición automática: el video que captura es significativamente más tenue en interiores cuando está en modo 60FPS que en modo 15FPS.