Využitie vizuálnych systémov na navigáciu mobilného robota (OpenCV)

Článok sa zaoberá možnosťami využitia vizuálnych systémov na navigáciu mobilného robota. Predpokladá sa pri tom, že daný mobilný robot nevyužíva počas navigácie okrem vizuálnej informácie žiadne iné doplnkové informácie o prostredí (nepoužíva prídavné snímače). Snaží sa splniť svoj cieľ na základe toho, čo „vidí", teda čo nasníma z kamery.

Z toho je zrejmé, že sa budeme zaoberať rôznymi metódami spracovania obrazu a snažiť sa získať čo najviac vizuálnych informácií, aby sa na základe nich mohol riadiť robot. Predtým si však treba definovať ciele práce - čo z obrazu bude pre navigáciu robota dôležité.

Na prácu s obrazom sa využíva OpenCV (Open Source Computer Vision Library), voľne dostupná open source knižnica do C/C++ od firmy Intel. Je optimalizovaná a určená na real - time aplikácie.

Ciele práce

Cieľom bude navrhnúť aplikáciu, ktorej výstupom bude dostatočný počet informácií použiteľných na navigáciu robota.

Definujeme si značky, ktoré robot bude musieť detegovať a identifikovať v prostredí a budú pre neho znamenať nejaký povel. Pri výbere značiek hrá rozhodujúcu úlohu ich tvar prípadne farba - tieto vlastnosti určujú výber metód počítačového videnia, ktorými sa dajú dané značky v priestore detegovať. Ak chceme, aby robot mohol pracovať v bežnom (tzn. farebne členitom) prostredí, mali by sme vybrať farby značiek také, ktoré sa v bežnom priestore menej často vyskytujú. Skúsme si na začiatok zvoliť dve značky: modrú kružnicu a červený obdĺžnik. Úlohou bude detegovať ich v priestore, identifikovať a skúsiť určiť vzdialenosť od nich a polohu. Tieto informácie môžu byť neskôr využité na navigáciu robota ku značkám a v prípade použitia viacerých týchto značiek aj na vyznačenie trasy robota.

Analýza problému

Správne rozpoznanie značiek je postupnosť viacerých na seba nadväzujúcich krokov. Existuje niekoľko metód, ako v obraze detegovať spomenuté tvary. Pre náš prípad je výhodné vybrať len užitočné body z obrazu hneď po jeho nasnímaní. Výber dôležitých bodov sa zjednodušuje tým, že poznáme farbu značiek, ktoré v obraze hľadáme. Samozrejme nemôžeme predpokladať, že po výbere modrej alebo červenej farby nám v obraze zostanú len značky a nič iné. Prostredie, v ktorom sa robot bude nachádzať môže obsahovať aj iné objekty rovnakej farby ako sú značky, preto treba navrhnúť algoritmy, ktoré dokážu rozoznať tvar objektov, ktoré v obraze zostanú a tiež detegovať potrebné objekty. Stručný postup rozpoznávania by teda mohol byť nasledovný:

1. Filtrovanie obrazu (modrá a červená farba)

2. Prevod obrazu na šedo tónový

3. Detekcia kružníc a priamok

4. Určenie obdĺžnika z detegovaných priamok

5. Určenie vzdialenosti od kružnice a obdĺžnika

6. Určenie polohy voči značkám

Na detekciu kružníc a priamok (bod č. 3) budeme používať Houghovu transformáciu. Ďalej sa budeme ešte zaoberať hľadaním funkcií OpenCV, ktoré dokážu realizovať naše kroky spracovania obrazu. Uvedieme si stručný popis týchto funkcií a aplikujeme ich do našej práce. Výhodou použitia OpenCV bude hlavne rýchlosť spracovania obrazu, ktoré by malo prebiehať v reálnom čase.

Riešenie

V tejto časti si opíšeme všetky kroky navrhnutého postupu a budeme sa snažiť prispôsobiť ich potrebám ďalších krokov, aby sme nakoniec dostali použiteľný výsledok.

Filtrácia obrazu

Filtrácia je založená na výbere určitých farieb z obrazu a z vynechania ostatných nepotrebných farieb.

