4.17. Sensör ayar düğmeleri¶
pixformat() ve framesize() dışında, CSI sınıfı neredeyse her uygulamanın er ya da geç başvurduğu birkaç sensör başına denetim sunar – montaj yönelimi, pozlama, kazanç, beyaz dengesi ve birkaç hata ayıklama yardımcısı. Her biri daha önce ele alınan bir sensör kavramına doğrudan karşılık gelir; API yalnızca sürücünün alt katmanda yaptığı yazmaç yazımı için bir Python tutamacı sağlar.
Aşağıdaki yöntemlerin tümü alt katmandaki sensör üzerinde etki eder. Hepsi yazmaç yazımlarını sensörün I2C kontrol veri yolu üzerinden gönderir, dolayısıyla maliyet mikrosaniyeler düzeyindedir ve yeni ayar bir sonraki pozlamada – tipik olarak bir sonraki snapshot() çağrısında – etkili olur.
4.17.1. Yönelim¶
Kamera hangi tarafının yukarı bakacak şekilde monte edildiğini bilmez. Sensöre uygulanan iki çevirme bayrağı, herhangi bir piksel yongadan çıkmadan önce görüntüyü doğru yöne çevirir:
csi0.hmirror(True)
csi0.vflip(True)
hmirror() görüntüyü soldan sağa çevirir, vflip() ise yukarıdan aşağıya çevirir. Birlikte kullanıldıklarında pratikte karşılaşılan durumları kapsarlar: baş aşağı monte edilmiş bir kart (her iki bayrak da True), ön yüzeyi aynalanmış bir aynanın arkasındaki bir kart (yalnızca hmirror) veya aşağıdan yansıyan bir sahneye bakan bir kart (yalnızca vflip).
Çevirme işlemi sensörün okuma mantığında gerçekleştiğinden, CPU maliyeti ve bellek yükü yoktur – çerçeve, çerçeve arabelleğine (frame buffer) zaten doğru yönde gelir.
4.17.2. Pozlama¶
Pozlama, integrasyon süresidir – her pikseldeki fotodiyotun satır okunmadan önce ne kadar süre (mikrosaniye cinsinden) yük topladığıdır. Sürücü, sensörün otomatik pozlama döngüsü çalışır durumda başlar, böylece kamera ortalama piksel değerini bir hedefe yakın tutmaya çalışır. Döngüyü devre dışı bırakmak pozlamayı uygulamanın seçtiği bir değere sabitler:
csi0.auto_exposure(False, exposure_us=8000)
Sahne parlaklığı kararlı olduğunda ve uygulama öngörülebilir hareket bulanıklığına ya da eşikleme için çerçeveden çerçeveye tutarlı yoğunluğa ihtiyaç duyduğunda sabit pozlama doğru seçimdir. Mevcut pozlamayı geri okumak – ister döngü ister uygulama tarafından ayarlanmış olsun – ayrı bir çağrıdır:
us = csi0.exposure_us()
auto_exposure() yöntemini True ile ve herhangi bir pozlama değeri vermeden çağırmak, denetimi yeniden döngüye devreder.
4.17.3. Kazanç¶
Kazanç, piksel gerilimine ADC’ye ulaşmadan önce uygulanan, desibel cinsinden ifade edilen yükselticidir. Pozlama gibi, sürücü de otomatik kazanç döngüsü açık olarak başlar. Sıkça karşılaşılan iki örüntü vardır. Tavanı sınırlandırmak, döngünün aydınlatmaya uyum sağlamasına izin verirken loş sahnelerde gürültüyü sınırsızca yükseltmesini engeller:
csi0.auto_gain(True, gain_db_ceiling=16)
Sabit bir kazanç sabitlemek, uygulama aynı zamanda pozlamayı da sabitlediğinde doğru hamledir – renk takibi gibi piksel değerlerini çerçeveden çerçeveye karşılaştıran uygulamalar için kazanç kararlılığı önemlidir:
csi0.auto_gain(False, gain_db=0)
Mevcut kazanç gain_db() aracılığıyla geri okunur. Uygulama otomatik kazancı devre dışı bıraktığında, otomatik beyaz dengesini ve otomatik pozlamayı da devre dışı bırakmalıdır – aksi takdirde hâlâ devrede olan kontrol döngüleri görüntüyü sabit kazancı bozacak şekilde değiştirmeye devam eder.
4.17.4. Beyaz dengesi¶
Beyaz dengesi, beyaz bir nesnenin herhangi bir ışık renginde beyaz görünmesi için ISP’nin debayer aşamasından çıkan kırmızı, yeşil ve mavi kanallara uyguladığı kanal başına kazançtır. Otomatik beyaz dengesi döngüsü bu üç kazancı, ISP’nin her çerçevede topladığı bölge başına istatistiklerden hesaplar ve bir sonraki çerçevede uygular.
Çoğu uygulama döngüyü çalışır durumda bırakır. Renk takibi yaygın bir istisnadır – kazançlar aynı zamanda döngünün renkli bir nesneyi izlemek için değiştirdiği değerlerdir; dolayısıyla uygulama kırmızı bir nokta (blob) bulmaya çalışıyorsa, döngü sessizce kırmızı kanalı söndürür ve nokta artık eşleşmeyi durdurur. Döngüyü kilitlemek bunu giderir:
csi0.auto_whitebal(False)
Tekrarlanabilir renk kalibrasyonu için açık bir (r, g, b) demetini desibel cinsinden geçirin – kartlar ve oturumlar arasında aynı kazançlar:
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
Mevcut kazançlar rgb_gain_db() aracılığıyla bir demet olarak geri okunur.
4.17.5. Çerçeve hızı sınırı¶
Sensörler varsayılan olarak kendi doğal çerçeve hızlarında çalışır – çoğu parçada saniyede 30 ila 60 çerçeve, framesize yeterince küçük olduğunda yüksek hızlı sensörlerde çok daha yüksek. Hızı sınırlamak, uygulamanın kamerayı, alt akıştaki işlemenin yetişebileceği herhangi bir hıza kısmasına olanak tanır:
csi0.framerate(15)
Donanımsal hız kontrolünü destekleyen sensörlerde bu çağrı, çerçeve başına pozlama bütçesini de uzatır; bu da düşük ışıkta yardımcı olabilir; diğerlerinde ise sürücü, fazla çerçeveleri çerçeve arabelleği (frame buffer) düzeyinde basitçe atlar.
4.17.6. Test deseni¶
Renk çubuğu test deseni çoğu sensöre yerleşik olarak bulunur ve bir görüntüleme sorununu bir çıkış sorunundan ayırmak için yararlıdır. Onu açmak fotodiyot dizisini atlayıp aynı piksel veri yolundan sabit bir desen gönderir:
csi0.colorbar(True)
Test deseni doğru görünüyor ancak canlı görüntü görünmüyorsa, hata optikte veya sensörün analog ön ucundadır; test deseni bile bozuksa, sorun piksel veri yolunda bir yerdedir ya da pixformat() / framesize() yapılandırmasındadır. Canlı görüntüye dönmek için False geçirin.
Belirli sensör ailelerine özgü denetimleri açığa çıkaran sensöre özel ioctl() komutları da dahil olmak üzere tam API için csi.CSI sınıfına bakın.