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.3. Paylaşılan güç hatlarında sıfırlama

Bazı çift sensörlü kartlar her iki yongayı tek bir güç hattından çalıştırır veya bir sıfırlama hattını paylaşır. Bunlarda ilk reset() hattı yukarı getirir ve paylaşılan sinyali darbeler; diğer CSI örneklerindeki sonraki sıfırlamalar yalnızca kendi yongalarını yeniden programlamak ve komşuyu bir sıfırlamadan geçirmemek için hard=False geçirmelidir:

csi_rgb.reset()                        # primary -- powers the rail, pulses RESET
csi_thermal.reset(hard=False)          # secondary -- I2C reconfigure only

Bu yapıdaki bir ikincilde hard=True, yan etki olarak birincili yeniden sıfırlar ve uygulamanın daha önce uygulamış olduğu her türlü kurulumu geri alır. Her çift sensörlü kartın başvuru sayfası hatların paylaşılıp paylaşılmadığını belirtir.

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.