4.18. Birden çok sensör¶
Birkaç OpenMV Cam, aynı kart üzerinde iki görüntü sensörünü eşleştirir – en yaygın olarak bir FLIR® Lepton® termal sensörün yanında bir renkli kamera, ancak aynı yapı renk artı olay kartları ve gelecekteki herhangi bir çift sensörlü donanım için de geçerlidir. Her sensörün kendi piksel dizisi, kendi kontrol veri yolu vardır ve kendi hattını kendi çerçeve hızında çalıştırır. CSI API’si, uygulamanın her fiziksel sensör için bir CSI nesnesi örneklemesine izin vererek bunları kapsayacak şekilde genişler.
4.18.1. Hangi sensörün seçileceği¶
CSI kurucusu, kart üzerindeki belirli bir sensörü adlandıran bir cid bağımsız değişkeni alır. cid=-1 (varsayılan) birincil sensörü seçer; adlandırılmış cid sabitleri yonga kimliğine göre bir ikincili seçer:
import csi
csi_rgb = csi.CSI() # primary colour sensor
csi_thermal = csi.CSI(cid=csi.LEPTON) # FLIR® Lepton®
Her örnek kendi yapılandırmasına sahiptir – piksel formatı, çerçeve boyutu, pozlama / kazanç ayarları, çerçeve arabelleği (frame buffer) havuzu – ve diğerinden bağımsız olarak sıfırlanır, yapılandırılır ve okunur. Desteklenen ikincil sensörlere ait sabitler (LEPTON, GENX320 ve CSI başvurusunda listelenen diğerleri) uygulamanın ikincil bağlantı noktasında beklediği yongayı adlandırır; gerçek yonga eşleşmezse sürücü oluşturma işlemini başarısız kılar.
4.18.2. Her iki sensörden yakalama¶
Her sensör yakalama hattını diğerinden bağımsız olarak çalıştırır – renkli sensör saniyede otuz çerçeve verirken Lepton® dokuz çerçeve verebilir. Bu uyumsuzluğu ele almanın doğrudan yolu, daha hızlı sensörün döngüyü sürmesine izin vermek ve daha yavaş sensörü bloklamadan okumak, hazır olanı almak ve hiçbir şey olmadığında o yinelemeyi atlamaktır:
import csi
csi_rgb = csi.CSI()
csi_thermal = csi.CSI(cid=csi.LEPTON)
csi_rgb.reset() # powers the rail, pulses RESET
csi_rgb.pixformat(csi.RGB565)
csi_rgb.framesize(csi.QVGA)
csi_thermal.reset(hard=False) # I2C reconfigure only
csi_thermal.pixformat(csi.GRAYSCALE)
csi_thermal.framesize(csi.QQVGA)
while True:
rgb_img = csi_rgb.snapshot() # blocks for next colour frame
thermal_img = csi_thermal.snapshot(blocking=False) # returns None if not ready
if thermal_img is not None:
# process aligned colour + thermal pair
pass
else:
# process colour only on this iteration
pass
Bloklayan snapshot() döngünün hızını belirler; bloklamayan olan ise, önceki çağrıdan bu yana yeni bir tane geldiyse en son termal çerçeveyi, aksi halde None döndürür. Uygulama renkli sensörün çerçeve hızında çalışmaya devam eder ve Lepton® ne zaman bir tane üretirse bir termal çerçeve alır.
Karşıt desen – art arda iki bloklayan anlık görüntü – de işe yarar, ancak o zaman döngü iki sensörün hızlarından daha yavaş olanında çalışır ve daha hızlı sensörün hattı yinelemeler arasında durur. Uygulamanın aşağı akış işlemesinin gerçekte hangi hızı sürmek istediğine göre hangisini istiyorsanız onu seçin.
4.18.4. Akış kaynağının seçilmesi¶
İki sensörlü kameralarda iki CSI örneği bulunur ancak aralarında yine de yalnızca tek bir akış çerçeve arabelleği vardır. Bir kurucu bağımsız değişkeni, hangi sensörün çerçevelerinin önizlemeyi besleyeceğini seçer:
csi_rgb = csi.CSI() # primary
csi_thermal = csi.CSI(cid=csi.LEPTON,
stream=True) # preview source
stream=True adlandırılmış örneği kaynak yapar. Hiçbir stream= bağımsız değişkeni olmadan birincil sensör (cid=-1, varsayılan) kaynaktır; bir ikincil sensörün cid= değeriyle oluşturulan örnekler, açıkça stream=True geçirilmedikçe önizlemede sessiz kalır. Seçilmemiş sensör üzerinde snapshot() çağrıları yine o sensörün çerçeve arabelleklerine normal şekilde çerçeve yakalar – yalnızca önizlemeyi güncellemezler.