Raspistill langsam auslösen?


18

Ich versuche, "viele" Himbeeren gleichzeitig auszulösen, während die Verwendung von raspistill nur zum Testen dient. Ich frage mich, warum das Aufnehmen eines Bildes so langsam ist. Ich habe einen Test durchgeführt und gleichzeitig die Eingabetaste für diesen Befehl gedrückt:

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

Ich starte einen iPhone Chronometer vor der Kamera. Das Ergebnis? 7 Sekunden, 09 (aber scharf, Verschlusszeit usw. war in Ordnung, ich habe keine unscharfe Zahl bekommen). Was kann ich tun, damit es nicht X Sekunden dauert, bevor das Bild aufgenommen wird? Ich werde Hunderte von RPI synchronisieren und ich möchte nicht, dass einige von ihnen das Bild mit 4 und andere mit 10 Sekunden machen, also würde ich gerne verstehen, was dort gerade passiert.

Antworten:


4

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.


Als ich auf dasselbe Problem stieß, kam ich auf dieselbe Lösung, war aber noch nicht weit davon entfernt, den Code zu schreiben. Freut mich zu sehen, dass mich jemand anderes geschlagen hat!
Nick Coons

6

Sie müssen ein Timeout von 0 angeben.

Von der Himbeere helfen

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

Um zu testen, wie lange die Ausführung eines Befehls dauert, können Sie "time" verwenden.

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

Dies beseitigt die Standard-Zeitüberschreitung von 5 Sekunden, aber das Problem ist, dass ich mehr als das bekomme. Soweit ich im Forum verstehe, gibt es keine echte Möglichkeit, Raspistill so zu verwenden, wie es ist, keine Verzögerungsbilder zu bekommen
Ronan Thibaudau,

8
In meiner Himbeere scheint die Angabe eines Timeouts von 0 "unendlich" zu bedeuten, während die Angabe eines Timeouts von "1" den Trick zu tun scheint
MondKin

4
Außerdem hat die Kamera bei einem so niedrigen Timeout nicht genügend Zeit, um die Kollektoren freizulegen, was zu einem dunklen Bild führt. Ich kann nicht unter 300 sinken, bevor das Bild dunkel und verschwommen wird.
Cerin

2
Wenn nicht unbedingt erforderlich, lassen Sie die -tOption 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.
Flatron

4

Ich habe den folgenden Alias ​​in meinem .bash_profile angegeben, um einfache und schnelle Kameraaufnahmen zu ermöglichen:

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

Jedes shotMal, wenn ich in die Befehlszeile tippe, wird beispielsweise ein Bild mit Zeitstempel gespeichert shot-2016-02-27_0934.jpg.


1
Willkommen in der Raspberry Pi Stack Exchange Community! Selbst mit dem --timeout 1Argument (?) 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!
SlySven

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

1
0.040 Sekunden sind leider viel zu schnell, um wahr zu sein. Die Verwendung des obigen Zeitbefehls ist fehlerhaft. Es wird nur die Zeit gemessen, die benötigt wird, um die Variable SHOTTIME zuzuweisen, ohne das Bild aufzunehmen. Die Echtzeit ist ~ 1 Sekunden .
Slackhacker

Vielen Dank für Ihren Kommentar, Sie haben Recht. Ich habe die dafür benötigte Zeit aus meinem Originaltext entfernt.
NDB

2

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.


Ich mache mir keine großen Sorgen um den udp-Teil oder den Client (ich möchte sie nicht von Hand steuern, sie werden von einem viel größeren Projekt gesteuert), aber compoundpi verwendet etwas, das fast sofort erfasst werden kann oder auch eine verzögerung wie raspistill?
Ronan Thibaudau

Dave, es scheint, dass Sie der Autor von Projekten sind, die sich um das drehen, was ich brauche. Gibt es eine Chance, dass wir eine Skype- oder E-Mail-Diskussion haben?
Ronan Thibaudau

Natürlich - zögern Sie nicht, mir direkt eine E-Mail zu senden (meine E-Mail-Adresse sollte auf meinem GitHub-Profil sichtbar sein )
Dave Jones

1
Oh, und zu Ihrer anderen Frage: Es ist fast augenblicklich. Wenn der Compoundpi-Daemon gestartet wird, initialisiert und konfiguriert er die Kamera (woraus eine große Verzögerung bei Raspistill resultiert) und wartet dann auf einen Erfassungsbefehl. Der Erfassungsbefehl kann entweder sofort eine Erfassung auslösen oder vor der Erfassung auf einen bestimmten Zeitstempel warten. In diesem Fall sollte die Verzögerung zwischen dem Empfang des Befehls und der Erfassung Millisekunden betragen.
Dave Jones

Können Sie Dave Jones, der die Idee hat, die Kamera vor der Aufnahme zu initialisieren, weitere Informationen geben? Können wir das von der Kommandozeile aus machen?
Ollie
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.