Fotocamera Raspberry Pi: quando è pronta per il fotogramma successivo


8

Quando si utilizzano API come C ++ o raspicam api, si esegue il polling della videocamera con un metodo grab () o simile. Quando una cornice è pronta, il metodo ritorna. C'è un modo per verificare se la fotocamera è pronta senza afferrare la cornice?

Questo può essere uno strumento da riga di comando, una chiamata C ++, una libreria Python, letteralmente qualsiasi metodo.

Lo chiedo perché ho 4 pis lampone con 4 telecamere e voglio riprendere fotogramma per fotogramma con ciascun fotogramma nello stesso preciso momento. Le telecamere non sono abbastanza veloci per la mia applicazione da fare diversamente.

Risposte:


2

Penso che sia meglio rispondere a questa domanda dando alcune informazioni su come le cose funzionano un po 'più in basso. Prima però un avvertimento: non sono un esperto di firmware per nessun tratto dell'immaginazione; la mia comprensione piuttosto approssimativa di come funziona il modulo videocamera Pi si basa sulla mia esperienza di scrittura della libreria di fotocamere e di interazione con gli sviluppatori di firmware molto più esperti sui forum Pi. Se senti informazioni contraddittorie dagli sviluppatori del firmware, sono l'autorità su questo, non io! Con quello fuori mano ...

Non appena il modulo videocamera del Pi viene inizializzato, cattura i fotogrammi. Questi frame vengono scaricati (per quanto riguarda l'utente finale) ma all'interno del firmware della fotocamera c'è molto altro da fare. I fotogrammi vengono misurati per determinare il guadagno da applicare al sensore (AGC), il bilanciamento del bianco da alimentare all'algoritmo di correzione AWB, ecc. Ad esempio, se si avvia la fotocamera e si avvia immediatamente la registrazione, in genere viene visualizzato il il bilanciamento del bianco si corregge sui primi fotogrammi della registrazione:

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    camera.start_recording('video1.h264')
    time.sleep(5)
    camera.stop_recording()

Tuttavia, se si pone un ritardo prima di iniziare la registrazione, si noterà che il bilanciamento del bianco è stabile quando inizia la registrazione:

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    time.sleep(5)
    camera.start_recording('video2.h264')
    time.sleep(5)
    camera.stop_recording()

Quindi, dato che la fotocamera cattura sempre i fotogrammi anche quando non stiamo catturando immagini o registrando video, cosa succede realmente quando si sceglie di catturare un'immagine? Diciamo al firmware di attivare l'acquisizione e il firmware attende il completamento del fotogramma successivo prima di restituirlo a noi (in realtà, se stai acquisendo immagini dalla porta fissa invece che dalla porta video, c'è molto di più tra cui cambia modalità, ma ti preoccupi della porta video, quindi ignoriamola).

Considera cosa significa per la sincronizzazione (il tuo caso d'uso particolare). La fotocamera non è "pronta" per acquisire una cornice in un determinato punto. Sta già catturando una cornice e quando ne chiedi una ti consegnerà la successiva completa che diventa disponibile. Per sincronizzare i frame delle telecamere tutte le telecamere dovrebbero essere inizializzate esattamente allo stesso tempo, e quindi i loro orologi interni dovrebbero funzionare esattamente in sincronia (le telecamere hanno il proprio clock interno; non si basano sul Orologio di Pi).

Purtroppo, non penso che questa sia davvero una prospettiva realistica. Se ricordo bene, il modulo di calcolo Pi (che ha 2 porte per videocamera integrate e supporta contemporaneamente 2 moduli videocamera) utilizza alcune chiamate speciali nel firmware per far sì che i 2 moduli utilizzino un singolo segnale di clock (non ho idea di come questo funziona a livello hardware ma suppongo che stia usando qualcosa di specifico per il modulo di calcolo); Non riesco a immaginare come faresti qualcosa di simile in 4 Pis.

Aggiornare:

Vorrei aggiungere che è possibile eseguire una sincronizzazione approssimativa con alcune ragionevoli conoscenze di rete (ad esempio pacchetti di trasmissione UDP). In altre parole, è possibile ottenere tutti i Pi in una rete per innescare una cattura entro un millisecondo l'uno dall'altro (supponendo una rete decente a bassa latenza come Ethernet), ma come descritto sopra che non garantirà comunque che tutte le telecamere effettivamente catturare una cornice allo stesso tempo; ci sarà fino a un ritardo di un frame (più latenza di rete) tra i tempi di inizio delle acquisizioni risultanti.

Se quel livello di sincronizzazione è sufficiente per le persone, potrebbero voler dare un'occhiata al progetto compoundpi, che è un altro progetto che ho scritto su Picamera proprio per questo scopo.


Puoi parlarci della "sincronizzazione dei fotogrammi" multi-camera in modalità statica (non video). Immagino che il sensore potrebbe funzionare di nuovo in modalità "free running" anche per immagini fisse, solo con piena risoluzione e FPS più bassi (forse 15 FPS? Che darebbe ritardi di fotogrammi più lunghi rispetto a 30 video FPS). Sei in grado di confermare questo assunto? Sono interessato alla soluzione C ++ poiché Python aggiunge solo un livello di incertezza temporale oltre a questo ...
Kozuch,

Negli anni successivi ho imparato molto di più e probabilmente dovrei aggiornare questa risposta ad un certo punto. Tanto per cominciare l'affermazione che c'è sincronizzazione sulla doppia fotocamera del modulo di calcolo è sbagliata: non c'è, sono appena iniziati in modo sincrono e alla fine (per diverse ore) si allontaneranno. Negli alambicchi, la fotocamera esegue lo streaming dei fotogrammi fino alla cattura, ma passa alla modalità sensore 2 o 3 (dipendente dal framerate) durante la cattura.
Dave Jones,

Ho scritto una versione estesa del capitolo hardware della fotocamera per la prossima versione di picamera basata sul feedback degli sviluppatori del firmware della fotocamera - potrebbe valere la pena di leggere (anche se non è ancora completo) in quanto copre alcuni di questi dettagli.
Dave Jones,

I tuoi documenti sono piuttosto approfonditi, ma non ho le risorse per approfondirli adesso - ho fatto solo una lettura veloce. Vedo che ci sono entrambe le modalità video e fermo (ancora porta). Conosciamo la porta video (sensore a funzionamento libero) ma puoi spiegare cosa significa ancora la porta e come funziona? Può essere usato in qualche modo per un trigger più preciso (meno ritardo dell'otturatore) che forse la porta video? Ho chiesto agli sviluppatori C ++ di raspicam lo stesso argomento, ma non ho ancora risposto.
Kozuch,

No: la porta fissa è solo un artefatto MMAL che fa sì che una diversa pipeline di imaging sulla GPU produca un output "migliore". Quindi, quando si utilizza la porta fissa per catturare, la modalità sensore viene temporaneamente commutata, viene utilizzato un algoritmo di denoise più forte, ecc. Non ti darà alcuna differenza nel ritardo dell'otturatore (l'interruttore della modalità probabilmente lo complicherà se non altro).
Dave Jones,
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.