Raspistill tetiklemek için yavaş mı?


18

Raspistill'i sadece test etmek için kullanırken "birçok" ahududu birlikte tetiklemeye çalışıyorum, bir resim çekmenin neden bu kadar yavaş olduğunu merak ediyorum, bir test yaptım ve aynı zamanda bu komutta enter tuşuna bastığımda:

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

Kameranın önünde bir iPhone kronometresi başlatıyorum. Sonuç? 7 saniye, 09 (ama keskin, bu yüzden deklanşör hızı vb iyiydi, ben bulanık numara elde değildi). Fotoğraf çekmeden önce X saniye almaması için ne yapabilirim? Yüzlerce RPI senkronize edeceğim ve bazılarının 4 saniyede fotoğraf çekmesini ve 10 saniyede başkalarını çekmesini istemiyorum, bu yüzden orada neler olduğunu anlamak istiyorum.

Yanıtlar:


5

Kamera işleminin her zaman çalışır durumda olması gerekir.

50ms (ortalama) sonuçlarını elde etmenin tek yolu bu. Her yerde bir çözüm aradım. 1 saniye, hareket sensörü projem için çok yavaştı.

@Dave Jones'un projesi nasıl yapılacağını anlamama yardımcı oldu.

Sadece 2 dosya:

Daemon ve sürekli çalışan bir müşteri.

Arka plan programı tüm kamera ayarlarını yaptığınız yerdir.

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

(ikinci bir terminalde) 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)

Bu yanıtı gönderiyorum çünkü bunu Google'da buldum ve kendime bir cevap bulmaya çalışıyorum. Bir tane bulamadım, bu yüzden bazı projeleri araştırıp kendim bir şey bulmalıydım.


Aynı sorunla karşılaştığımda, aynı çözümü buldum, ancak henüz kodu yazmaya yakın bir yere ulaşamadım. Başkasının beni dövdüğünü gördüğüme sevindim!
Nick Coons

6

0 zaman aşımı süresi belirtmeniz gerekir.

Raspistill yardımından

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

Bir komutun yürütülmesinin ne kadar sürdüğünü test etmek için "zaman" kullanabilirsiniz

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

Bu 5 saniyelik varsayılan zaman aşımı kaldırır ancak sorun i forumunda anladığım gecikme görüntüleri almak için raspistill olarak kullanılarak gerçek yolu yoktur gelen i bundan daha alıyorum olduğunu
Ronan Thibaudau

8
Benim Ahududu, 0 zaman aşımı belirtmek "sonsuz" anlamına gelirken, "1" bir zaman aşımı belirtmek hile yapmak gibi görünüyor
MondKin

4
Ayrıca, bu kadar düşük bir zaman aşımı kullanılması, fotoğraf makinesinin toplayıcıları açığa çıkarmak için yeterli zaman vermez ve bu da karartılmış bir görüntüye neden olur. Görüntü kararmaya ve bulanıklaşmaya başlamadan önce yaklaşık 300'ün altına inemem.
Cerin

2
Çok gerekli değilse, -tseçeneği dışarıda bırakın . @Cerin'in belirttiği gibi, bu çok düşük ayarlanırsa görüntüyü bir şekilde yok eder. Dürüst olmak gerekirse, Raspberry Pi'nin belgeleri bu seçenek hakkında çok az bilgiye sahiptir ve zaman aşımının açıkça olmadığı basit bir "gecikme" / "zaman tetikleyicisi" olduğu yanlış varsayımına yol açar.
Flatron

4

Kolay ve hızlı kamera çekimlerine izin vermek için .bash_profile dosyamda aşağıdaki takma adı belirttim:

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

Ben yazdığınızda shotkomut satırında, zaman damgası ile bir görüntü, örneğin kaydedilir shot-2016-02-27_0934.jpg.