Pri snímaní obrazu kamerou dochádza k rôznym skresleniam a na obraz pôsobí aj šum. Nemusí to badateľne ovplyvniť informácie, ktoré obraz obsahuje, ale v niektorých prípadoch môže sťažiť návrh algoritmov spracovania obrazu. V prípade filtrovania sa nemôžme zamerať na výber len jednej farby z obrazu, ale musíme vybrať určitý rozsah farieb. Po nasnímaní obrazu kamerou zistíme, že červená (alebo modrá) farba v ploche značky sa mení v nejakom rozsahu. Čiže značka nepozostáva z jednej farby, ale z viacerých (odtiene červenej alebo modrej farby). Farba nasnímaného objektu veľmi závisí aj od osvetlenia v priestore. Tá istá červená (alebo modrá) farba sa javí inak, ak je intenzita svetla vysoká a inak, ak je intenzita svetla nízka.

Z toho vyplýva, že nemôžeme filter nastaviť na jediný rozsah, ale musíme navrhnúť filter, ktorý sa dokáže prispôsobiť svetelným podmienkam a ponechá v obraze práve ten potrebný rozsah farieb, z ktorých sa skladá značka v nasnímanom obraze a ostatné farby z obrazu vynechá. Tu nastupuje troška teórie, lebo nastavenie takéhoto filtra nie je až taký jednoduchý problém.

Reprezentácia farieb v množine RGB a histogramy

Farebný model RGB asi netreba predstavovať. Farby modelu vznikajú kombináciou troch základných zložiek (červená - R, zelená - G, modrá - B). Pri maximálnej hodnote jasu všetkých zložiek vzniká biela farba a pri nulovej hodnote jasu všetkých zložiek vzniká čierna farba. Na nasledujúcich obrázkoch je znázornená RGB kocka z rôznych uhlov pohľadu s krokom jasu jednotlivých zložiek 12.

obr1

Obr. 1 RGB kocka s krokom jasu farebných zložiek 12

My budeme v obraze hľadať modrú a červenú farbu. Ale nevieme presne ktorý odtieň, lebo pri slabom osvetlení modrá a červená značka prechádza do tmavších odtieňov a pri silnom osvetlení do bledších.

Uvažujme teraz, že pracujeme s modrou značkou. To isté bude platiť aj pre červenú, len budeme na inej pozícii v RGB kocke.

V nasnímanom obraze nebude mať každý pixel modrej značky rovnaké hodnoty RGB. Tieto hodnoty sa budú pohybovať v nejakom rozsahu a v závislosti od osvetlenia sa rozsahy zložiek budú ešte posúvať na jednotlivých osiach RGB kocky a navyše sa budú zmenšovať alebo zväčšovať. Tieto zmeny sú matematicky ťažko opísateľné, závisia aj od typu kamery (skreslenia), šumu a iných vplyvov. Ak chceme jednoduchšie vytvoriť univerzálny farebný filter použiteľný pre rôzne druhy kamier, musíme sa vybrať iným smerom.

Preštudujme si dôkladnejšie RGB kocku. Ak sa v nej chceme pohybovať tak, že stále sa budeme držať modrej farby, zistíme, že hodnota zložky B bude stále vyššia ako sú zvyšné hodnoty R a G. Je to logické - ak chceme vytvoriť modrú farbu, musí v zložkách RGB prevládať práve modrá zložka, inak by sme prešli do inej farby. Toto zistenie je viac - menej samozrejmé, ale neskôr v práci to môžeme využiť na zrýchlenie nastavovania filtra. Stále nám ešte chýba spôsob ako nastaviť filter tak, aby rozsahy zložiek vyhovovali práve nasnímanému obrazu.

Kľúčom k úspechu by mohli byť histogramy. V našom prípade je histogram stĺpcový graf, ktorý pre každú hodnotu jasu jednotlivých zložiek RGB znázorňuje množstvo pixlov daného jasu v obraze. Pre jednoduchosť si zoberme modrú zložku. Rozdelenie hodnôt jasu je od 0 do 255. Nasnímaný obraz si rozdelíme na RGB zložky a spočítame počet pixlov modrej zložky s hodnotou jasu 0 až po hodnotu jasu 255. To isté môžeme urobiť pre ostatné dve zložky (zelená a červená) a vzniknú nám tri histogramy. Pri nastavovaní filtra budeme využívať získané histogramy. Treba poznamenať, že histogram by mal byť vytvorený z obrazu, v ktorom sa nachádza značka, ktorú chceme neskôr rozpoznať. Príklad histogramov je na Obr. 2., kde je nasnímaný obraz rozložený na kanály RGB a pre každý kanál je vytvorený histogram.

