Raspberry Pi Camera - Wann ist sie für das nächste Bild bereit?

8

Wenn Sie APIs wie die C ++ - oder Raspicam- API verwenden, rufen Sie die Kamera mit einer grab () - oder einer ähnlichen Methode ab. Wenn ein Frame fertig ist, gibt die Methode zurück. Gibt es eine Möglichkeit zu überprüfen, ob die Kamera bereit ist, ohne den Rahmen zu greifen?

Dies kann ein Befehlszeilenprogramm, ein C ++ - Aufruf, eine Python-Bibliothek oder buchstäblich jede Methode sein.

Ich frage, weil ich 4 Himbeer-Pis mit 4 Kameras habe und Frame für Frame-Videos mit jedem Frame genau zum gleichen Zeitpunkt aufnehmen möchte. Die Kameras sind nicht schnell genug für meine Anwendung, um es anders zu machen.

user2290362
quelle

Antworten:

2

Ich denke, es ist am besten, diese Frage zu beantworten, indem Sie einen Einblick geben, wie die Dinge etwas weiter unten funktionieren. Zunächst jedoch eine Einschränkung: Ich bin kein Firmware-Experte. Mein ziemlich grobes Verständnis der Funktionsweise des Pi-Kameramoduls basiert auf meiner Erfahrung mit dem Schreiben der Picamera-Bibliothek und der Interaktion mit den viel erfahreneren Firmware-Entwicklern in den Pi-Foren. Wenn Sie widersprüchliche Informationen von den Firmware-Entwicklern hören, sind sie die Autorität dafür, nicht ich! Damit aus dem Weg ...

Sobald das Kameramodul des Pi initialisiert ist, erfasst es Bilder. Diese Frames werden (für den Endbenutzer) ausgegeben, aber in der Firmware der Kamera ist noch viel mehr los. Die Bilder werden gemessen, um die Verstärkung zu bestimmen, die auf den Sensor (AGC) angewendet werden soll, den Weißabgleich, der dem AWB-Korrekturalgorithmus zugeführt werden soll usw. Wenn Sie beispielsweise die Kamera starten und sofort mit der Aufnahme beginnen, sehen Sie normalerweise die Der Weißabgleich korrigiert sich in den ersten Bildern der Aufnahme:

import picamera
import time

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

Wenn Sie jedoch eine Verzögerung festlegen, bevor Sie mit der Aufnahme beginnen, werden Sie feststellen, dass der Weißabgleich zu Beginn der Aufnahme stabil ist:

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()

