Cámara Raspberry Pi: ¿cuándo está lista para el próximo fotograma?

8

Cuando utiliza apis como la api C ++ o raspicam , sondea la cámara con un método grab () o similar. Cuando un marco está listo, el método regresa. ¿Hay alguna forma de verificar si la cámara está lista sin agarrar el marco?

Esta puede ser una herramienta de línea de comandos, una llamada de C ++, una biblioteca de Python, literalmente cualquier método.

Pregunto porque tengo 4 pis de frambuesa con 4 cámaras y quiero tomar video cuadro por cuadro con cada cuadro exactamente en el mismo momento. Las cámaras no son lo suficientemente rápidas para que mi aplicación lo haga de otra manera.

usuario2290362
fuente

Respuestas:

2

Creo que es mejor responder a esta pregunta dando una idea de cómo funcionan las cosas un poco más abajo. Sin embargo, primero una advertencia: no soy un experto en firmware por ningún tramo de la imaginación; mi comprensión bastante aproximada de cómo funciona el módulo de cámara Pi se basa en mi experiencia de escribir la biblioteca picamera e interactuar con los desarrolladores de firmware mucho más conocedores en los foros de Pi. Si escuchas información contradictoria de los desarrolladores de firmware, ¡ellos son la autoridad en esto, no yo! Con eso fuera del camino ...

Tan pronto como se inicializa el módulo de cámara de Pi, está capturando fotogramas. Estos marcos son (en lo que respecta al usuario final) arrojados, pero dentro del firmware de la cámara hay mucho más en juego. Los cuadros se miden para determinar la ganancia que se aplicará al sensor (AGC), el balance de blancos para alimentar el algoritmo de corrección AWB, etc. Por ejemplo, si enciende la cámara e inmediatamente comienza a grabar, normalmente verá el el balance de blancos se corrige solo durante los primeros fotogramas de la grabación:

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    camera.start_recording('video1.h264')
    time.sleep(5)
    camera.stop_recording()

Sin embargo, si coloca un retraso antes de comenzar a grabar, verá que el balance de blancos es estable para cuando comience la grabación:

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    time.sleep(5)
    camera.start_recording('video2.h264')
    time.sleep(5)
    camera.stop_recording()

Entonces, dado que la cámara siempre está capturando fotogramas, incluso cuando no estamos capturando imágenes o grabando videos, ¿qué sucede realmente cuando elegimos capturar una imagen? Le decimos al firmware que active la captura, y el firmware espera a que se complete el siguiente fotograma antes de pasárnoslo (en realidad, si está capturando imágenes desde el puerto fijo en lugar del puerto de video, hay muchas más cosas que incluyen cambia de modo, pero le preocupa el puerto de video, así que ignoremos eso).

Considere lo que esto significa para la sincronización (su caso de uso particular). La cámara no está "lista" para capturar un cuadro en ningún punto en particular. Ya está capturando un marco y cuando solicite uno, le entregará el siguiente completo que esté disponible. Para sincronizar los marcos de las cámaras, todas las cámaras tendrían que inicializarse exactamente al mismo tiempo, y luego sus relojes internos tendrían que funcionar exactamente en sincronía (las cámaras tienen su propio reloj interno; no confían en el El reloj de Pi).

Lamentablemente, no creo que esto sea realmente una perspectiva realista. Si no recuerdo mal, el módulo de cómputo Pi (que tiene 2 puertos de cámara integrados y admite 2 módulos de cámara simultáneamente) usa algunas llamadas especiales en el firmware para que los 2 módulos usen una señal de reloj única (no tengo idea de cómo funciona) funciona a nivel de hardware pero supongo que está usando algo específico para el módulo de cómputo); No puedo imaginar cómo harías algo similar en 4 Pis.

Actualizar:

Debo agregar que es posible realizar una sincronización aproximada con algunos conocimientos de red razonables (por ejemplo, paquetes de difusión UDP). En otras palabras, es posible obtener todos los Pi en una red para activar una captura dentro de un milisegundo uno del otro (suponiendo una red decente de baja latencia como Ethernet), pero como se describió anteriormente, eso todavía no garantizará que todas las cámaras realmente capturar un cuadro al mismo tiempo; habrá un retraso de hasta un cuadro (más la latencia de red) entre los tiempos de inicio de las capturas resultantes.

Si ese nivel de sincronización es suficiente para las personas, es posible que quieran consultar el proyecto compuestopi, que es otro proyecto que escribí sobre picamera para este propósito.

Dave Jones
fuente
¿Puede hablar sobre la "sincronización de fotogramas" de varias cámaras en el modo de imagen fija (no video). Supongo que el sensor puede estar funcionando nuevamente en un modo de "funcionamiento libre" incluso para imágenes fijas, solo con resolución completa y FPS más bajo (¿tal vez 15 FPS? Que darían retrasos de fotogramas más largos que el video de 30 FPS). ¿Eres capaz de confirmar esta suposición? Estoy interesado en la solución C ++ ya que Python solo agrega un nivel de incertidumbre de tiempo además de eso ...
Kozuch
En los años intermedios he aprendido bastante más y probablemente debería actualizar esta respuesta en algún momento. Para empezar, la afirmación de que hay sincronización en las cámaras duales del módulo de cómputo es incorrecta: no es así, solo se iniciaron sincrónicamente y eventualmente (durante varias horas) se separarán. En imágenes fijas, la cámara está transmitiendo fotogramas hasta la captura, pero luego cambia de modo al modo de sensor 2 o 3 (dependiendo de la velocidad de fotogramas) durante la captura.
Dave Jones
He estado escribiendo una versión ampliada del capítulo de hardware de la cámara para la próxima versión de picamera basada en los comentarios de los desarrolladores de firmware de la cámara; podría valer la pena leerlo (aunque aún no está completo) ya que cubre algunos de estos detalles.
Dave Jones
Sus documentos son una lectura bastante extensa, pero no tengo los recursos para profundizar en ellos ahora, solo hice una lectura rápida. Veo que hay modos de video y fijos (puerto fijo). Sabemos sobre el puerto de video (sensor de funcionamiento libre), pero ¿puede explicar qué significa todavía el puerto y cómo funciona? ¿Se puede usar de alguna manera para un disparo más preciso (menos retraso del obturador) que el puerto de video? Me preguntó raspicam C ++ desarrolladores para el mismo tema, pero no tengo respuesta todavía.
Kozuch
No: el puerto fijo es solo un artefacto MMAL que hace que una tubería de imágenes diferente en la GPU produzca una salida fija "mejor". Por lo tanto, cuando se usa el puerto fijo para capturar, el modo del sensor se cambia temporalmente, se usa un algoritmo de eliminación de ruido más fuerte, etc. No le dará ninguna diferencia en el retraso del obturador (el interruptor de modo probablemente lo complicará en todo caso).
Dave Jones