Raspberry Pi Camera - Kapan sudah siap untuk frame berikutnya

8

Saat menggunakan apis seperti api C ++ atau raspicam , Anda polling kamera dengan metode grab (), atau yang serupa,. Ketika sebuah bingkai siap, metode kembali. Apakah ada cara untuk memeriksa apakah kamera siap tanpa mengambil bingkai?

Ini bisa berupa alat baris perintah, panggilan C ++, pustaka python, secara harfiah metode apa pun.

Saya bertanya karena saya punya 4 raspberry pis dengan 4 kamera dan ingin mengambil video frame demi frame dengan setiap frame pada saat yang bersamaan. Kamera tidak cukup cepat untuk aplikasi saya melakukannya dengan cara lain.

pengguna2290362
sumber

Jawaban:

2

Saya pikir yang terbaik adalah menjawab pertanyaan ini dengan memberikan beberapa wawasan tentang bagaimana hal-hal bekerja sedikit lebih rendah. Pertama peringatan: Saya bukan ahli firmware oleh imajinasi; pemahaman saya yang agak kasar tentang cara kerja modul kamera Pi didasarkan pada pengalaman saya menulis perpustakaan picamera dan berinteraksi dengan pengembang firmware yang jauh lebih berpengetahuan di forum Pi. Jika Anda mendengar informasi kontradiktif dari para pengembang firmware, mereka yang berwenang dalam hal ini, bukan saya! Dengan itu keluar dari jalan ...

Segera setelah modul kamera Pi diinisialisasi, ia akan menangkap bingkai. Frame ini (sejauh menyangkut pengguna akhir) dibuang tetapi di dalam firmware kamera ada lebih banyak hal yang terjadi. Frame diukur untuk menentukan penguatan yang diterapkan pada sensor (AGC), keseimbangan putih untuk dimasukkan ke algoritma koreksi AWB, dll. Misalnya, jika Anda memulai kamera dan segera mulai merekam Anda biasanya akan melihat white-balance mengoreksi dirinya sendiri pada beberapa frame pertama dari rekaman:

import picamera
import time

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

Namun, jika Anda menunda sebelum mulai merekam Anda akan melihat bahwa keseimbangan putih stabil pada saat perekaman dimulai:

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

Jadi, mengingat bahwa kamera selalu menangkap bingkai bahkan ketika kita tidak mengambil gambar atau merekam video, apa yang sebenarnya terjadi ketika kita memilih untuk mengambil gambar? Kami memberi tahu firmware untuk mengaktifkan pengambilan, dan firmware menunggu bingkai berikutnya selesai sebelum meneruskannya kembali kepada kami (sebenarnya, jika Anda mengambil gambar dari port diam, bukan port video, ada banyak lagi yang terjadi termasuk mode beralih, tetapi Anda khawatir dengan port video jadi mari kita abaikan itu).

Pertimbangkan apa artinya ini untuk sinkronisasi (use case khusus Anda). Kamera tidak "siap" untuk mengambil bingkai pada titik tertentu. Ini sudah menangkap bingkai dan ketika Anda meminta satu itu akan memberi Anda yang lengkap berikutnya yang tersedia. Untuk menyinkronkan frame kamera, semua kamera harus diinisialisasi pada waktu yang sama, dan kemudian jam internal mereka harus berjalan tepat secara sinkron (kamera memiliki jam internal sendiri; mereka tidak bergantung pada Jam Pi).

Sayangnya, saya tidak berpikir ini benar-benar prospek yang realistis. Jika saya ingat dengan benar, modul penghitungan Pi (yang memiliki 2 port kamera terpasang dan mendukung 2 modul kamera secara bersamaan) menggunakan beberapa panggilan khusus dalam firmware untuk mendapatkan 2 modul menggunakan sinyal jam tunggal (saya tidak tahu bagaimana ini bekerja pada level perangkat keras tetapi saya menganggap itu menggunakan sesuatu yang spesifik untuk modul komputasi); Saya tidak bisa membayangkan bagaimana Anda akan melakukan sesuatu yang serupa di 4 Pis.

Memperbarui:

Saya harus menambahkan bahwa dimungkinkan untuk melakukan sinkronisasi kasar dengan beberapa pengetahuan jaringan yang wajar (mis. Paket siaran UDP). Dengan kata lain, dimungkinkan untuk mendapatkan semua Pi di jaringan untuk memicu penangkapan dalam satu milidetik satu sama lain (dengan asumsi jaringan latensi rendah yang layak seperti Ethernet), tetapi seperti dijelaskan di atas, masih tidak akan menjamin bahwa semua kamera akan benar-benar ambil bingkai pada saat yang sama; akan ada nilai keterlambatan bingkai (plus latensi jaringan) antara waktu mulai tangkapan yang dihasilkan.

Jika tingkat sinkronisasi itu cukup untuk orang, mereka mungkin ingin memeriksa proyek compoundpi yang merupakan proyek lain yang saya tulis di atas picamera hanya untuk tujuan ini.

Dave Jones
sumber
Dapatkah Anda memberi tahu tentang "sinkronisasi bingkai" multi-kamera dalam mode diam (bukan video). Saya kira sensor mungkin lagi berjalan dalam mode "berlari bebas" bahkan untuk diam, hanya dengan resolusi penuh dan FPS yang lebih rendah (mungkin 15 FPS? Yang akan memberikan frame lag lebih lama dari 30 video FPS). Apakah Anda dapat mengkonfirmasi asumsi ini? Saya tertarik pada solusi C ++ karena Python hanya menambahkan tingkat ketidakpastian waktu ...
Kozuch
Pada tahun-tahun berikutnya saya telah belajar sedikit lebih banyak dan mungkin harus memperbarui jawaban ini di beberapa titik. Sebagai permulaan, pernyataan bahwa ada sinkronisasi pada dua kamera modul hitung adalah salah: tidak ada, mereka baru saja mulai secara sinkron dan akhirnya (lebih dari beberapa jam) akan terpisah. Pada gambar diam, kamera mengalirkan frame hingga pengambilan tetapi kemudian mode beralih ke mode sensor 2 atau 3 (tergantung framerate) selama pengambilan.
Dave Jones
Saya telah menulis versi yang diperluas dari bab perangkat keras kamera untuk rilis picamera berikutnya berdasarkan umpan balik dari devs firmware kamera - mungkin layak dibaca (meskipun masih belum lengkap) karena mencakup beberapa detail ini.
Dave Jones
Dokumen Anda cukup banyak dibaca tetapi saya tidak memiliki sumber daya untuk menyelami mereka sekarang - saya hanya membaca cepat. Saya melihat ada mode video dan still (still port). Kami tahu tentang port video (sensor berjalan gratis) tetapi dapatkah Anda menjelaskan apa artinya port masih dan bagaimana cara kerjanya? Bisakah itu digunakan entah bagaimana untuk pemicu yang lebih tepat (lebih sedikit shutter shutter) yang mungkin port video? Saya bertanya raspicam C ++ devs untuk topik yang sama tetapi belum memiliki jawaban.
Kozuch
Tidak: port still hanyalah artefak MMAL yang menyebabkan saluran pencitraan yang berbeda pada GPU untuk menghasilkan output yang "lebih baik". Oleh karena itu, ketika menggunakan port diam untuk menangkap, mode sensor sementara diaktifkan, algoritma denoise yang lebih kuat digunakan, dll. Ini tidak akan memberi Anda perbedaan dalam shutter shutter (saklar mode mungkin akan menyulitkannya jika ada).
Dave Jones