Was passiert also tatsächlich, wenn wir ein Bild aufnehmen , da die Kamera immer Bilder aufzeichnet, auch wenn wir keine Bilder oder Videos aufnehmen? Wir weisen die Firmware an, die Erfassung zu aktivieren, und die Firmware wartet, bis der nächste Frame abgeschlossen ist, bevor sie ihn an uns zurückgibt (wenn Sie Bilder vom Standbild-Port anstelle des Video-Ports aufnehmen, wird noch viel mehr hinzugefügt Der Modus wechselt, aber Sie beschäftigen sich mit dem Videoanschluss. Lassen Sie uns das ignorieren.

Überlegen Sie, was dies für die Synchronisation bedeutet (Ihr spezieller Anwendungsfall). Die Kamera ist nicht "bereit", ein Bild an einem bestimmten Punkt aufzunehmen. Es erfasst bereits einen Frame und wenn Sie nach einem fragen, erhalten Sie den nächsten vollständigen Frame, der verfügbar wird. Um die Bilder der Kameras zu synchronisieren, müssten alle Kameras genau zur gleichen Zeit initialisiert werden, und dann müssten ihre internen Uhren genau synchron laufen (die Kameras haben ihre eigene interne Uhr; sie verlassen sich nicht auf die Pis Uhr).

Leider denke ich nicht, dass dies wirklich eine realistische Perspektive ist. Wenn ich mich richtig erinnere, verwendet das Pi-Rechenmodul (das 2 Kameraanschlüsse an Bord hat und 2 Kameramodule gleichzeitig unterstützt) einige spezielle Aufrufe in der Firmware, um die 2 Module dazu zu bringen, ein einzelnes Taktsignal zu verwenden (ich habe keine Ahnung, wie dies funktioniert funktioniert auf Hardware-Ebene, aber ich gehe davon aus, dass es etwas verwendet, das für das Rechenmodul spezifisch ist); Ich kann mir nicht vorstellen, wie Sie mit 4 Pis etwas Ähnliches machen würden.

Aktualisieren:

Ich sollte hinzufügen, dass es möglich ist, eine grobe Synchronisation mit einigen vernünftigen Netzwerkkenntnissen (z. B. UDP-Broadcast-Paketen) durchzuführen. Mit anderen Worten, es ist möglich, alle Pi in einem Netzwerk dazu zu bringen, eine Erfassung innerhalb einer Millisekunde voneinander auszulösen (unter der Annahme eines anständigen Netzwerks mit geringer Latenz wie Ethernet), aber wie oben beschrieben, garantiert dies immer noch nicht, dass alle Kameras tatsächlich funktionieren gleichzeitig einen Frame erfassen; Zwischen den Startzeiten der resultierenden Captures liegt eine Verzögerung von bis zu einem Frame (plus Netzwerklatenz).

Wenn diese Synchronisationsstufe für Benutzer ausreicht, sollten sie sich das Compoundpi-Projekt ansehen, ein weiteres Projekt, das ich zu diesem Zweck über Picamera geschrieben habe.

Dave Jones
quelle
Kannst du etwas über die "Frame Sync" für mehrere Kameras im Standbildmodus (kein Video) sagen? Ich denke, der Sensor läuft möglicherweise auch für Standbilder wieder im "Freilauf" -Modus, nur mit voller Auflösung und niedrigerer FPS (vielleicht 15 FPS? Das würde längere Bildverzögerungen als 30 FPS-Video ergeben). Können Sie diese Annahme bestätigen? Ich interessiere mich für eine C ++ - Lösung, da Python darüber hinaus nur ein gewisses Maß an Zeitunsicherheit hinzufügt ...
Kozuch
In den vergangenen Jahren habe ich viel mehr gelernt und sollte diese Antwort wahrscheinlich irgendwann aktualisieren. Für den Anfang ist die Behauptung, dass die beiden Kameras des Computermoduls synchron sind, falsch: Es gibt keine, sie werden nur synchron gestartet und werden schließlich (über mehrere Stunden) auseinander driften. Bei Standbildern überträgt die Kamera Bilder bis zur Aufnahme, wechselt dann jedoch während der Aufnahme in den Modus 2 oder 3 (abhängig von der Bildrate).
Dave Jones
Ich habe eine erweiterte Version des Kapitels zur Kamerahardware für die nächste Picamera-Version geschrieben, die auf dem Feedback der Entwickler der Kamera-Firmware basiert. Es könnte sich lohnen, sie durchzulesen (obwohl sie noch nicht vollständig ist), da sie einige dieser Details abdeckt.
Dave Jones
Ihre Dokumente sind ziemlich umfangreich gelesen, aber ich habe nicht die Ressourcen, um mich jetzt eingehend mit ihnen zu befassen - ich habe nur kurz gelesen. Ich sehe, dass es sowohl Video- als auch Standbildmodi gibt (Standbild). Wir kennen den Video-Port (freilaufender Sensor), aber können Sie erklären, was noch Port bedeutet und wie er funktioniert? Kann es irgendwie für einen genaueren Auslöser (weniger Verschlussverzögerung) dieses Videoanschlusses verwendet werden? Ich habe Raspicam C ++ - Entwickler nach demselben Thema gefragt, habe aber noch keine Antwort.
Kozuch
Nein: Der Standbild-Port ist nur ein MMAL-Artefakt, das bewirkt, dass eine andere Imaging-Pipeline auf der GPU eine "bessere" Standbildausgabe erzeugt. Wenn Sie den Standbild-Port zum Erfassen verwenden, wird der Sensormodus vorübergehend umgeschaltet, ein stärkerer Rauschunterdrückungsalgorithmus wird verwendet usw. Es gibt keinen Unterschied in der Verschlussverzögerung (der Modusschalter wird dies wahrscheinlich komplizieren, wenn überhaupt).
Dave Jones