Sie müssen den Kamera-Prozess die ganze Zeit laufen lassen.
Nur so kann ich Ergebnisse von (durchschnittlich) 50 ms erzielen. Ich habe überall nach einer Lösung gesucht. 1 Sekunde war einfach zu langsam für mein Bewegungssensor-Projekt.
@ Dave Jones 'Projekt hat mir geholfen, herauszufinden, wie es geht.
Nur 2 Dateien:
ein Daemon, der die ganze Zeit läuft und ein Client.
Im Daemon legen Sie alle Kameraeinstellungen fest.
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
(in einem zweiten 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)
Ich poste diese Antwort, weil ich sie in Google gefunden habe und selbst nach einer Antwort gesucht habe. Ich konnte keine finden, also musste ich mich um einige Projekte kümmern und mir selbst etwas einfallen lassen.
Sie müssen ein Timeout von 0 angeben.
Von der Himbeere helfen
Um zu testen, wie lange die Ausführung eines Befehls dauert, können Sie "time" verwenden.
quelle
-t
Option aus. Wie @Cerin angibt, zerstört dies das Bild, wenn es zu niedrig eingestellt ist. Um ehrlich zu sein, enthält die Dokumentation des Raspberry Pi viel zu wenig Informationen zu dieser Option und führt zu der falschen Annahme, dass das Timeout eine einfache "Verzögerung" / "Zeitauslösung" ist, was es eindeutig nicht ist.Ich habe den folgenden Alias in meinem .bash_profile angegeben, um einfache und schnelle Kameraaufnahmen zu ermöglichen:
Jedes
shot
Mal, wenn ich in die Befehlszeile tippe, wird beispielsweise ein Bild mit Zeitstempel gespeichertshot-2016-02-27_0934.jpg
.quelle
--timeout 1
Argument (?) Wäre ich überrascht, wenn es so schnell gehen würde - aber da ich mein System (noch) nicht so weit gebracht habe, dass es einen Schnappschuss von dem macht, der jemals versucht, meine Front zu entsperren. Tür Ich kann nicht wirklich Pick-Nits! 8-) Gute Verwendung der Befehlszeile (vorausgesetzt, die Uhr ist eingestellt) - einschließlich des Datums- / Uhrzeitstempels mit den wichtigsten Werten an erster Stelle, damit die alphanumerische Sortierreihenfolge der Sortierreihenfolge für das Datum entspricht!Vielleicht möchten Sie einen Blick auf das compoundpi-Projekt werfen (vollständige Offenlegung: Ich bin der Autor). Es ist für das Auslösen von Captures von zahlreichen Pi's mit Kameramodulen vorgesehen und verwendet UDP-Broadcast-Pakete, um sie alle so nah wie möglich aneinander auszulösen. Auf jedem Pi wird ein Daemon ausgeführt, der die Kamera startet und bei Empfang eines UDP-Pakets mit dem Befehl CAPTURE die Erfassung auslöst (andere Befehle zur Konfiguration der Kamera sind verfügbar; das Protokoll ist recht gut dokumentiert ). Eine Einrichtung über Ethernet ist ideal, aber WLAN funktioniert auch, obwohl Sie in diesem Fall möglicherweise die Zeitverzögerungsfunktion verwenden müssen, um eine angemessene Synchronisierung zu erzielen (aufgrund von Paketverlust / variabler Latenz).
Ich kann nicht sagen, dass es mit 100 Pi's getestet wurde - im Moment sind es 20, aber ich würde mich über Probleme mit größeren Maßstäben freuen.
Das Projekt enthält einen Befehlszeilen-Client , einen GUI-Client (in Qt geschrieben, damit es unter Linux / Mac / Windows funktioniert, aber erst unter Ubuntu getestet wurde und noch nicht dokumentiert ist) und eine Python-basierte Client-Bibliothek für Schreiben von Batch-Jobs.
quelle