5.30. Pencocokan template¶
Detektor yang telah dibahas sejauh ini menjawab pertanyaan tentang isi satu bingkai: di mana blob berada, ke mana garis menuju, apa yang tercetak pada kode. Kelas pertanyaan yang berbeda membandingkan satu citra dengan citra lain. Apakah wilayah ini dari bingkai yang diambil terlihat seperti patch referensi yang saya simpan saat kalibrasi? Metode pencocokan menjawab pertanyaan tersebut.
Analisis tonal dan statistik memperkenalkan get_similarity() untuk pertanyaan terkait -- seberapa mirip dua citra berukuran sama ini secara keseluruhan? -- dengan SSIM sebagai metrik dasarnya. Pertanyaan pencocokan yang tersisa adalah lokalisasi: bukan "seberapa mirip dua citra ini" melainkan "di mana di dalam citra yang lebih besar ini patch yang lebih kecil itu muncul?" Alat yang tepat untuk pertanyaan lokalisasi adalah pencocokan template.
5.30.1. Pemanggilan dasar¶
find_template() mencari tempat pertama di mana citra template kecil muncul di dalam bingkai yang diambil. Implementasinya menggunakan korelasi silang ternormalisasi (NCC): template menggeser melintasi bingkai, skor kecocokan per posisi dihitung dari korelasi antara piksel template dan piksel bingkai yang mendasarinya (ternormalisasi terhadap rata-rata dan variansi lokal sehingga perubahan gain tidak mengacaukan kecocokan), dan posisi pertama yang skornya melampaui threshold dikembalikan sebagai kotak pembatas:
template = image.Image("/sdcard/template.bmp", copy_to_fb=False)
template.to_grayscale()
match = img.find_template(template, threshold=0.7,
search=image.SEARCH_DS)
if match is not None:
img.draw_rectangle(match, color=(255, 0, 0))
Metode ini hanya bekerja pada citra skala abu-abu. Ambil gambar dalam skala abu-abu (pilihan alami untuk kamera mana pun tanpa sensor warna), atau konversi di tempat melalui to_grayscale() sebelum pemanggilan. Hal yang sama berlaku untuk template yang dimuat dari disk: template berwarna dikonversi dengan metode yang sama, hasilnya adalah yang diharapkan oleh pencocok.
threshold adalah float dari 0.0 hingga 1.0. Nilai 1.0 menuntut kecocokan piksel-per-piksel yang sempurna (yang tidak pernah terjadi pada citra yang diambil nyata), 0.0 menerima apa saja, dan nilai antara 0.6 dan 0.8 mencakup kasus umum di mana template diambil di bawah pencahayaan serupa dan pemandangan tidak berubah secara dramatis. Naikkan ambang batas untuk menekan false positif; turunkan untuk menerima kecocokan yang lebih noisy dengan risiko lebih banyak hasil yang spurious.
5.30.2. Strategi pencarian¶
search memilih antara dua strategi. image.SEARCH_EX adalah pencarian exhaustive: template menggeser melalui setiap posisi step-piksel dalam bingkai dan mengembalikan hit pertama di atas ambang batas. image.SEARCH_DS adalah pencarian berlian: pencocok mengambil sampel secara kasar terlebih dahulu, lalu mempersempit sekitar skor terbaik, yang secara dramatis lebih cepat tetapi dapat melewatkan kecocokan sejati jika pass kasar kebetulan mendarat dekat maksimum lokal yang mengalahkan yang global. Untuk pipeline real-time di mana template sudah terdefinisi dengan baik dan tidak mungkin tertukar, SEARCH_DS adalah default yang tepat; untuk kalibrasi satu kali di mana biaya kegagalan lebih tinggi dari biaya pemindaian yang lebih lambat, SEARCH_EX lebih aman.
step mengontrol lompatan piksel selama pass exhaustive (pencarian berlian mengelola langkahnya sendiri). Nilai step yang lebih besar mempercepat pemindaian dengan mengorbankan akurasi sub-piksel. roi membatasi pencarian pada wilayah bingkai, baik mempersempit apa yang dipertimbangkan pencocok maupun mengurangi pekerjaan.
Nilai yang dikembalikan adalah tuple kotak pembatas (x, y, w, h) yang mengidentifikasi kecocokan terbaik, atau None jika tidak ada posisi yang melampaui ambang batas. Kotak pembatas langsung dapat dimasukkan ke draw_rectangle() atau crop() untuk tahap pemrosesan berikutnya.
5.30.3. Jebakan skala dan rotasi¶
Jebakan klasik dengan pencocokan template adalah sensitivitas skala dan rotasi. Pencocok membandingkan template terhadap bingkai piksel-per-piksel; template yang diambil pada satu jarak tidak cocok dengan objek yang sama yang diambil pada jarak berbeda, dan template yang diambil lurus ke depan tidak cocok dengan objek yang sama yang dilihat dari sudut miring. Ambang batas secara diam-diam turun di bawah tingkat pencocokan bahkan ketika objek terlihat jelas oleh mata manusia, dan metode mengembalikan None.
Beberapa solusi ada untuk kasus sederhana. Aplikasi dapat mengambil beberapa template pada skala yang berbeda dan menjalankan find_template() untuk masing-masing secara berurutan, menerima yang pertama yang melampaui ambang batas; biayanya bertambah seiring dengan jumlah template. Aplikasi dapat memproses bingkai terlebih dahulu dengan rotation_corr() atau transformasi polar (Transformasi Geometris) untuk menghilangkan rotasi yang mengganggu sebelum pencocokan berjalan; template yang dicocokkan masih harus cocok dengan geometri yang telah dikoreksi.
Idiom yang berguna untuk pipeline inspeksi QA adalah memasangkan pencocok template dengan penskoran kesamaan yang diperkenalkan analisis tonal dan statistik: find_template() menemukan lokasi bagian dalam bingkai yang diambil dan kotak pembatas yang dikembalikan dipotong dan diteruskan ke get_similarity() terhadap patch referensi. Langkah pencocokan template memutuskan di mana bagian berada; langkah penilaian kesamaan memutuskan apakah bagian tersebut dapat diterima. Kedua langkah berjalan setiap bingkai, ambang batas pada mean adalah gerbang lulus/gagal, dan kotak pembatas yang dicocokkan digambar kembali ke bingkai adalah pratinjau IDE yang diamati operator.