Kualitas gambar yang berbeda dari tangkapan kamera ke array dan jalur numpy

8

Kualitas pengambilan dari Pi Camera bervariasi saat ditangkap ke array numpy dan ketika ditangkap langsung ke jalur. Yang pertama memiliki lebih banyak warna merah muda daripada yang kemudian.

Mengapa demikian.?
Kode yang saya gunakan untuk mengambil gambar:

from picamera import PiCamera
import cv2
import time

camera = PiCamera()
camera.resolution = (1280, 720)
img = np.empty((720, 1280, 3), dtype=np.uint8)

start = time.time()
camera.capture(img, "bgr")
print("Trigger time: " + str(time.time() - start))
cv2.imwrite("array_capture.png", img)

start = time.time()
camera.capture("normal_capture.png")
print("Trigger time: " + str(time.time() - start))

Waktu yang diambil untuk mengambil gambar ke array numpy adalah setengah dari pengambilan jalur langsung. Jadi, apakah ini terkait dengan penghapusan citra?

Gambar Diambil ke array numpy: 0,71 detik Gambar diambil ke jalur: 1,52 detikGambar Dipotret ke array numpy

Gambar diambil ke jalur

harshatech2012
sumber
Letakkan waktu pemicu untuk numpy setelah menulis. Maka Anda benar-benar dapat membandingkan. Saya ingin tahu
jaromrax
@jaromrax Melakukan hal itu meningkatkan waktu pemicu sekitar 0,925 detik. Namun masih kurang dari itu untuk jalur capture.
harshatech2012
Mungkinkah itu masalah kompresi? Misalnya, mungkin cv2 tidak menggunakan pemfilteran tetapi picamera tidak. Berapa ukuran file output? Anda dapat mengecek dengan du normal_capture.pngdandu array_capture.png
Hunter Akins

Jawaban:

1

Menurut Dokumentasi Picamera di bagian 3.5 dari bagian resep dasar:

Anda mungkin ingin menangkap urutan gambar yang semuanya terlihat sama dalam hal kecerahan, warna, dan kontras (ini dapat berguna dalam fotografi timelapse, misalnya). Berbagai atribut perlu digunakan untuk memastikan konsistensi di beberapa pemotretan. Khususnya, Anda perlu memastikan bahwa waktu pencahayaan, keseimbangan putih, dan keuntungan kamera semuanya sudah diperbaiki:

Untuk memperbaiki waktu pemaparan, atur shutter_speedatribut ke nilai yang masuk akal. Secara opsional, tetapkan isoke nilai tetap. Untuk memperbaiki keuntungan eksposur, biarkan analog_gaindan digital_gaintentukan nilai yang masuk akal, lalu atur exposure_mode ke 'off'. Untuk memperbaiki keseimbangan putih, atur awb_modeke 'off', lalu atur awb_gainske tupel keuntungan (merah, biru).

Mungkin sulit untuk mengetahui nilai yang sesuai untuk atribut ini. Sebab iso, aturan praktisnya adalah bahwa 100 dan 200 adalah nilai yang masuk akal untuk siang hari, sementara 400 dan 800 lebih baik untuk cahaya rendah. Untuk menentukan nilai yang masuk akal bagi shutter_speedAnda, Anda dapat menanyakan exposure_speedatribut. Untuk mendapatkan eksposur, biasanya cukup menunggu hingga analog_gainlebih dari 1 sebelum exposure_modediatur ke 'off'. Akhirnya, untuk menentukan nilai-nilai yang masuk akal untuk awb_gains sekadar query properti sementara awb_modediatur ke sesuatu selain 'off'. Sekali lagi, ini akan memberi tahu Anda keseimbangan putih kamera yang ditentukan oleh algoritma keseimbangan otomatis otomatis.

Script berikut memberikan contoh singkat tentang mengkonfigurasi pengaturan ini:

from time import sleep
from picamera import PiCamera

camera = PiCamera(resolution=(1280, 720), framerate=30)
# Set ISO to the desired value
camera.iso = 100
# Wait for the automatic gain control to settle
sleep(2)
# Now fix the values
camera.shutter_speed = camera.exposure_speed
camera.exposure_mode = 'off'
g = camera.awb_gains
camera.awb_mode = 'off'
camera.awb_gains = g
# Finally, take several photos with the fixed settings
camera.capture_sequence(['image%02d.jpg' % i for i in range(10)])
Mat
sumber