5.30. Sablonillesztés¶
Az eddig tárgyalt detektorok egyetlen képkocka tartalmáról válaszolnak meg kérdéseket: hol vannak a foltok, merre futnak a vonalak, mit mond egy nyomtatott kód. A kérdések egy másik osztálya egyik képet egy másikkal hasonlítja össze. Hasonlít-e a rögzített képkocka ezen része arra a referencia-foltra, amelyet a kalibrálás idején eltároltam? Az illesztési módszerek erre a kérdésre válaszolnak.
A tónusos és statisztikai elemzés bevezette a get_similarity() metódust egy rokon kérdéshez – mennyire hasonló összességében ez a két azonos méretű kép? –, ahol az SSIM az alapul szolgáló mérőszám. A fennmaradó illesztési kérdés a lokalizációs kérdés: nem az, hogy „mennyire hasonló ez a két kép”, hanem az, hogy „hol jelenik meg ez a kisebb folt ezen a nagyobb képen belül?” A lokalizációs kérdéshez a megfelelő eszköz a sablonillesztés.
5.30.1. Az alapvető hívás¶
A find_template() megkeresi az első helyet, ahol egy kis sablon kép megjelenik a rögzített képkockán belül. A megvalósítás normalizált keresztkorrelációt (NCC) használ: a sablon végigcsúszik a képkockán, a pozíciónkénti illesztési pontszámot a sablon képpontjai és az alattuk lévő képkocka-képpontok közötti korrelációból számítja ki (a helyi átlagokhoz és varianciákhoz normalizálva, hogy az erősítésváltozások ne tévesszék meg az illesztést), és az első olyan pozíció kerül visszaadásra határoló dobozként, amelynek pontszáma meghaladja a threshold értéket:
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))
A metódus csak szürkeárnyalatos képeken működik. Rögzíts szürkeárnyalatosan (ez a természetes választás bármely színérzékelő nélküli kameránál), vagy alakítsd át helyben a to_grayscale() segítségével a hívás előtt. Ugyanez vonatkozik a lemezről betöltött sablonra: egy színes sablon ugyanezzel a metódussal kerül átalakításra, és az eredmény az, amit az illesztő elvár.
A threshold egy lebegőpontos szám 0.0 és 1.0 között. Az 1.0 érték tökéletes képpontról képpontra illeszkedést követel meg (ami valós rögzített képeknél soha nem fordul elő), a 0.0 bármit elfogad, a 0.6 és 0.8 közötti értékek pedig a gyakori esetet fedik le, amikor a sablont hasonló megvilágítás mellett rögzítették, és a jelenet nem változott drámaian. Emeld a küszöbértéket a téves találatok elnyomásához; csökkentsd a zajosabb találatok elfogadásához, több hamis találat árán.
5.30.2. Keresési stratégia¶
A search két stratégia között választ. Az image.SEARCH_EX a kimerítő keresés: a sablon végigcsúszik a képkocka minden step képpontnyi pozícióján, és visszaadja az első küszöbérték feletti találatot. Az image.SEARCH_DS a gyémántkeresés: az illesztő először durván mintavételez, majd a legjobb pontszám körül finomít, ami drámaian gyorsabb, de elszalaszthat egy valódi találatot, ha a durva menet véletlenül egy olyan lokális maximum közelében ért földet, amely felülmúlja a globálisat. Olyan valós idejű feldolgozási láncnál, ahol a sablon jól meghatározott és valószínűleg nem összetéveszthető, a SEARCH_DS a megfelelő alapértelmezés; egy egyszeri kalibrálásnál, ahol egy elszalasztott találat költsége nagyobb, mint egy lassabb pásztázásé, a SEARCH_EX biztonságosabb.
A step szabályozza a képpontkihagyást a kimerítő menet során (a gyémántkeresés a saját lépését kezeli). A nagyobb step értékek felgyorsítják a pásztázást a képponton belüli pontosság rovására. A roi a keresést a képkocka egy területére korlátozza, egyszerre szűkítve azt, amit az illesztő figyelembe vesz, és csökkentve a munkát.
A visszaadott érték egy (x, y, w, h) határoló doboz tuple, amely a legjobb találatot azonosítja, vagy None, ha egyetlen pozíció sem haladta meg a küszöbértéket. A határoló doboz közvetlenül beilleszthető a draw_rectangle() vagy a crop() metódusba a feldolgozás következő szakaszához.
5.30.3. A méretarány- és forgáscsapda¶
A sablonillesztés klasszikus buktatója a méretarány- és forgásérzékenység. Az illesztő képpontról képpontra hasonlítja össze a sablont a képkockával; egy adott távolságban rögzített sablon nem illeszkedik ugyanahhoz az eltérő távolságban rögzített objektumhoz, és egy szemből rögzített sablon nem illeszkedik ugyanahhoz az objektumhoz, ha azt ferdén nézzük. A pontszám csendben az illesztési szint alá esik még akkor is, amikor az objektum nyilvánvalóan látható az emberi szem számára, és a metódus None értéket ad vissza.
Néhány kerülő megoldás létezik az egyszerű esetekre. Az alkalmazás több sablont is rögzíthet különböző méretarányokban, és sorban lefuttathatja a find_template() metódust mindegyikre, elfogadva az elsőt, amely meghaladja a küszöbértéket; a költség a sablonok számával arányosan nő. Az alkalmazás előfeldolgozhatja a képkockát a rotation_corr() segítségével vagy a poláris transzformációval (Geometriai transzformációk), hogy eltávolítsa a zavaró forgatást, mielőtt az illesztés lefut; az illesztett sablonnak továbbra is illeszkednie kell a korrigált geometriához.
A minőségellenőrzési láncoknál hasznos megoldás párosítja a sablonillesztőt a tónusos és statisztikai elemzés által bevezetett hasonlósági pontozóval: a find_template() megkeresi az alkatrészt a rögzített képkockán, és a visszaadott határoló dobozt kivágja, majd a referencia-folttal szemben átadja a get_similarity() metódusnak. A sablonillesztési lépés eldönti, hol van az alkatrész; a hasonlósági pontozási lépés eldönti, hogy az alkatrész elfogadható-e. A két lépés minden képkockán lefut, a mean küszöbértéke a megfelelt/nem felelt meg kapu, és a képkockára visszarajzolt illesztett határoló doboz az IDE előnézet, amelyet a kezelő figyel.