Raspistill rallenta l'attivazione?


18

Sto cercando di innescare "molti" lamponi insieme, mentre l'uso di raspistill è solo per il test, mi chiedo perché scattare una foto sia così lento, ho fatto un test e, contemporaneamente ho premuto invio su questo comando:

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

Avvio un cronometro per iPhone davanti alla fotocamera. Il risultato? 7 secondi, 09 (ma nitido, quindi la velocità dell'otturatore ecc. Andava bene, non stavo ottenendo un numero sfocato). Cosa posso fare per "non" impiegare X secondi prima di scattare la foto? Sincronizzerò centinaia di RPI e non voglio che alcuni di loro scattino la foto a 4 e altri a 10 secondi, quindi vorrei capire cosa sta succedendo lì.

Risposte:


5

È necessario che il processo della fotocamera sia sempre in esecuzione.

Questo è l'unico modo per ottenere risultati (in media) di 50 ms. Ho cercato ovunque una soluzione. 1 secondo è stato troppo lento per il mio progetto di sensore di movimento.

Il progetto di @Dave Jones mi ha aiutato a capire come farlo.

Solo 2 file:

un demone, sempre in esecuzione e un client.

Il demone è dove hai impostato tutte le impostazioni della videocamera.

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 un secondo terminale) 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)

Sto pubblicando questa risposta perché l'ho trovata su Google, cercando di trovare una risposta da solo. Non riuscivo a trovarne uno, quindi ho dovuto scavare in giro per alcuni progetti e inventare qualcosa da solo.


Quando ho riscontrato lo stesso problema, ho trovato la stessa soluzione, ma non ero ancora arrivato a scrivere il codice. Sono contento di vedere che qualcun altro mi ha battuto!
Nick Coons,

6

Devi specificare un timeout di 0.

Dall'aiuto di raspistill

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

Per verificare quanto tempo impiega un comando per eseguire puoi usare "time"

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

Questo rimuove il timeout predefinito di 5 secondi, ma il problema è che sto ottenendo più di quello, da quello che capisco sul forum non c'è modo reale di usare raspistill come non ottenere immagini in ritardo
Ronan Thibaudau,

8
Nel mio Raspberry, specificare il timeout di 0 sembra significare "infinito", mentre specificare un timeout di "1" sembra fare il trucco
MondKin

4
Inoltre, l'utilizzo di un timeout così basso non dà alla fotocamera abbastanza tempo per esporre i collettori, risultando in un'immagine scura. Trovo che non posso scendere di circa 300 prima che l'immagine inizi a diventare scura e sfocata.
Cerin,

2
Se non strettamente necessario, lasciare l' -topzione fuori. Come afferma @Cerin questo in qualche modo distrugge l'immagine se impostato su un valore troppo basso. Ad essere onesti, la documentazione di Raspberry Pi ha troppe informazioni su questa opzione e porta al falso presupposto che il timeout sia un semplice "ritardo" / "time trigger" che chiaramente non lo è.
Flatron,

4

Ho specificato il seguente alias nel mio .bash_profile per consentire riprese della fotocamera facili e veloci:

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

Ogni volta che scrivo shotsulla riga di comando, ad esempio un'immagine viene salvata con timestamp shot-2016-02-27_0934.jpg.


1
Benvenuto nella community di Scambio stack di Raspberry Pi! Anche con l' --timeout 1argomento (?) Sarei sorpreso se fosse così veloce - ma dato che non ho (ancora) portato il mio sistema a uno stato tale che ci vuole uno scatto di chi cerca mai di sbloccare il mio fronte- porta non riesco proprio a fare schifo! Cool Buon uso della riga di comando (supponendo che sia stato impostato l'orologio), incluso l'inserimento del timbro datetime con i valori più significativi, quindi l'ordinamento alfanumerico è lo stesso dell'ordinamento per data!
SlySven,

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

1
0,040 secondi è purtroppo troppo veloce per essere vero .. L'uso del comando time sopra è imperfetto, misurerà in realtà solo il tempo impiegato per assegnare la variabile SHOTTIME, non catturare l'immagine. Il tempo reale è di ~ 1 secondi .
Slackhacker,

Grazie per il tuo commento, hai ragione. Ho rimosso il tempo necessario dal mio testo originale.
NDB,

2

Potresti voler dare un'occhiata al progetto compoundpi (divulgazione completa: sono l'autore). È progettato per innescare acquisizioni da numerosi Pi con moduli telecamera e utilizza i pacchetti di trasmissione UDP per attivarli il più vicino possibile. Un demone viene eseguito su ogni Pi che accende la telecamera e innesca le acquisizioni alla ricezione di un pacchetto UDP contenente il comando CAPTURE (sono disponibili altri comandi per configurare la telecamera; il protocollo è abbastanza ben documentato ). Una configurazione che utilizza Ethernet è l'ideale, ma anche il wifi funzionerà, anche se potrebbe essere necessario utilizzare la funzionalità di ritardo per ottenere una sincronizzazione decente in quel caso (a causa della perdita di pacchetti / latenza variabile).

Non posso dire che sia stato testato con 100 Pi - al momento la configurazione più grande che lo utilizza coinvolge 20, ma sarei interessato a sapere di eventuali problemi che coinvolgono scale più grandi.

Il progetto include un client da riga di comando , un client GUI (scritto in Qt, quindi dovrebbe funzionare su Linux / Mac / Windows, ma a questo punto è stato testato solo su Ubuntu, e non è ancora documentato), e una libreria client basata su Python per scrivere lavori batch.


Non sono molto preoccupato per la parte udp né per il client (non voglio controllarli a mano, sono controllati da un progetto molto più grande) ma compoundpi usa qualcosa che richiede l'acquisizione immediata o ha anche un ritardo come raspistill?
Ronan Thibaudau,

Dave, sembra che tu sia l'autore di progetti che ruotano attorno a ciò di cui ho bisogno, c'è qualche possibilità che potremmo avere una discussione via Skype o e-mail?
Ronan Thibaudau,

Certamente, non esitate a scrivermi direttamente (il mio indirizzo e-mail dovrebbe essere visibile sul mio profilo GitHub )
Dave Jones,

1
Oh, e sull'altra tua domanda: è quasi istantaneo. Quando il demone compoundpi viene avviato, inizializza e configura la telecamera (che è da dove proviene un sacco di ritardo in raspistill) quindi attende un comando di acquisizione. Il comando di acquisizione può causare immediatamente un'acquisizione o attendere fino a un timestamp specificato prima dell'acquisizione. Nel caso presente, il ritardo tra la ricezione del comando e l'acquisizione dovrebbe essere di millisecondi.
Dave Jones,

Dave Jones, questa idea di inizializzazione della fotocamera prima di effettuare la cattura, puoi fornire ulteriori informazioni? Possiamo farlo dalla riga di comando?
Ollie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.