Pro plosnaky.cz jsem napsal algoritmus na detekci otvorů na obrazci plošných spojů. Jako vstupní data slouží obrázek tohoto typu: Důležité je, aby byl uprostřed vrtací plošky otvor. Někdy je problém text, někdy heat pady, snažím se při detekci false positive detekovat a vynechat.
Nejdříve dojde k převodu do černobílé podoby, kdy zůstanou bílé otvory a černý zbytek. To se provede pomocí floodfillu velkých ploch. Pokud má algoritmus problém, ručně dočistím černobílý meziprodukt.
Samotný algoritmu poté pracuje s černobílým obrazem. Detekce prochází po řádcích každý pixel a hledá přechod mezi barvami. Tím se najde nějaký bod v kruhu vrtání.
Potom se spustí floodfill od tohoto bodu a dojde tak k vyznačení celého obsahu kruhu. Tím je kruh zapsaný jako detekovaný. Zbývá zjistit střed kruhu, průměr vrtáku a zda-li se vůbec jedná o kruh.
Všechno je tvrdě zjednodušeno, je to záměrně napsáno pro čisté php, abych mohl pouštět algoritmus prakticky kdekoliv. Nevýhoda je nízká rychlost.
Výstupem floodfilu je počet pixelů, pracuje se s pevným DPI na vstupu, takže lze počet pixelů obsahu kruhu přepočítat na průměr vrtáku. Dále se zjistí krajní body (levý, pravý, horní, spodní) tohoto kruhu. Z těchno souřadnic se dá spočítat výška a šířka. Zde nastupuje detekce kruhovosti, kdy se hlídá s učitou tolerancí zda šířka odpovídá výšce.
Dalším krokem je z těchto údajů dopočítání středu. Od středu se provede čtyřsměrná (případně osmisměrná) detekce hranic. Pokud střed neleží ve středu kruhu, je vyřazen. Počítá se s přibližně stejným počtem pixelů do všech směrů od středu.
Tím je kruh kvalifikovaný a algoritmus pokračuje pixelem, kterým skončil. Pokud má již nějaký označený za zpracovaný tak ho přeskakuje.
Všechno pracuje s určitou tolerancí a je tedy potřeba počítat s tím, že průměr vrtáku nemusí 100% odpovídat. Většinou odpovídá 80%. Kompenzace se dají dělat v postprocesingu, buď modifikací převodní tabulky (detekovaný průměr na finální vrták) a nebo ručně označením a změnou velikosti. Výsledný produkt je na obrázku.
Ve finále se vygeneruje GCODE pro řízení CNC. Algoritmus se postará o dogenerování vrtáků od 2mm výše, kdy se finální průměr (řekněme 4mm) převede na N přímek ležících na kruhu a pro to se dogeneruje GCODE. Jako kouzlem tak vznikne jakýkoliv průměr vrtáku.
Na posledním obrázku můžete vidět, že umístění otvorů není vždy úplně přesné. Pracuje se v celočíselných hodnotách a s pevným dpi, takže občas to trochu body posune. Ve skutečnosti to není nijak velký problém, jedná se o zvětšený náhled. Případné chyby detekce upravím v GUI, kde mohu manipulovat s body.