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.