Optická detekce otvorů v PCB

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.