5.30. Dopasowywanie szablonów¶
Detektory omówione do tej pory odpowiadają na pytania dotyczące zawartości pojedynczej ramki: gdzie znajdują się plamy (blob), dokąd biegną linie, co mówi wydrukowany kod. Inna klasa pytań porównuje jeden obraz z drugim. Czy ten obszar przechwyconej ramki wygląda jak referencyjny fragment zapisany w czasie kalibracji? Na to pytanie odpowiadają metody dopasowywania.
Analiza tonalna i statystyczna wprowadziła metodę get_similarity() dla pokrewnego pytania – jak bardzo podobne są ogólnie te dwa obrazy o tych samych wymiarach? – z miarą SSIM jako podstawą. Pozostałe pytanie dopasowywania dotyczy lokalizacji: nie „jak podobne są te dwa obrazy”, lecz „gdzie wewnątrz tego większego obrazu pojawia się ten mniejszy fragment?” Właściwym narzędziem do pytania o lokalizację jest dopasowywanie szablonów.
5.30.1. Podstawowe wywołanie¶
find_template() szuka pierwszego miejsca, w którym mały obraz szablonu pojawia się wewnątrz przechwyconej ramki. Implementacja wykorzystuje znormalizowaną korelację krzyżową (NCC): szablon przesuwa się po ramce, wynik dopasowania dla każdej pozycji jest obliczany na podstawie korelacji między pikselami szablonu a leżącymi pod spodem pikselami ramki (znormalizowanej względem lokalnych średnich i wariancji, tak aby zmiany wzmocnienia nie zmyliły dopasowania), a pierwsza pozycja, której wynik przekracza threshold, jest zwracana jako ramka ograniczająca:
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))
Metoda działa wyłącznie na obrazach w skali szarości. Przechwytuj w skali szarości (naturalny wybór dla każdej kamery bez sensora kolorowego) lub przekonwertuj obraz w miejscu za pomocą to_grayscale() przed wywołaniem. To samo dotyczy szablonu wczytanego z dysku: kolorowy szablon jest konwertowany tą samą metodą, a wynik jest tym, czego oczekuje mechanizm dopasowywania.
threshold to liczba zmiennoprzecinkowa od 0.0 do 1.0. Wartość 1.0 wymaga idealnego dopasowania piksel po pikselu (co nigdy nie zdarza się przy rzeczywistych przechwyconych obrazach), 0.0 akceptuje cokolwiek, a wartości między 0.6 a 0.8 obejmują typowy przypadek, w którym szablon został przechwycony w podobnym oświetleniu, a scena nie zmieniła się drastycznie. Podnieś próg, aby ograniczyć fałszywe trafienia; obniż go, aby akceptować bardziej zaszumione dopasowania kosztem większej liczby przypadkowych trafień.
5.30.2. Strategia wyszukiwania¶
search wybiera między dwiema strategiami. image.SEARCH_EX to wyszukiwanie wyczerpujące: szablon przesuwa się przez każdą pozycję co step pikseli w ramce i zwraca pierwsze trafienie powyżej progu. image.SEARCH_DS to wyszukiwanie diamentowe: mechanizm dopasowywania najpierw próbkuje zgrubnie, a następnie udoskonala wynik wokół najlepszego rezultatu, co jest znacznie szybsze, ale może pominąć prawdziwe dopasowanie, jeśli zgrubny przebieg trafi w pobliże lokalnego maksimum przewyższającego maksimum globalne. W potoku czasu rzeczywistego, gdzie szablon jest dobrze zdefiniowany i mało prawdopodobne, by został pomylony, SEARCH_DS jest właściwym domyślnym wyborem; w jednorazowej kalibracji, gdzie koszt pominięcia jest wyższy niż koszt wolniejszego skanowania, SEARCH_EX jest bezpieczniejsze.
step kontroluje pomijanie pikseli podczas przebiegu wyczerpującego (wyszukiwanie diamentowe zarządza własnym krokiem). Większe wartości step przyspieszają skanowanie kosztem dokładności subpikselowej. roi ogranicza wyszukiwanie do obszaru ramki, zarówno zawężając to, co mechanizm dopasowywania bierze pod uwagę, jak i zmniejszając nakład pracy.
Zwracaną wartością jest krotka ramki ograniczającej (x, y, w, h) identyfikująca najlepsze dopasowanie lub None, jeśli żadna pozycja nie przekroczyła progu. Ramka ograniczająca trafia bezpośrednio do draw_rectangle() lub crop() na potrzeby kolejnego etapu przetwarzania.
5.30.3. Pułapka skali i obrotu¶
Klasyczną pułapką dopasowywania szablonów jest wrażliwość na skalę i obrót. Mechanizm dopasowywania porównuje szablon z ramką piksel po pikselu; szablon przechwycony z jednej odległości nie pasuje do tego samego obiektu przechwyconego z innej odległości, a szablon przechwycony na wprost nie pasuje do tego samego obiektu widzianego pod kątem. Próg po cichu spada poniżej poziomu dopasowania, nawet gdy obiekt jest wyraźnie widoczny dla ludzkiego oka, a metoda zwraca None.
Dla prostych przypadków istnieje kilka rozwiązań obejściowych. Aplikacja może przechwycić wiele szablonów w różnych skalach i uruchomić find_template() dla każdego po kolei, akceptując pierwszy, który przekroczy próg; koszt skaluje się z liczbą szablonów. Aplikacja może wstępnie przetworzyć ramkę za pomocą rotation_corr() lub transformacji biegunowej (Transformacje geometryczne), aby usunąć problematyczny obrót przed uruchomieniem dopasowania; dopasowywany szablon nadal musi pasować do skorygowanej geometrii.
Użytecznym wzorcem dla potoków kontroli jakości jest połączenie mechanizmu dopasowywania szablonów z miarą podobieństwa wprowadzoną w Analizie tonalnej i statystycznej: find_template() lokalizuje element w przechwyconej ramce, a zwrócona ramka ograniczająca jest wycinana i przekazywana do get_similarity() w porównaniu z referencyjnym fragmentem. Krok dopasowania szablonu decyduje, gdzie znajduje się element; krok oceny podobieństwa decyduje, czy element jest akceptowalny. Oba kroki wykonują się dla każdej ramki, próg na mean jest bramką zaliczenia/niezaliczenia, a dopasowana ramka ograniczająca narysowana z powrotem na ramce jest podglądem w IDE, który obserwuje operator.