Raspistill lambat dipicu?


18

Saya mencoba untuk memicu "banyak" raspberry bersama, saat menggunakan raspistill hanya untuk pengujian, saya bertanya-tanya mengapa mengambil gambar sangat lambat, saya membuat tes dan, pada saat yang sama ketika saya menekan enter pada perintah ini:

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

Saya memulai kronometer iPhone di depan kamera. Hasil? 7 detik, 09 (tapi tajam, jadi kecepatan rana dll baik-baik saja, saya tidak mendapatkan angka buram). Apa yang bisa saya lakukan untuk "tidak" mengambil X detik sebelum mengambil gambar? Saya akan menyinkronkan ratusan RPI dan saya tidak ingin beberapa dari mereka mengambil gambar pada jam 4 dan beberapa lainnya pada 10 detik jadi saya ingin memahami apa yang sedang terjadi di sana.

Jawaban:


5

Anda harus menjalankan proses kamera setiap saat.

Ini adalah satu-satunya cara saya dapat mencapai hasil (rata-rata) 50 ms. Saya mencari solusi di mana-mana. 1 detik terlalu lambat untuk proyek sensor gerak saya.

Proyek @Dave Jones membantu saya mengetahui cara melakukannya.

Hanya 2 file:

sebuah daemon, berjalan sepanjang waktu dan klien.

Dasmon adalah tempat Anda mengatur semua pengaturan kamera.

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

(di terminal kedua) 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)

Saya memposting jawaban ini karena saya menemukan ini di Google, mencoba menemukan jawaban sendiri. Saya tidak dapat menemukannya, jadi saya harus menggali beberapa proyek dan membuat sendiri sesuatu.


Ketika menghadapi masalah yang sama, saya datang dengan solusi yang sama, tetapi belum sempat menulis kode. Senang melihat ada orang lain yang mengalahkan saya!
Nick Coons

6

Anda harus menentukan batas waktu 0.

Dari bantuan raspistill

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

Untuk menguji berapa lama perintah untuk dieksekusi, Anda dapat menggunakan "waktu"

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

Ini menghapus batas waktu default 5 detik tetapi masalahnya adalah saya mendapatkan lebih dari itu, dari apa yang saya mengerti di forum tidak ada cara nyata menggunakan raspistill karena tidak mendapatkan gambar penundaan
Ronan Thibaudau

8
Dalam Raspberry saya, menentukan batas waktu 0 sepertinya berarti "tak terbatas", sementara menentukan batas waktu "1" tampaknya melakukan trik
MondKin

4
Selain itu, menggunakan waktu tunggu yang rendah tidak memberikan kamera waktu yang cukup untuk mengekspos kolektor, menghasilkan gambar yang gelap. Saya menemukan saya tidak bisa lebih rendah dari sekitar 300 sebelum gambar mulai menjadi gelap dan buram.
Cerin

2
Jika tidak benar-benar perlu tinggalkan -topsi. Karena @Cerin menyatakan ini, entah bagaimana, merusak gambar jika disetel terlalu rendah. Sejujurnya, dokumentasi Raspberry Pi memiliki informasi yang terlalu sedikit tentang opsi ini dan mengarah pada asumsi yang salah bahwa batas waktu adalah "penundaan" / "pemicu waktu" yang jelas tidak.
Flatron

4

Saya telah menentukan alias berikut di .bash_profile saya untuk memungkinkan pemotretan kamera yang mudah dan cepat:

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

Setiap kali saya mengetik shotpada baris perintah, gambar dengan cap waktu disimpan, misalnya shot-2016-02-27_0934.jpg.