obr2

Obr. 2 Histogramy pre RGB kanály nasnímaného obrazu

Lokálne maximá jednotlivých histogramov predstavujú najčastejší výskyt pixlov daných odtieňov v obraze. Globálne maximum ale nemusí predstavovať farebný rozsah značky. Záleží to od toho, ako blízko je značka ku kamere - teda akú časť z celkového nasnímaného obrazu zaberá. Preto pri nastavovaní filtra treba preskúmať každé lokálne maximum. Ako už bolo spomenuté, filter sa nebude skladať len z jednej farby, ale z určitého rozsahu farieb. Ak sa pozrieme na histogramy, tak tieto rozsahy farieb môžu predstavovať jednotlivé „kopčeky" v nich. Je teda vysoko pravdepodobné, že ak z každého histogramu vyberieme ten správny „kopček", vo vyfiltrovanom obraze nám zostane práve značka. Definujme si teraz presne, čo znamená náš „kopček". Je to rozsah v histograme, ktorého začiatok je v mieste, kde hodnoty v histograme začínajú stúpať. Lokálne maximum je potom miesto, kde sa stúpanie mení na klesanie. Koniec rozsahu je miesto ďalšieho stúpania alebo nulovej hodnoty (je to vlastne začiatok nového rozsahu).

Ak podľa tohto opisu budeme cyklicky hľadať rozsahy v jednotlivých histogramoch (kanáloch obrazu) a podľa týchto rozsahov nastavíme farebný filter, pri niektorej z možných kombinácií nám v obraze zostane len značka. Skombinovať každý rozsah s každým (z troch histogramov) zaberie dosť veľa času. Vyššie uvedený poznatok, že pri hľadaní modrej značky hodnota modrej zložky v obraze bude prevyšovať hodnoty ostatných zložiek, pomôže ušetriť čas.

Funkcie OpenCV, ktorými môžeme realizovať farebný filter, sú cvCreateHist a cvCalcHist.

Aplikácia správne nastaveného farebného filtra je znázornená na Obr. 3. Na obrázku je vidieť, že zo vstupného obrazu nám po filtrácii zostala len značka, ktorú chceme detegovať.

obr3

Obr. 3 Ukážka správneho nastavenia farebného filtra

Detekcia kružnice a elipsy v obraze

Správna farebná filtrácia pomáha úspešne detegovať kružnicu v obraze a zrýchľuje detekciu. Úlohou filtrácie je rýchlo a v prvom kroku odstrániť nepotrebné veci z obrazu. Vyfiltrovaný obraz je vstupom do ďalších funkcií, ktoré v ňom detegujú kružnicu.

Samotná detekcia je dosť komplikovaný proces, ktorý môže byť riešený viacerými spôsobmi. Jedným z najvýhodnejších v prípade kružnice je získanie hrán z vyfiltrovaného obrazu a použitie Houghovej transformácie na jej rozpoznanie. Výhodou použitia Houghovej transformácie okrem iných je aj to, že po nájdení kružnice v obraze budeme mať k dispozícii údaje o polohe jej stredu a polomere. Tieto údaje bude možné využiť na odhad vzdialenosti od kružnice.

Ak kamera nie je priamo oproti značke, ktorú chceme detegovať, tak sa táto značka v nasnímanom obraze mení na elipsu. Aby sme v obraze mohli nájsť značku a využiť informácie na navigáciu aj v takomto prípade, musíme túto skutočnosť brať do úvahy. Je potrebné v obraze hľadať aj elipsu.

