Raspistill tard à se déclencher?


18

J'essaie de déclencher "beaucoup" de framboises ensemble, alors que l'utilisation de raspistill est uniquement à des fins de test, je me demande pourquoi prendre une photo est si lent, j'ai fait un test et, en même temps que j'appuie sur Entrée sur cette commande:

raspistill -o /home/pi/test55.jpg -ex sports --nopreview

Je lance un chronomètre iPhone devant la caméra. Le résultat? 7 secondes, 09 (mais forte, donc la vitesse d'obturation, etc. était bien, je n'obtenais pas de nombre flou). Que puis-je faire pour que cela "ne" prenne pas X secondes avant de prendre la photo? Je vais synchroniser des centaines de RPI et je ne veux pas que certains d'entre eux prennent la photo à 4 et d'autres à 10 secondes, donc je voudrais comprendre ce qui se passe là-bas.

Réponses:


5

Vous devez avoir le processus de la caméra en cours d'exécution tout le temps.

C'est la seule façon d'obtenir des résultats de 50 ms en moyenne. J'ai cherché partout une solution. 1 seconde était tout simplement trop lente pour mon projet de capteur de mouvement.

Le projet de @Dave Jones m'a aidé à comprendre comment le faire.

Seulement 2 fichiers:

un démon, fonctionnant tout le temps et un client.

Le démon est l'endroit où vous définissez tous les paramètres de la caméra.

picam-daemon.py

picam-client.py

python picam-daemon.py

import threading
import os, io, base64, time, socket, picamera, daemon
import daemon.runner

MAX_LENGTH = 50 # max length of any possible entry from "client"
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # setup socket
PORT = 10000 # port 10000
HOST = '127.0.0.1' # runs on local host
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # this allows us to override port, prevents error
serversocket.bind((HOST, PORT)) # lock server to this port and host
serversocket.listen(10) # max 10 clients


# Waits for commands, such as "snap" and "ack"
# Runs over "sockets"
def handle(clientsocket):
    while 1:
        buf = clientsocket.recv(MAX_LENGTH)

        # Receive the SNAP command. Take a picture with PiCam.
        if buf == 'snap':
            start = time.time()
            camera.capture('/home/pi/ir/picam-latest-snap.jpg')
            finish = start - time.time()
            print finish
            print 'Picture Taken!'

        if buf == 'ack':
            print 'Ping: Hello!'

        if len(buf) == 0: break

# Camera is always loaded here
# The "magic" is in the camThread, this allows a picture to be captured, then it gracefully closed the camera connection and reopens it. This produces very fast captures (54ms vs 1.5s!)
while 1:
    # setup camera
    camera = picamera.PiCamera()
    camera.resolution = (640, 480)
    #camera.zoom = (0.2, 0.2, 1.0, 1.0)
    camera.exposure_mode = 'sports'
    print('Camera server running')

    # accept connections from outside, in order to receive commands
    (clientsocket, address) = serversocket.accept()
    ct = threading.Thread(target=handle, args=(clientsocket,))
    ct.run() # this can be run(), because it can be scaled.

    print 'Camera thread starting.'
    camThread = threading.Thread()
    while camThread.is_alive():
        camThread.join(1)
    camThread.run() # this must be start(), otherwise PiCam will crash. This is because PiCam cannot receive more than 1 connection.
    print 'Camera thread ended'
    camera.close() # Gracefully close PiCam if client disconnects

(dans un deuxième terminal) python picam-client.py

import socket
import sys


HOST = '127.0.0.1'
PORT = 10000
s = socket.socket()
s.connect((HOST, PORT))

print s

while 1:
    msg = raw_input("Command To Send: ")
    if msg == "close":
       s.close()
       sys.exit(0)
    s.send(msg)

Je poste cette réponse parce que je l'ai trouvée dans Google, en essayant de trouver une réponse moi-même. Je ne pouvais pas en trouver un, alors j'ai dû creuser autour de certains projets et trouver moi-même quelque chose.


Lorsque j'ai rencontré le même problème, j'ai trouvé la même solution, mais je n'avais pas encore réussi à écrire le code. Heureux de voir que quelqu'un d'autre m'a battu!
Nick Coons

6

Vous devez spécifier un délai d'expiration de 0.

De l'aide raspistill

-timeout "Time (in ms) before takes picture and shuts down (if not specified, set to 5s)

Pour tester le temps nécessaire à l'exécution d'une commande, vous pouvez utiliser "time"

time raspistill -o /home/pi/test55.jpg -ex sports --nopreview --timeout 0

Cela supprime le délai d'expiration par défaut de 5 secondes, mais le problème est que j'obtiens plus que cela, d'après ce que je comprends sur le forum, il n'y a aucun moyen réel d'utiliser raspistill pour obtenir des images sans retard
Ronan Thibaudau

8
Dans mon Raspberry, spécifier un délai d'expiration de 0 semble signifier "infini", tandis que spécifier un délai d'expiration de "1" semble faire l'affaire
MondKin

