5.31. Yer değiştirme eşleştirme

Şablon eşleştirme bu yamanın çerçevenin neresinde olduğu sorusuna yanıt verir; benzerlik puanlaması ise bu iki görüntünün genel olarak ne kadar benzediği sorusuna yanıt verir. Bunların arasında farklı bir soru durur: iki çerçeve aynı sahneyi gösteriyor, ama kamera (ya da sahne) bunların arasında hareket etti – ne kadar? Bu yer değiştirme (displacement) problemidir ve image modülü bunu tek bir faz korelasyonu yöntemiyle çözer.

5.31.1. Faz korelasyonlu yer değiştirme

find_displacement(), faz korelasyonu kullanarak aynı boyuttaki iki görüntü arasındaki katı hizalamayı tahmin eder – bu, her görüntü üzerinde bir hızlı Fourier dönüşümü (FFT) çalıştıran, fazlarını çapraz korele eden ve sonuçtaki tepeyi bulan bir frekans alanı yöntemidir. Tepe konumu, iki görüntüyü hizalayan ötelemedir:

d = img.find_displacement(template)

print("shift:", d.x_translation, d.y_translation,
      " response:", d.response)

Döndürülen Displacement, x_translation ve y_translation – her eksendeki piksel kayması – artı response taşır; bu, 0.0‘dan 1.0‘e kadar bir güven puanıdır; burada 1.0 kusursuz bir tepedir. response > 0.3 altındaki tespitleri elemek, faz korelasyonunun temiz bir tepe asla bulamadığı yanıltıcı sonuçları atar.

Varsayılan modda rotation ve scale sırasıyla 0.0 ve 1.0’dır; gerçek değerleri yalnızca logpolar=True olduğunda alırlar (aşağıya bakın).

Yöntemin iki pratik kısıtı vardır. Birincisi ikinin kuvveti boyutlardır: faz korelasyonunun kalbindeki FFT, 32’ye 32, 64’e 64 ve 128’e 128 gibi boyutlarda en hızlıdır – ve kamerada yalnızca tam olarak bu boyutlarda desteklenir. En temiz kurulum, çözünürlüğü framesize() yöntemine bir demet olarak geçirerek doğrudan bu boyutlardan birinde yakalamaktır:

csi0.framesize((64, 64))

Daha büyük bir çerçeveden yer değiştirmeye ihtiyaç duyan bir uygulama, bunun yerine önemsediği bölgeden ikinin kuvveti bir yama kırpar ve eşleştiriciyi onun üzerinde çalıştırır.

İkincisi aynı boyutta girdilerdir: roi ve template_roi özdeş genişlikler ve yükseklikler seçmelidir, yoksa eşleştirici çağrıyı reddeder. Aynı kameradan aynı yapılandırmada alınan iki yakalama bunu otomatik olarak karşılar; yüklü bir referansa karşı karşılaştırılan yakalanmış bir çerçevenin önce her ikisinin de eşleşen ikinin kuvveti yamalara kırpılması gerekir.

5.31.2. Log-polar ile dönüş ve ölçek

Varsayılan mod yalnızca öteleme bulur. İki çerçeve ayrıca seçilen bir merkez etrafında dönüş bakımından ya da aynı merkez etrafında ölçek bakımından farklılık gösterdiğinde, faz korelasyonunu her görüntünün log-polar yeniden izdüşümü üzerinde çalıştırmak, bu parametreleri log-polar koordinat sistemindeki ötelemeye dönüştürür – ki bunu aynı faz korelasyonu eşleştiricisi geri kazanabilir:

d = img.find_displacement(template, logpolar=True)

print("rotation rad:", d.rotation,
      " scale:", d.scale,
      " response:", d.response)

logpolar=True ile yöntem, aynı eşleştirme hattını özgün görüntüler yerine log-polar izdüşümü alınmış görüntülere karşı çalıştırır. Sonucun rotation ve scale alanları doldurulmuş olarak geri döner: rotation iki çerçeve arasındaki radyan cinsinden açıdır, scale aralarındaki ölçek faktörüdür. Bu modda x_translation ve y_translation anlamsız hâle gelir (log-polar eksenleri boyunca öteleme, kaynaktaki doğrusal bir ötelemeye karşılık gelmez).

fix_rotation_scale=True anahtar sözcüğü ortadaki durumu kapsar: iki görüntü hem öteleme hem de dönüş/ölçek bakımından farklılık gösterir ve uygulamanın dönüş ile ölçeği düzelttikten sonra yalnızca ötelemeye ihtiyacı vardır. Eşleştirici, dönüş ve ölçeği geri kazanmak için önce log-polar geçişini çalıştırır, görüntülerden birine tersini uygular, ardından kalan kaymayı geri kazanmak için öteleme geçişini çalıştırır. Bu bayrak yalnızca logpolar=False olduğunda anlamlıdır – öteleme modu eşleştiricisinden önce dönüşü/ölçeği soyutlamasını ister.

Polar dönüşümlerinden bilinen desen – Kartezyen → polar → eşleştirlogpolar=True ile find_displacement() yönteminin tek bir çağrıda yaptığı şeydir. Uygulama başlangıçta bir referans log-polar yama saklar, her canlı çerçeveyi yakalar ve log-polar dönüşümünü uygular, ve yöntem bunlar arasındaki dönüş-ve-ölçek farkını geri kazanır. Dönüşe ve ölçeğe değişmez bir izleyiciye ihtiyaç duyan uygulamalar için – bir hedefe yaklaşırken kamerası eğilen ve yakınlaşan bir kenetlenme robotu, görüntünün bir referansa göre nasıl döndüğünü bilmesi gereken sabitlenmiş bir gimbal – bu standart yapıdır.

5.31.3. Klasik kullanım

find_displacement() yönteminin en yaygın kullanımı, hareketli bir kamerayı işleyen bir hatta çerçeveden çerçeveye hareket tahminidir. Kamera N. çerçevede küçük bir ikinin kuvveti yama yakalar, N+1. çerçevede aynı boyutta yamayı yakalar, ikisi üzerinde find_displacement() çalıştırır ve aralarındaki piksel kaymasını okur. Bu kayma, iki yakalama arasında kameranın (ya da kimin referans çerçevesi önemliyse, sahnenin) tahmini hareketidir ve şunlar için yararlıdır:

  • Optik akış tarzı algılama – aşağı bakan kameralı bir havada asılı kalan dron, yanal hareketini tahmin etmek ve bunu uçuş denetleyicisine geri beslemek için çerçeve başına yer değiştirmeyi kullanır.

  • Görüntü sabitleme – ardışık çerçeveler arasındaki yer değiştirme, kaydedilmeden ya da iletilmeden önce yakalanan görüntüden çıkarılır ve daha akıcı bir video akışı üretilir.

  • İnceleme hizalaması – bir konveyör boyunca hareket eden tarayan bir kamera, her çerçeveyi bir sonrakine kaydetmek ve tüm parçanın dikilmiş bir görünümünü oluşturmak için çerçeve başına yer değiştirmeyi kullanır.

Bu uygulamaların her biri aynı biçimi alır: yakala, yer değiştir, çalışan bir tahmine biriktir, tekrar yakala.