5.31. Pencocokan perpindahan¶
Pencocokan template menjawab di mana patch ini berada di dalam bingkai; penilaian kemiripan menjawab seberapa mirip kedua citra ini secara keseluruhan. Pertanyaan berbeda berada di antara keduanya: dua bingkai menunjukkan adegan yang sama, tetapi kamera (atau adegan) berpindah di antara keduanya -- seberapa jauh? Itulah masalah perpindahan, dan modul image menyelesaikannya dengan satu metode korelasi fase.
5.31.1. Perpindahan korelasi fase¶
find_displacement() memperkirakan penyelarasan rigid antara dua citra berukuran sama menggunakan korelasi fase -- metode domain frekuensi yang menjalankan transformasi Fourier cepat (FFT) pada setiap citra, mengkorelasi silang fasenya, dan menemukan puncak dalam hasilnya. Posisi puncak adalah translasi yang menyelaraskan dua citra:
d = img.find_displacement(template)
print("shift:", d.x_translation, d.y_translation,
" response:", d.response)
Objek Displacement yang dikembalikan membawa x_translation dan y_translation -- pergeseran piksel di setiap sumbu -- ditambah response, skor kepercayaan dari 0.0 hingga 1.0 di mana 1.0 adalah puncak yang sempurna. Menyaring deteksi di bawah response > 0.3 membuang hasil yang tidak valid di mana korelasi fase tidak pernah menemukan puncak yang bersih.
Baik rotation maupun scale masing-masing adalah 0.0 dan 1.0 dalam mode default; keduanya mengambil nilai nyata hanya ketika logpolar=True (lihat di bawah).
Metode ini memiliki dua kendala praktis. Yang pertama adalah dimensi pangkat dua: FFT yang menjadi inti korelasi fase paling cepat -- dan pada kamera, hanya didukung penuh -- pada ukuran seperti 32x32, 64x64, dan 128x128. Pengaturan paling bersih adalah menangkap pada salah satu ukuran tersebut secara langsung, dengan meneruskan resolusi ke framesize() sebagai tuple:
csi0.framesize((64, 64))
Aplikasi yang membutuhkan perpindahan dari bingkai yang lebih besar sebagai gantinya memotong patch pangkat dua dari wilayah yang diminati dan menjalankan pencocok pada patch tersebut.
Yang kedua adalah input berukuran sama: roi dan template_roi harus memilih lebar dan tinggi yang identik, atau pencocok menolak panggilan tersebut. Dua tangkapan dari kamera yang sama dengan konfigurasi yang sama memenuhi ini secara otomatis; bingkai yang ditangkap dibandingkan dengan referensi yang dimuat membutuhkan keduanya dipotong ke patch pangkat dua yang cocok terlebih dahulu.
5.31.2. Rotasi dan skala melalui log-polar¶
Mode default menemukan hanya translasi. Ketika dua bingkai juga berbeda dalam rotasi sekitar pusat yang dipilih atau dalam skala sekitar pusat yang sama, menjalankan korelasi fase pada proyeksi ulang log-polar dari setiap citra mengubah parameter-parameter tersebut menjadi translasi dalam sistem koordinat log-polar -- yang dapat dipulihkan oleh pencocok korelasi fase yang sama:
d = img.find_displacement(template, logpolar=True)
print("rotation rad:", d.rotation,
" scale:", d.scale,
" response:", d.response)
Dengan logpolar=True, metode ini menjalankan pipeline pencocokan yang sama terhadap citra yang diproyeksikan log-polar alih-alih aslinya. Bidang rotation dan scale dari hasil kembali terisi: rotation adalah sudut dalam radian antara dua bingkai, scale adalah faktor skala di antara keduanya. x_translation dan y_translation menjadi tidak bermakna dalam mode ini (translasi sepanjang sumbu log-polar tidak berkoresponden dengan translasi linier dalam sumber).
Kata kunci fix_rotation_scale=True mencakup kasus di antara: dua citra berbeda dalam translasi dan rotasi/skala, dan aplikasi hanya membutuhkan translasi setelah mengoreksi rotasi dan skala. Pencocok menjalankan pass log-polar terlebih dahulu untuk memulihkan rotasi dan skala, menerapkan inversnya ke salah satu citra, kemudian menjalankan pass translasi untuk memulihkan pergeseran yang tersisa. Flag ini hanya bermakna ketika logpolar=False -- ini meminta pencocok mode translasi untuk terlebih dahulu menghilangkan rotasi/skala.
Pola dari transformasi Polar -- Kartesius → polar → cocokkan -- adalah yang dilakukan find_displacement() dengan logpolar=True dalam satu panggilan. Aplikasi menyimpan patch log-polar referensi saat startup, menangkap dan mentransformasi log-polar setiap bingkai langsung, dan metode ini memulihkan perbedaan rotasi-dan-skala di antara keduanya. Untuk aplikasi yang membutuhkan pelacak yang tidak berubah terhadap rotasi dan skala -- robot docking yang kameranya miring dan memperbesar saat mendekati target, gimbal terstabilisasi yang perlu mengetahui bagaimana citra berotasi relatif terhadap referensi -- ini adalah konstruksi standar.
5.31.3. Penggunaan klasik¶
Penggunaan paling umum dari find_displacement() adalah estimasi gerak bingkai-ke-bingkai dalam pipeline yang memproses kamera yang bergerak. Kamera menangkap patch kecil pangkat 2 pada bingkai N, menangkap patch berukuran sama pada bingkai N+1, menjalankan find_displacement() pada keduanya, dan membaca pergeseran piksel di antara keduanya. Pergeseran tersebut adalah estimasi gerakan kamera (atau adegan, tergantung pada kerangka referensi mana yang penting) antara dua tangkapan, berguna untuk:
Penginderaan gaya optical-flow -- drone melayang dengan kamera yang menghadap ke bawah menggunakan perpindahan per-bingkai untuk memperkirakan gerakan lateralnya dan mengumpankannya kembali ke pengontrol penerbangan.
Stabilisasi citra -- perpindahan antara bingkai berurutan dikurangkan dari citra yang ditangkap sebelum direkam atau ditransmisikan, menghasilkan aliran video yang lebih mulus.
Penyelarasan inspeksi -- kamera pemindai yang bergerak di sepanjang konveyor menggunakan perpindahan per-bingkai untuk meregistrasi setiap bingkai terhadap yang berikutnya dan membangun tampilan gabungan dari seluruh bagian.
Setiap aplikasi tersebut mengambil bentuk yang sama: tangkap, pindahkan, akumulasikan ke dalam estimasi berjalan, tangkap lagi.