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.
Vous devez spécifier un délai d'expiration de 0.
De l'aide raspistill
Pour tester le temps nécessaire à l'exécution d'une commande, vous pouvez utiliser "time"
la source
-t
option 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.J'ai spécifié l'alias suivant dans mon .bash_profile pour permettre des prises de vue faciles et rapides:
Chaque fois que je tape
shot
sur la ligne de commande, une image avec horodatage est enregistrée, par exempleshot-2016-02-27_0934.jpg
.la source
--timeout 1
argument (?) 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!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.
la source