Appareil photo Raspberry Pi - Quand est-il prêt pour la prochaine image

8

Lorsque vous utilisez des API comme l' API C ++ ou Raspicam , vous interrogez la caméra avec une méthode grab () ou similaire. Lorsqu'un cadre est prêt, la méthode revient. Existe-t-il un moyen de vérifier si l'appareil photo est prêt sans saisir le cadre?

Cela peut être un outil en ligne de commande, un appel C ++, une bibliothèque python, littéralement n'importe quelle méthode.

Je demande parce que j'ai 4 pis framboise avec 4 caméras et que je veux prendre une vidéo image par image avec chaque image au même moment précis. Les caméras ne sont pas assez rapides pour que mon application le fasse autrement.

user2290362
la source

Réponses:

2

Je pense qu'il est préférable de répondre à cette question en donnant un aperçu de la façon dont les choses fonctionnent un peu plus bas. D'abord une mise en garde cependant: je ne suis pas un expert en micrologiciel par aucun effort d'imagination; ma compréhension plutôt approximative du fonctionnement du module de caméra Pi est basée sur mon expérience d'écriture de la bibliothèque picamera et d'interaction avec les développeurs de firmware beaucoup plus compétents sur les forums Pi. Si vous entendez des informations contradictoires de la part des développeurs de micrologiciels, c'est eux qui font autorité, pas moi! Avec cela à l'écart ...

Dès que le module de caméra du Pi est initialisé, il capture des images. Ces images sont (en ce qui concerne l'utilisateur final) vidées mais à l'intérieur du firmware de l'appareil photo, il se passe beaucoup plus. Les images sont mesurées pour déterminer le gain à appliquer au capteur (AGC), la balance des blancs à alimenter à l'algorithme de correction AWB, etc. Par exemple, si vous démarrez l'appareil photo et commencez immédiatement l'enregistrement, vous verrez généralement le la balance des blancs se corrige au cours des premières images de l'enregistrement:

import picamera
import time

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

Cependant, si vous placez un délai avant de commencer l'enregistrement, vous verrez que la balance des blancs est stable au début de l'enregistrement:

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

Donc, étant donné que l'appareil photo capture toujours des images même lorsque nous ne capturons pas d'images ou n'enregistrons pas de vidéos, que se passe-t-il réellement lorsque nous choisissons de capturer une image? Nous demandons au micrologiciel d'activer la capture, et le micrologiciel attend que la prochaine image soit terminée avant de nous la renvoyer (en fait, si vous capturez des images à partir du port fixe au lieu du port vidéo, il y a beaucoup plus qui se passe, y compris commutateurs de mode, mais vous êtes préoccupé par le port vidéo, alors ignorons cela).

Considérez ce que cela signifie pour la synchronisation (votre cas d'utilisation particulier). L'appareil photo n'est pas "prêt" à capturer une image à un moment donné. Il capture déjà un cadre et lorsque vous en demandez un, il vous remettra le prochain complet qui deviendra disponible. Afin de synchroniser les cadres des caméras, toutes les caméras devraient être initialisées exactement en même temps, puis leurs horloges internes devraient fonctionner précisément en synchronisation (les caméras ont leur propre horloge interne; elles ne dépendent pas de la Horloge de Pi).

Malheureusement, je ne pense pas que ce soit vraiment une perspective réaliste. Si je me souviens bien, le module de calcul Pi (qui a 2 ports de caméra intégrés et prend en charge 2 modules de caméra simultanément) utilise des appels spéciaux dans le firmware pour que les 2 modules utilisent un seul signal d'horloge (je ne sais pas comment cela fonctionne au niveau matériel mais je suppose qu'il utilise quelque chose de spécifique au module de calcul); Je ne peux pas imaginer comment vous feriez quelque chose de similaire sur 4 Pis.

Mise à jour:

Je dois ajouter qu'il est possible de faire une synchronisation approximative avec des connaissances de réseau raisonnables (par exemple, des paquets de diffusion UDP). En d'autres termes, il est possible d'obtenir tous les Pi sur un réseau pour déclencher une capture à une milliseconde près (en supposant un réseau décent à faible latence comme Ethernet), mais comme décrit ci-dessus, cela ne garantit toujours pas que toutes les caméras seront réellement capturer une image en même temps; il y aura jusqu'à une valeur de décalage d'une trame (plus la latence du réseau) entre les heures de début des captures résultantes.

Si ce niveau de synchronisation est suffisant pour les gens, ils voudront peut-être consulter le projet compoundpi qui est un autre projet que j'ai écrit sur picamera à cette fin.

Dave Jones
la source
Pouvez-vous parler de la "synchronisation d'images" multi-caméras en mode fixe (pas vidéo). Je suppose que le capteur peut de nouveau fonctionner en mode "free running" même pour les images fixes, juste en pleine résolution et avec un FPS inférieur (peut-être 15 FPS? Cela donnerait des décalages d'image plus longs que la vidéo à 30 FPS). Pouvez-vous confirmer cette hypothèse? Je suis intéressé par la solution C ++ car Python n'ajoute qu'un niveau d'incertitude temporelle en plus de cela ...
Kozuch
Dans les années qui ont suivi, j'ai appris beaucoup plus et je devrais probablement mettre à jour cette réponse à un moment donné. Pour commencer, l'affirmation selon laquelle il y a une synchronisation sur les deux caméras du module de calcul est fausse: il n'y en a pas, elles sont juste démarrées de manière synchrone et finiront par s'écarter (sur plusieurs heures). Sur les images fixes, la caméra diffuse des images jusqu'à la capture, mais passe ensuite en mode capteur 2 ou 3 (en fonction de la fréquence d'images) pendant la capture.
Dave Jones
J'ai écrit une version étendue du chapitre sur le matériel de l'appareil photo pour la prochaine version de Picamera basée sur les commentaires des développeurs du firmware de l'appareil photo - cela pourrait valoir la peine d'être lu (bien qu'il ne soit toujours pas complet) car il couvre certains de ces détails.
Dave Jones
Vos documents sont une lecture assez complète mais je n'ai pas les ressources pour les approfondir maintenant - je viens de faire une lecture rapide. Je vois qu'il existe à la fois des modes vidéo et fixe (port fixe). Nous connaissons le port vidéo (capteur fonctionnant librement) mais pouvez-vous expliquer ce que signifie toujours le port et comment il fonctionne? Peut-il être utilisé d'une manière ou d'une autre pour un déclenchement plus précis (moins de retard d'obturation) que le port vidéo peut-être? J'ai demandé aux développeurs Raspicam C ++ pour le même sujet, mais je n'ai pas encore de réponse.
Kozuch
Non: le port fixe est juste un artefact MMAL qui fait qu'un pipeline d'imagerie différent sur le GPU produit une "meilleure" sortie encore. Par conséquent, lorsque vous utilisez le port fixe pour capturer, le mode du capteur est temporairement commuté, un algorithme de bruit plus fort est utilisé, etc. Cela ne vous donnera aucune différence de retard d'obturation (le commutateur de mode le compliquera probablement le cas échéant).
Dave Jones