Câmera Raspberry Pi - Quando está pronto para o próximo quadro

8

Ao usar APIs como a API C ++ ou raspicam , você pesquisa a câmera com um método grab () ou similar. Quando um quadro está pronto, o método retorna. Existe uma maneira de verificar se a câmera está pronta sem agarrar a moldura?

Pode ser uma ferramenta de linha de comando, uma chamada C ++, uma biblioteca python, literalmente qualquer método.

Eu pergunto porque tenho 4 pis de framboesa com 4 câmeras e quero gravar vídeo quadro a quadro com cada quadro no exato momento exato. As câmeras não são rápidas o suficiente para que meu aplicativo faça isso de outra maneira.

user2290362
fonte

Respostas:

2

Eu acho que é melhor responder a essa pergunta, dando uma ideia de como as coisas funcionam um pouco mais abaixo. Primeiro, porém, uma ressalva: eu não sou especialista em firmware por nenhuma extensão da imaginação; meu entendimento bastante aproximado de como o módulo de câmera Pi funciona baseia-se em minha experiência de escrever a biblioteca picamera e interagir com os desenvolvedores de firmware muito mais experientes nos fóruns Pi. Se você ouvir informações contraditórias dos desenvolvedores de firmware, eles são a autoridade nisso, não eu! Com isso fora do caminho ...

Assim que o módulo de câmera do Pi é inicializado, ele está capturando quadros. Esses quadros são (no que diz respeito ao usuário final) despejados, mas dentro do firmware da câmera há muito mais acontecendo. Os quadros são medidos para determinar o ganho a ser aplicado ao sensor (AGC), o balanço de branco para alimentar o algoritmo de correção AWB, etc. Por exemplo, se você iniciar a câmera e iniciar imediatamente a gravação, verá normalmente o o balanço de branco se corrige nos primeiros quadros da gravação:

import picamera
import time

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

No entanto, se você colocar um atraso antes de iniciar a gravação, verá que o balanço de brancos é estável quando a gravação começa:

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()

Portanto, como a câmera está sempre capturando quadros, mesmo quando não estamos capturando imagens ou gravando vídeos, o que realmente acontece quando escolhemos capturar uma imagem? Dizemos ao firmware para ativar a captura, e o firmware aguarda a conclusão do próximo quadro antes de devolvê-lo (na verdade, se você estiver capturando imagens da porta estática em vez da porta de vídeo, ainda há muito mais, incluindo comutadores de modo, mas você está preocupado com a porta de vídeo, então vamos ignorar isso).

Considere o que isso significa para sincronização (seu caso de uso específico). A câmera não está "pronta" para capturar um quadro em qualquer ponto específico. Ele já está capturando um quadro e, quando você pedir um, ele entregará o próximo quadro completo que estiver disponível. Para sincronizar os quadros das câmeras, todas as câmeras teriam que ser inicializadas exatamente ao mesmo tempo, e então seus relógios internos teriam que funcionar precisamente em sincronia (as câmeras têm seu próprio relógio interno; elas não confiam no Relógio do Pi).

Infelizmente, não acho que essa seja realmente uma perspectiva realista. Se bem me lembro, o módulo de computação Pi (que tem 2 portas de câmera on-line e suporta 2 módulos de câmera simultaneamente) usa algumas chamadas especiais no firmware para fazer com que os 2 módulos usem um único sinal de relógio (não tenho idéia de como isso funciona no nível do hardware, mas presumo que ele esteja usando algo específico para o módulo de computação); Não consigo imaginar como você faria algo semelhante em quatro Pis.

Atualizar:

Devo acrescentar que é possível fazer uma sincronização grosseira com algum conhecimento razoável de rede (por exemplo, pacotes de transmissão UDP). Em outras palavras, é possível obter todos os Pi's em uma rede para disparar uma captura dentro de um milissegundo um do outro (assumindo uma rede decente de baixa latência como a Ethernet), mas conforme descrito acima, isso ainda não garante que todas as câmeras realmente capturar um quadro ao mesmo tempo; haverá um atraso de até um quadro (mais a latência da rede) entre os horários de início das capturas resultantes.

Se esse nível de sincronização é suficiente para as pessoas, elas podem conferir o projeto compositepi, que é outro projeto que escrevi no topo da picamera para esse fim.

Dave Jones
fonte
Você pode falar sobre a "sincronização de quadro" com várias câmeras no modo estático (não no vídeo). Eu acho que o sensor pode estar funcionando novamente no modo "corrida livre", mesmo para fotos, apenas com resolução total e FPS mais baixo (talvez 15 FPS? Você é capaz de confirmar essa suposição? Estou interessado na solução C ++ como Python só adiciona um nível de tempo de incerteza em cima do que ...
Kozuch
Nos anos seguintes, aprendi um pouco mais e provavelmente devo atualizar esta resposta em algum momento. Para iniciantes, a afirmação de que há sincronização nas câmeras duplas do módulo de computação está errada: não há, elas são iniciadas de forma síncrona e eventualmente (por várias horas) se afastarão. Em fotos estáticas, a câmera transmite quadros até a captura, mas alterna o modo para o modo sensor 2 ou 3 (dependendo da taxa de quadros) durante a captura.
Dave Jones
Escrevi uma versão expandida do capítulo de hardware da câmera para a próxima versão da câmera, com base nos comentários dos desenvolvedores de firmware da câmera - pode valer a pena ler (embora ainda não esteja completa), pois cobre alguns desses detalhes.
Dave Jones
Seus documentos são uma leitura bastante extensa, mas eu não tenho os recursos para aprofundar neles agora - fiz apenas uma leitura rápida. Vejo que existem modos de vídeo e estático (porta estática). Conhecemos a porta de vídeo (sensor de funcionamento livre), mas você pode explicar o que significa ainda porta e como ela funciona? Pode ser usado de alguma maneira para acionar mais precisamente (menos atraso do obturador) que a porta de vídeo, talvez? Eu perguntei aos devs raspicam C ++ o mesmo tópico, mas ainda não tenho resposta.
precisa saber é o seguinte
Não: a porta estática é apenas um artefato MMAL que faz com que um pipeline de criação de imagens diferente na GPU produza uma saída estática "melhor". Portanto, ao usar a porta estática para capturar, o modo do sensor é alternado temporariamente, um algoritmo de denoise mais forte é usado, etc.
Dave Jones