5.30. Şablon eşleştirme¶
Şimdiye kadar ele alınan tespit ediciler, tek bir çerçevenin içeriği hakkındaki soruları yanıtlar: noktaların (blob) nerede olduğu, çizgilerin nereye gittiği, basılı bir kodun ne dediği. Farklı bir soru sınıfı ise bir görüntüyü başka bir görüntüyle karşılaştırır. Yakalanan çerçevenin bu bölgesi, kalibrasyon sırasında sakladığım referans yamaya benziyor mu? Eşleştirme yöntemleri bu soruyu yanıtlar.
Tonal ve istatistiksel analiz, ilgili bir soru için get_similarity() yöntemini tanıttı – bu iki aynı boyutlu görüntü genel olarak ne kadar benziyor? – altta yatan ölçüt olarak SSIM ile. Geriye kalan eşleştirme sorusu ise konumlandırma sorusudur: “bu iki görüntü ne kadar benziyor” değil, “o küçük yama bu daha büyük görüntünün neresinde görünüyor?” Konumlandırma sorusu için doğru araç şablon eşleştirmedir.
5.30.1. Temel çağrı¶
find_template(), küçük bir şablon görüntünün yakalanan çerçeve içinde ilk göründüğü yeri arar. Uygulama normalleştirilmiş çapraz korelasyon (NCC) kullanır: şablon çerçeve üzerinde kaydırılır, konum başına eşleşme puanı şablon pikselleri ile altta yatan çerçeve pikselleri arasındaki korelasyondan hesaplanır (kazanç değişikliklerinin eşleşmeyi yanıltmaması için yerel ortalamalar ve varyanslara göre normalleştirilir) ve puanı threshold değerini geçen ilk konum bir sınırlayıcı kutu olarak döndürülür:
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))
Bu yöntem yalnızca gri tonlamalı görüntülerde çalışır. Gri tonlamada yakalayın (renkli sensörü olmayan herhangi bir kamera için doğal seçimdir) ya da çağrıdan önce to_grayscale() ile yerinde dönüştürün. Aynısı diskten yüklenen şablon için de geçerlidir: renkli bir şablon aynı yöntemle dönüştürülür ve sonuç, eşleştiricinin beklediği şeydir.
threshold, 0.0 ile 1.0 arasında bir kayan noktalı değerdir. 1.0 değeri kusursuz, piksel-piksel bir eşleşme talep eder (gerçek yakalanan görüntülerle bu asla olmaz), 0.0 her şeyi kabul eder ve 0.6 ile 0.8 arasındaki değerler, şablonun benzer aydınlatmada yakalandığı ve sahnenin önemli ölçüde değişmediği yaygın durumu kapsar. Yanlış pozitifleri bastırmak için eşiği yükseltin; daha fazla sahte isabet pahasına daha gürültülü eşleşmeleri kabul etmek için düşürün.
5.30.2. Arama stratejisi¶
search iki strateji arasında seçim yapar. image.SEARCH_EX, kapsamlı aramadır: şablon çerçevedeki her step piksellik konumda kaydırılır ve eşiğin üzerindeki ilk isabeti döndürür. image.SEARCH_DS ise elmas aramadır: eşleştirici önce kabaca örnekler, sonra en iyi puanın çevresinde iyileştirir; bu çok daha hızlıdır ama kaba geçiş global maksimumu yenen yerel bir maksimumun yakınına denk gelirse gerçek bir eşleşmeyi kaçırabilir. Şablonun iyi tanımlandığı ve karıştırılma olasılığının düşük olduğu gerçek zamanlı bir hat için SEARCH_DS doğru varsayılandır; kaçırma maliyetinin daha yavaş bir taramanın maliyetinden daha yüksek olduğu tek seferlik bir kalibrasyon için SEARCH_EX daha güvenlidir.
step, kapsamlı geçiş sırasındaki piksel atlamasını kontrol eder (elmas arama kendi adımını yönetir). Daha büyük step değerleri, alt-piksel doğruluğu pahasına taramayı hızlandırır. roi, aramayı çerçevenin bir bölgesiyle sınırlayarak hem eşleştiricinin dikkate aldığı alanı daraltır hem de işi azaltır.
Döndürülen değer, en iyi eşleşmeyi tanımlayan bir (x, y, w, h) sınırlayıcı kutu demetidir ya da hiçbir konum eşiği geçmediyse None olur. Sınırlayıcı kutu, işlemenin bir sonraki aşaması için doğrudan draw_rectangle() veya crop() içine girer.
5.30.3. Ölçek ve döndürme tuzağı¶
Şablon eşleştirmedeki klasik tuzak ölçek ve döndürme hassasiyetidir. Eşleştirici şablonu çerçeveyle piksel-piksel karşılaştırır; bir mesafede yakalanan bir şablon, farklı bir mesafede yakalanan aynı nesneyle eşleşmez ve düz karşıdan yakalanan bir şablon, eksen dışından görülen aynı nesneyle eşleşmez. Nesne insan gözüne açıkça görünür olsa bile eşik sessizce eşleşme seviyesinin altına düşer ve yöntem None döndürür.
Basit durumlar için birkaç geçici çözüm vardır. Uygulama, farklı ölçeklerde birden fazla şablon yakalayıp her biri için sırayla find_template() çalıştırabilir ve eşiği geçen ilkini kabul edebilir; maliyet şablon sayısıyla ölçeklenir. Uygulama, eşleşme çalışmadan önce sorunlu döndürmeyi gidermek için çerçeveyi rotation_corr() veya polar dönüşümle (Geometrik dönüşümler) ön işleyebilir; eşleştirilen şablonun yine de düzeltilmiş geometriyle eşleşmesi gerekir.
QA-denetim hatları için yararlı bir kalıp, şablon eşleştiriciyi Tonal ve istatistiksel analizde tanıtılan benzerlik puanlayıcısıyla eşleştirir: find_template() yakalanan çerçevedeki parçayı bulur ve döndürülen sınırlayıcı kutu kırpılarak referans yamaya karşı get_similarity() yöntemine geçirilir. Şablon-eşleştirme adımı parçanın nerede olduğuna karar verir; benzerlik-puanı adımı parçanın kabul edilebilir olup olmadığına karar verir. İki adım her çerçevede çalışır, mean üzerindeki eşik geçti/kaldı kapısıdır ve çerçeveye geri çizilen eşleşmiş sınırlayıcı kutu, operatörün izlediği IDE önizlemesidir.