Raspistill lento para disparar?

18

Estou tentando acionar "muitas" framboesas juntas, enquanto o uso de raspistill é apenas para teste, estou me perguntando por que tirar uma foto é tão lenta, fiz um teste e, ao mesmo tempo em que apertei enter neste comando:

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

Eu inicio um cronômetro de iPhone na frente da câmera. O resultado? 7 segundos, 09 (mas nítido, então a velocidade do obturador etc foi boa, eu não estava obtendo o número desfocado). O que posso fazer para "não" levar X segundos antes de tirar a foto? Vou sincronizar centenas de RPI e não quero que alguns tirem a foto às 4 e outras aos 10 segundos, então eu gostaria de entender o que está acontecendo lá.

Ronan Thibaudau
fonte

Respostas:

5

Você precisa ter o processo da câmera rodando o tempo todo.

Esta é a única maneira de obter resultados (em média) de 50ms. Procurei por toda parte uma solução. 1 segundo foi muito lento para o meu projeto de sensor de movimento.

O projeto do @Dave Jones me ajudou a descobrir como fazê-lo.

Apenas 2 arquivos:

um daemon, executando o tempo todo e um cliente.

O daemon é onde você define todas as configurações da câmera.

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

(em um segundo 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)

Estou postando esta resposta porque a encontrei no Google, tentando encontrar uma resposta. Não consegui encontrar um, então tive que cavar em torno de alguns projetos e inventar alguma coisa.

Entryton
fonte
Quando encontrei o mesmo problema, encontrei a mesma solução, mas ainda não havia chegado nem perto de escrever o código. Fico feliz em ver que alguém me venceu!
Nick Coons
6

Você precisa especificar um tempo limite de 0.

Da ajuda da raspistila

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

Para testar quanto tempo um comando leva para executar, você pode usar "time"

time raspistill -o /home/pi/test55.jpg -ex sports --nopreview --timeout 0
roubar
fonte
Isso elimina o tempo limite padrão de 5 segundo, mas a questão é que estou recebendo mais do que isso, pelo que eu entendo sobre o fórum não há nenhuma maneira real usando raspistill como é obter nenhuma imagem de atraso
Ronan Thibaudau
8
Na minha framboesa, especificando tempo limite de 0 parece significar "infinita", ao especificar um tempo limite de "1" parece estar a fazer o truque
MondKin
4
Além disso, usar um tempo limite tão baixo não dá à câmera tempo suficiente para expor os coletores, resultando em uma imagem escura. Acho que não posso ir abaixo de 300 antes que a imagem comece a ficar escura e embaçada.
Cerin
2
Se não for severamente necessário, deixe a -topção de fora. Como o @Cerin afirma, isso de alguma forma destrói a imagem se estiver muito baixa. Para ser honesto, a documentação do Raspberry Pi possui poucas informações sobre essa opção e leva à falsa suposição de que o tempo limite é um simples "atraso" / "disparador de tempo" que claramente não é.
Flatron
4

Especifiquei o seguinte alias no meu .bash_profile para permitir fotos fáceis e rápidas da câmera:

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

Sempre que digito shotna linha de comando, uma imagem com registro de data e hora é salva, por exemplo shot-2016-02-27_0934.jpg.

NDB
fonte
11
Bem-vindo à comunidade Raspberry Pi Stack Exchange! Mesmo com o --timeout 1argumento (?), Eu ficaria surpreso se fosse tão rápido - mas como ainda não cheguei a meu sistema a tal estado, é preciso um instantâneo de quem tenta desbloquear minha frente - porta eu realmente não posso pegar! 8-) Bom uso da linha de comando (assumindo que o relógio foi ajustado) - incluindo colocar o carimbo de data e hora com os valores mais significativos primeiro, para que a ordem de classificação alfanumérica seja a mesma da data!
SlySven 27/02
11
~ $ time shot real 0m0.040s usuário 0m0.010s sys 0m0.020s qed;)
NDB
11
Infelizmente, 0,040 segundos é muito rápido para ser verdade. O uso do comando time acima é falho; na verdade, ele mede apenas o tempo necessário para atribuir a variável SHOTTIME, sem capturar a imagem. O tempo real é de ~ 1 segundo .
precisa saber é o seguinte
Obrigado pelo seu comentário, você está certo. Eu removi o tempo que levou para o meu texto original.
NDB
2

Você pode querer dar uma olhada no projeto compositepi (divulgação completa: sou o autor). Destina-se a disparar capturas de vários Pi's com módulos de câmera e usa pacotes de transmissão UDP para fazer com que todos sejam disparados o mais próximo possível. Um daemon é executado em cada Pi, que aciona a câmera e dispara capturas ao receber um pacote UDP contendo o comando CAPTURE (outros comandos estão disponíveis para configurar a câmera; o protocolo está bastante bem documentado ). Uma configuração usando Ethernet é ideal, mas o wifi também funcionará, embora você possa ter que usar a funcionalidade de atraso de tempo para obter uma sincronização decente nesse caso (devido à perda de pacotes / latência variável).

Não posso dizer que foi testado com 100 Pi's - no momento, a maior configuração que o envolve envolve 20, mas eu estaria interessado em ouvir sobre qualquer problema que envolva escalas maiores.

O projeto inclui um cliente de linha de comando , um cliente GUI (escrito em Qt, para que funcione no Linux / Mac / Windows, mas só foi testado no Ubuntu neste momento, e ainda não está documentado) e uma biblioteca de cliente baseada em Python para escrevendo trabalhos em lote.

Dave Jones
fonte
Não estou muito preocupado com a parte da UDP nem com o cliente (não quero controlá-los manualmente, eles são controlados por um projeto muito maior), mas o compositepi usa algo que leva quase a captura instantânea ou também tem um atraso como raspistill?
Ronan Thibaudau
Dave, parece que você é o autor de projetos que giram em torno do que eu preciso. Existe alguma chance de termos uma discussão por Skype ou e-mail?
Ronan Thibaudau
Certamente - fazer sentir-se livre para me enviar e-mail diretamente (o meu endereço de e-mail deve visível no meu perfil GitHub )
Dave Jones
11
Ah, e na sua outra pergunta: é quase instantâneo. Quando o daemon compositepi é iniciado, ele inicializa e configura a câmera (que é a origem de muitos atrasos no raspistill) e aguarda um comando de captura. O comando capture pode causar instantaneamente uma captura ou aguardar até um carimbo de data / hora especificado antes da captura. No caso instantâneo, o atraso entre o recebimento do comando e a captura deve ser milissegundos.
18715 Dave
Dave Jones, essa ideia de inicializar a câmera antes de fazer a captura, pode dar mais informações? Podemos fazer isso a partir da linha de comando?
Ollie