Na detekciu kružnice sa v OpenCV používa funkcia cvHoughCircles (má zabudovanú detekciu hrán) a využíva Houghovu transformáciu. Ale na detekciu elíps v OpenCV neexistuje funkcia, ktorá by využívala Houghovu transformáciu. Preto sa použije iný postup. V obraze sa nájdu kontúry (cvFindContours) a aproximujú sa elipsou (cvFitEllipse). Výsledok detekcie kružníc je na obr. 3 a detekciu elipsy znázorňuje obr. 4.

obr4

Obr. 4 Zmena tvaru značky v nasnímanom obraze na elipsu pri pohľade z boku a detekcia elipsy

Získané vlastnosti elipsy (dĺžky jednotlivých osí) sa môžu využiť na určenie polohy robota voči značke (hlavne uhol, o ktorý je robot posunutý voči značke) a polomer kružnice sa môže použiť na výpočet vzdialenosti od nej.

Detekcia obdĺžnika

Detekcia obdĺžnika je poslednou časťou tejto práce. Už bolo uvedené, že v obraze budeme okrem modrej kružnice hľadať aj červený obdĺžnik. Postup predspracovania obrazu je rovnaký ako bolo opísané v predošlých kapitolách a bolo aj uvedené, že sa dané algoritmy dajú využiť pri detekcii obdĺžnika. Konkrétne hovoríme o farebnom filtri a získaní hrán z obrazu. Pri detekcii obdĺžnika môžeme znova využiť Houghovu transformáciu, ale len na detekciu priamok. Po detekcii priamok v obraze vyhľadáme tie priamky, ktoré tvoria obdĺžnik. Využijeme pri tom matematické znalosti o rovnici priamky. Na detekciu obdĺžnika v obraze funkcia využíva poznatok, že každý obdĺžnik sa skladá zo štyroch priamok a každá dvojica priamok je na seba kolmá. Využíva aj poznatok o dĺžke uhlopriečky obdĺžnika. Vytvorený program cyklicky vyberá z poľa detegovaných priamok dve priamky a určuje ich priesečník. Priesečník priamok sa určuje z rovnice priamok. Program ďalej podľa Pytagorovej vety pri vykresľovaní obdĺžnika zisťuje, ktoré priesečníky má spojiť s čiarou (strany obdĺžnika) a ktoré nie (uhlopriečky obdĺžnika). V OpenCV sa používa na detekciu priamky funkcia cvHoughLines2(). Výsledok programu je znázornený na Obr. 5., ktorý okrem detekcie obdĺžnika znázorňuje aj detekciu kružnice.

obr5

Obr. 5 Detekcia kružnice (označené červenou) aj obdĺžnika (označené zelenou)

Zhodnotenie

Vytvorili sme aplikáciu na detekciu značiek kruhového a obdĺžnikového tvaru. Algoritmus pracuje spoľahlivo, keďže má možnosť automatického nastavenia farebného filtra pomocou prehľadávania lokálnych maxím histogramov z troch farebných kanálov obrazu. Táto metóda má svoje výhody (je schopná prispôsobiť sa hocijakej farbe značiek) a aj svoje nevýhody (v obraze sa môže detegovať aj iná kružnica alebo obdĺžnik, ktoré nie sú hľadanými značkami).

Samotná úloha detekcie značiek je doplnená viacerými dôležitými podúlohami, ktorých výsledkom sú údaje využiteľné na navigáciu mobilného robota. Tieto údaje sú napr. poloha stredu značiek v obraze (určuje polohu robota voči značke), polomer alebo plocha značiek (môže slúžiť na výpočet vzdialenosti od značky, ak poznáme skutočné údaje o polomere a ploche značiek), polomery elipsy pri bočnom pohľade na kruhovú značku (určuje uhol, o ktorý je robot posunutý voči stredovej osi značky).

Obrázky v tomto dokumente sú zároveň aj výsledkami experimentov na detekciu značiek. Ako je z nich vidieť, detekcia funguje správne a v obrázkoch sa vypisujú aj údaje využiteľné na navigáciu.

Potvrdila sa aj rýchlosť knižnice OpenCV, všetky značky je algoritmus schopný rozpoznať v reálnom čase dokonca aj pri pohybe kamerou.

Autori: Ing. Peter Pásztó, doc. Ing. Peter Hubinský, PhD.

Späť

Priemyselné utierky

MEWA - priemyselne_utierky