1
Raspberry Pi Stack Exchange topluluğuna hoş geldiniz! --timeout 1(?) Argümanı ile bile bu kadar hızlı olsaydı şaşırırdım - ama (henüz) sistemimi öyle bir duruma getirmedim ki, önümün kilidini kimin açmaya çalıştığını gösteren bir çekim kapı Gerçekten pick-nits olamaz! 8-) Komut satırının iyi kullanılması (saatin ayarlandığı varsayılarak) - datetime damgasını en önemli değerlerle ilk sıraya koymak da dahil olmak üzere, alfa-sayısal sıralama düzeni tarih sıralama düzeniyle aynıdır!
SlySven

1
~ $ çekim zaman gerçek 0m0.040s kullanıcı 0m0.010s sys 0m0.020s qed;)
NDB

1
0.040 saniye ne yazık ki gerçek olamayacak kadar hızlı .. Yukarıdaki zaman komutunun kullanımı kusurludur, aslında sadece SHOTTIME değişkenini atamak için geçen süreyi ölçecek, görüntüyü yakalayamayacaktır. Gerçek zaman ~ 1 saniyedir .
slackhacker

Yorumunuz için teşekkür ederim, haklısınız. Orijinal metnimde geçen süreyi kaldırdım.
NDB

2

Compositepi projesine bir göz atmak isteyebilirsiniz (tam açıklama: Ben yazarım). Kamera modülleriyle çok sayıda Pi'den yakalamayı tetiklemek için tasarlanmıştır ve hepsini mümkün olduğunca birbirine yakın hale getirmek için UDP yayın paketlerini kullanır. Kamerayı çalıştıran ve CAPTURE komutunu içeren bir UDP paketini aldıktan sonra yakalamaları tetikleyen her Pi üzerinde bir arka plan programı çalışır (kamerayı yapılandırmak için başka komutlar da mevcuttur; protokol oldukça iyi belgelenmiştir ). Ethernet kullanan bir kurulum idealdir, ancak wifi de işe yarayacaktır, ancak bu durumda iyi bir senkronizasyon elde etmek için zaman gecikmesi işlevini kullanmanız gerekebilir (paket kaybı / değişken gecikme nedeniyle).

100 Pi ile test edildiğini söyleyemem - şu anda bunu kullanan en büyük kurulum 20'yi içeriyor, ancak daha büyük ölçeklerle ilgili herhangi bir sorunu duymak isterim.

Proje, bir komut satırı istemcisi , bir GUI istemcisi (Qt ile yazılmış, bu yüzden Linux / Mac / Windows üzerinde çalışmalıdır, ancak bu noktada yalnızca Ubuntu üzerinde test edilmiştir ve hala belgelenmemiştir) ve Python tabanlı bir istemci kitaplığı içerir . toplu iş yazma.


Ben udp kısmı ne de müşteri hakkında çok endişelenmiyorum (onları elle kontrol etmek istemiyorum, çok daha büyük bir proje tarafından kontrol ediliyorlar), ancak bileşikpi anlık yakalamaya yakın bir şey kullanıyor veya ayrıca var mı Raspistill gibi bir gecikme mi?
Ronan Thibaudau

Dave, ihtiyacım olan şeylerin etrafında dönen projelerin yazarı gibisin, Skype veya e-posta tartışması yapma şansımız var mı?
Ronan Thibaudau

Kesinlikle - doğrudan bana e-posta göndermekten çekinmeyin (e-posta adresim GitHub profilimde görünmelidir )
Dave Jones

1
Oh, ve diğer sorunuzda: neredeyse anında. Bileşik daemon başlatıldığında, kamerayı başlatır ve yapılandırır (raspistill'de çok fazla gecikmenin geldiği yer), bir yakalama komutu bekler. Yakalama komutu anında bir yakalamaya neden olabilir veya yakalamadan önce belirtilen zaman damgasına kadar bekleyebilir. Mevcut durumda, komutun alınması ve yakalanması arasındaki gecikme milisaniye olmalıdır.
Dave Jones

Dave Jones, yakalamadan önce kamerayı başlatma fikri, daha fazla bilgi verebilir misiniz? Bunu komut satırından yapabilir miyiz?
Ollie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.