4
De plus, l'utilisation d'un délai si bas ne donne pas suffisamment de temps à l'appareil photo pour exposer les collecteurs, ce qui entraîne une image sombre. Je trouve que je ne peux pas descendre en dessous de 300 environ avant que l'image ne devienne sombre et floue.
Cerin

2
Si ce n'est pas vraiment nécessaire, laissez l' -toption de côté. Comme @Cerin l'indique, cela détruit en quelque sorte l'image si elle est trop basse. Pour être honnête, la documentation du Raspberry Pi contient beaucoup trop peu d'informations sur cette option et conduit à l'hypothèse erronée que le délai d'attente est un simple «retard» / «déclencheur de temps», ce qui n'est clairement pas le cas.
Flatron

4

J'ai spécifié l'alias suivant dans mon .bash_profile pour permettre des prises de vue faciles et rapides:

alias shot='SHOTTIME=$(date +"%Y-%m-%d_%H%M") && raspistill -o shot-$SHOTTIME.jpg --nopreview --exposure sports --timeout 1

Chaque fois que je tape shotsur la ligne de commande, une image avec horodatage est enregistrée, par exemple shot-2016-02-27_0934.jpg.


1
Bienvenue dans la communauté Raspberry Pi Stack Exchange! Même avec l' --timeout 1argument (?) Je serais surpris si c'était aussi rapide - mais comme je n'ai pas (encore) mis mon système dans un état tel qu'il prend un instantané de qui a déjà essayé de déverrouiller mon front- porte, je ne peux pas vraiment piocher! 8-) Bonne utilisation de la ligne de commande (en supposant que l'horloge a été réglée) - y compris en mettant d'abord le timbre datetime avec les valeurs les plus significatives afin que l'ordre de tri alphanumérique soit le même que l'ordre de tri de la date!
SlySven

1
~ $ time shot real 0m0.040s user 0m0.010s sys 0m0.020s qed;)
NDB

1
0,040 seconde est malheureusement bien trop rapide pour être vrai. L'utilisation de la commande de temps ci-dessus est imparfaite, elle ne mesurera en fait que le temps nécessaire pour affecter la variable SHOTTIME, pas pour capturer l'image. Le temps réel est d' environ 1 seconde .
slackhacker

Merci pour ton commentaire, tu as raison. J'ai supprimé le temps que cela prend de mon texte d'origine.
NDB

2

Vous voudrez peut-être jeter un œil au projet compoundpi (divulgation complète: je suis l'auteur). Il est destiné à déclencher des captures à partir de nombreux Pi avec des modules de caméra et utilise des paquets de diffusion UDP pour les déclencher tous aussi près que possible. Un démon s'exécute sur chaque Pi qui déclenche la caméra et déclenche les captures à la réception d'un paquet UDP contenant la commande CAPTURE (d'autres commandes sont disponibles pour configurer la caméra; le protocole est assez bien documenté ). Une configuration utilisant Ethernet est idéale, mais le wifi fonctionnera également, même si vous devrez peut-être utiliser la fonctionnalité de temporisation pour obtenir une synchronisation décente dans ce cas (en raison de la perte de paquets / latence variable).

Je ne peux pas dire qu'il a été testé avec 100 Pi - pour le moment, la plus grande configuration l'utilisant implique 20, mais je serais intéressé d'entendre parler de problèmes impliquant des échelles plus grandes.

Le projet comprend un client de ligne de commande , un client GUI (écrit en Qt donc il devrait fonctionner sur Linux / Mac / Windows mais il n'a été testé sur Ubuntu qu'à ce stade, et il n'est toujours pas documenté), et une bibliothèque cliente basée sur Python pour écriture de travaux par lots.


Je ne suis pas très inquiet pour la partie udp ni pour le client (je ne veux pas les contrôler à la main, ils sont contrôlés par un projet beaucoup plus important), mais compoundpi utilise-t-il quelque chose qui prend une capture presque instantanée ou a-t-il également un retard comme raspistill?
Ronan Thibaudau

Dave, il semble que vous soyez l'auteur de projets qui tournent autour de ce dont j'ai besoin, y a-t-il une chance que nous puissions avoir une discussion sur Skype ou par e-mail?
Ronan Thibaudau

Certainement - n'hésitez pas à m'envoyer un e-mail directement (mon adresse e-mail devrait être visible sur mon profil GitHub )
Dave Jones

1
Oh, et sur votre autre question: c'est presque instantané. Lorsque le démon compoundpi est démarré, il initialise et configure la caméra (d'où provient un grand retard de raspistill) puis attend une commande de capture. La commande de capture peut soit provoquer instantanément une capture, soit attendre un horodatage spécifié avant la capture. Dans le cas présent, le délai entre la réception de la commande et la capture doit être de quelques millisecondes.
Dave Jones

Dave Jones, cette idée d'initialiser l'appareil photo avant de prendre la capture, pouvez-vous donner plus d'informations? Pouvons-nous le faire à partir de la ligne de commande?
Ollie
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.