1
Selamat datang di komunitas Raspberry Pi Stack Exchange! Bahkan dengan --timeout 1(?) Argumen saya akan terkejut jika itu yang cepat - tapi karena saya tidak (belum) mendapat sistem saya untuk keadaan seperti itu bahwa dibutuhkan snap-shot dari yang pernah mencoba untuk membuka front saya pintu saya tidak bisa memilih! 8-) Penggunaan baris perintah dengan baik (dengan asumsi jam telah disetel) - termasuk menempatkan stempel datetime dengan nilai paling signifikan terlebih dahulu sehingga urutan-alfa-numerik sama dengan urutan-urutan tanggal!
SlySven

1
~ $ time shot real 0m0.040s pengguna 0m0.010s sys 0m0.020s qed;)
NDB

1
Sayangnya, 0,040 detik jauh dari cepat menjadi benar .. Penggunaan perintah waktu di atas cacat, sebenarnya hanya akan mengukur waktu yang diperlukan untuk menetapkan variabel SHOTTIME, tidak menangkap gambar. Waktu sebenarnya adalah ~ 1 detik .
slackhacker

Terima kasih atas komentar Anda, Anda benar. Saya telah menghapus waktu yang diperlukan dari teks asli saya.
NDB

2

Anda mungkin ingin melihat proyek compoundpi (pengungkapan penuh: Saya penulisnya). Ini dimaksudkan untuk memicu tangkapan dari banyak Pi dengan modul kamera dan menggunakan paket siaran UDP untuk membuat semuanya memicu sedekat mungkin. Daemon berjalan pada setiap Pi yang mengaktifkan kamera dan memicu pengambilan setelah menerima paket UDP yang berisi perintah CAPTURE (perintah lain tersedia untuk mengonfigurasi kamera; protokolnya didokumentasikan dengan cukup baik ). Pengaturan menggunakan Ethernet sangat ideal, tetapi wifi juga akan berfungsi, meskipun Anda mungkin harus menggunakan fungsionalitas penundaan waktu untuk mendapatkan sinkronisasi yang layak dalam kasus itu (karena hilangnya paket / latensi variabel).

Saya tidak bisa mengatakan itu telah diuji dengan 100 Pi - saat ini pengaturan terbesar menggunakan 20 Pi, tapi saya akan tertarik untuk mendengar masalah yang melibatkan skala yang lebih besar.

Proyek ini mencakup klien baris perintah , klien GUI (ditulis dalam Qt sehingga harus bekerja pada Linux / Mac / Windows tetapi ini baru diuji pada Ubuntu pada saat ini, dan itu masih tidak berdokumen), dan perpustakaan klien berbasis Python untuk menulis pekerjaan batch.


Saya tidak terlalu khawatir tentang bagian udp atau klien (saya tidak ingin mengendalikan mereka dengan tangan, mereka dikendalikan oleh proyek yang jauh lebih besar) tetapi apakah compoundpi menggunakan sesuatu yang mendekati penangkapan instan atau apakah itu juga memiliki penundaan seperti raspistill?
Ronan Thibaudau

Dave, sepertinya Anda adalah penulis proyek yang berputar di sekitar apa yang saya butuhkan, apakah ada kemungkinan kita bisa melakukan diskusi Skype atau email?
Ronan Thibaudau

Tentu saja - jangan ragu untuk mengirim email langsung kepada saya (alamat email saya harus terlihat di profil GitHub saya )
Dave Jones

1
Oh, dan pertanyaan Anda yang lain: hampir instan. Ketika daemon compoundpi dijalankan, ia akan menginisialisasi dan mengkonfigurasi kamera (yang merupakan asal banyak penundaan dalam raspistill) kemudian menunggu perintah tangkap. Perintah penangkapan dapat secara instan menyebabkan penangkapan atau menunggu hingga cap waktu yang ditentukan sebelum mengambil. Dalam kasus instan, penundaan antara penerimaan perintah dan penangkapan harus dalam milidetik.
Dave Jones

Dave Jones, ide inisialisasi kamera sebelum mengambil tangkapan, dapatkah Anda memberikan lebih banyak info? Bisakah kita melakukan ini dari commandline?
Ollie
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.