• No results found

Objektov´ y n´ avrh v´ ysledk˚ u z´ avodu

Pˇr´ıstup ke vˇsem v´ysledk˚um zprostˇredkov´av´a abstraktn´ı tˇr´ıda A Statistics, kter´a opˇet vyuˇz´ıv´a genericity a pracuje s potomky tˇr´ıd A RaceResults, A P erson a roz-hran´ı I Race. Tato tˇr´ıda se statistikami umoˇzˇnuje naˇc´ıst v´ysledky podle zvolen´eho data z datab´aze. D´ale vrac´ı seˇrazen´a data z´avod˚u (sestupnˇe i vzestupnˇe), pˇr´ıpadnˇe um´ı poskytnout z´avody dle data a samozˇrejmˇe v´ysledky po zad´an´ı konkr´etn´ıho z´avodu. Statistiky, stejnˇe jako nˇekter´e dalˇs´ı uveden´e tˇr´ıdy, vyuˇz´ıvaj´ı haˇsovac´ı mapy pro pˇr´ıstup k poˇzadovan´ym dat˚um.

4.4 Profil trasy

Profil trasy je velmi d˚uleˇzit´y k z´uˇzen´ı favorit˚u na v´ıtˇezstv´ı v z´avodˇe. Z´ısk´an je ve formˇe obr´azku a je ukl´ad´an do souborov´eho adres´aˇre, nyn´ı je potˇreba z nˇej z´ıskat co nejpˇresnˇejˇs´ı data o sklonu vozovky v aktu´aln´ıch ´usec´ıch.

Obr´azek je naˇcten pomoc´ı knihovny opencv, kter´a tak´e poskytuje n´astroje pro pr´aci s n´ım. A je definov´an jako matice s rozmˇery kwidth(ˇs´ıˇrka obr´azku) x kheight(v´yˇska obr´azku), jej´ıˇz prvky tvoˇr´ı pixely. Tato matice je reprezentov´ana tˇr´ıdou M at. Kaˇzd´y pixel po naˇcten´ı m˚uˇze b´yt vyj´adˇren v r˚uzn´ych barevn´ych form´atech.

Profil se ve vˇetˇsinˇe pˇr´ıpad˚u vyznaˇcuje urˇcitou barvou, kter´a je sice v kaˇzd´em obr´azku r˚uzn´a, nicm´enˇe v r´amci jednoho b´yv´a obvykle pouze jedna. ´Upln´a automa-tizace prakticky moˇzn´a nen´ı, jelikoˇz jsou potˇreba zjistit ´udaje o nadmoˇrsk´e v´yˇsce a ty lze z obr´azku pˇreˇc´ıst jen velice obt´ıˇznˇe. Nicm´enˇe graf si zachov´av´a stejn´e mˇeˇr´ıtko, proto n´am staˇc´ı zjistit 2 body, kter´e nemaj´ı stejnou nadmoˇrskou v´yˇsku a n´aslednˇe lze velice jednoduˇse ostatn´ı body jiˇz dopoˇc´ıtat. Proto se uˇzivateli zobraz´ı obr´azek, z kter´eho n´aslednˇe zad´a 2 poˇzadovan´e body. Jelikoˇz je nutn´y tento z´asah uˇzivatele, kter´y znemoˇzn´ı plnˇe automatick´e zpracov´an´ı, jiˇz nepˇredstavuje velk´y probl´em, po-kud na obsluze nech´ame i jeden dalˇs´ı krok, kter´ym je zad´an´ı barvy profilu trasy. Toto zad´an´ı provede velice jednoduˇse kliknut´ım na obr´azek, ze kter´eho je barva vybr´ana podle pixelu, na kter´em doˇslo k ud´alosti kliknut´ı myˇs´ı.

V programu je zabudovan´e i automatick´e detekov´an´ı, kter´e vyhodnot´ı jako barvu profilu takovou, kter´a je nejˇcetnˇejˇs´ı, pˇriˇcemˇz b´ıl´a barva je vyˇrazena, jelikoˇz pomoc´ı n´ı profil obvykle vyznaˇcen nen´ı. ´Uspˇeˇsnost t´eto automatick´e detekce vˇsak nen´ı pˇr´ıliˇs vysok´a a vzhledem k v´yˇse uveden´emu je zad´an´ı ponech´ano pˇredevˇs´ım na obsluze programu.

Nejsloˇzitˇejˇs´ım probl´emem je nalezen´ı pixel˚u, kter´e oznaˇcuj´ı v´yˇskov´y profil z´avodu.

K jejich nalezen´ı bylo vytvoˇreno nˇekolik metod, kter´e se z´aroveˇn i doplˇnuj´ı.

4.4.1 Sloupcov´ a detekce

V kaˇzd´em sloupci pixel˚u, kter´y pˇredstavuje v´yˇskov´y profil, mus´ıme oznaˇcit jeden, kter´y pˇredstavuje nadmoˇrskou v´yˇsku. Jelikoˇz barevn´a plocha zv´yraznˇen´eho profilu nem´a naprosto stejnou barvu, nen´ı moˇzn´e pˇr´ımo porovn´avat hodnoty z RGB modelu.

K vyhled´an´ı podobn´ych barev vyuˇzijeme gamut Lab, do kter´eho je nutn´e obr´azek nejprve pˇrev´est. Mˇejme vybranou barvu, kter´a je d´ana vektorem c1 = (L1, a1, b1).

Tuto barvu potˇrebujeme porovnat s aktu´alnˇe vybran´ym pixelem z obr´azku, coˇz provedeme pomoc´ı podm´ınky

d(c1, c2) ≤ kcolor, kcolor ∈ h0, 1i, (4.1) kde c2 je vektor z Lab prostoru a oznaˇcuje barvu aktu´alnˇe porovn´avan´eho pixelu a d(c1, c2) je vzd´alenost barev dan´a rovnic´ı

d(c1, c2) =p

(L2− L1)2+ (a2− a1)2+ (b2− b1)2. (4.2) Konstanta kcolor je pak nastavena na hodnotu 0.1 ale uˇzivatel j´ı m˚uˇze za bˇehu pro-gramu libovolnˇe mˇenit. C´ılem je nal´ezt v kaˇzd´em sloupci v´yˇsku vyznaˇcen´eho pro-filu. Algoritmus pro stanoven´ı hledan´eho pixelu, kter´y zn´azorˇnuje n´ami hledanou nadmoˇrskou v´yˇsku, je tedy nez´avisl´y na ostatn´ıch sloupc´ıch a proto bude nast´ınˇen pouze pro vybran´y sloupec.

Metoda zdola nahoru

Zaˇcneme od nejspodnˇejˇs´ıho pixelu v r´amci sloupce hledat prvn´ı pixel, kter´y spln´ı podm´ınku ze vztahu (4.1). Tento pixel budeme tak´e oznaˇcovat jako detekˇcn´ı, v r´amci t´eto metody pˇredstavuje nutnou, ale nikoliv postaˇcuj´ıc´ı podm´ınku, pro na-lezen´ı v´yˇsky v sloupci. Pokud se nepodaˇrilo naj´ıt ˇz´adn´y pixel, pak je hodnota v tomto sloupci nezn´am´a. V opaˇcn´em pˇr´ıpadˇe pokraˇcujeme na vyˇsˇs´ı, dokud je splnˇena podm´ınka (4.1). Pˇri jej´ım prvn´ım nesplnˇen´ı jsme nalezli v´yˇsku profilu, kter´a se nach´az´ı na pˇredch´azej´ıc´ım pixelu. V tomto pˇr´ıpadˇe hovoˇr´ıme o zastavovac´ıch pixe-lech.

V pˇr´ıpadˇe ide´aln´ıho obr´azku by tento n´avrh mˇel b´yt spr´avn´y. Poˇcet pixel˚u ve sloupci, kter´e by mˇely b´yt detekov´any jako stejn´a barva, je obvykle vysok´y. A je-likoˇz nejsou obr´azky zdaleka ide´aln´ı, tak i jedin´y chybn´y pixel, m˚uˇze zp˚usobit velk´e nepˇresnosti. Tento probl´em lze ´uspˇeˇsnˇe vyˇreˇsit pozmˇenˇen´ım algoritmu tak, ˇze po vyhled´an´ı pixel˚u s c´ılovou barvou nestaˇc´ı ke stanoven´ı v´yˇsky pouze prvn´ı nesplnˇen´ı n´ami popsan´e podm´ınky o hled´an´ı barev. Naopak budeme vyˇzadovat nesplnˇen´ı v kadd ∈ N, kadd > 2 po sobˇe jdouc´ıch pixelech. Pˇri stanoven´ı pozice pixelu, kter´y

oznaˇcuje v´yˇsku, je nutn´e odeˇc´ıst novˇe zavedenou konstantu kadd, jelikoˇz se jedn´a jiˇz o pixely jin´e barvy. Funkci, kter´a provede tento v´ypoˇcet pro x-t´y sloupec budeme znaˇcit pup(x) ∈ {0, ..kheight− 1}, x ∈ {0, ..kwidth− 1}

Metoda shora dol˚u

Pro vybran´y sloupec stanov´ıme v´yˇsku, jako pixel, kter´y jako prvn´ı spln´ı podm´ınku (4.1). Pˇri tomto hled´an´ı postupujeme od horn´ıho pixelu. Obdobnˇe jako u metody zdola nahoru vyuˇzijeme vˇetˇs´ı poˇcet zastavovac´ıch pixel˚u, kter´e mus´ı n´asledovat po sobˇe. Nicm´enˇe toto zlepˇsen´ı zde nen´ı tak nutn´e jako u metody pˇredch´azej´ıc´ı. D˚uvod je zˇrejm´y, obvykle se jedn´a o chybu v obr´azku a pravdˇepodobnost, ˇze pixel obsahuje n´ami vybranou barvu, nebo podobnou dle nastaven´ych krit´eri´ı, je menˇs´ı, neˇz ˇze obsahuje jakoukoliv barvu jinou. Stejnˇe jako u pˇredch´azej´ıc´ı metody oznaˇc´ıme v´yˇsku hledan´eho pixelu v x-t´em sloupci pdown(x) ∈ {0, ..kheight−1}, x ∈ {0, ..kwidth−1}

Kombinovan´a metoda

V´yˇse uveden´e metody jsou navrˇzen´e tak, ˇze by mˇely b´yt ekvivalentn´ı a v pˇr´ıpadˇe ide´aln´ıho obr´azku v´yˇskov´eho profilu tak´e jsou. Nicm´enˇe profily jsou velmi r˚uznorod´e a kaˇzd´a z metod m´a sv´e v´yhody.

Obˇe strategie jsou problematick´e v pˇr´ıpadˇe, ˇze se v obr´azku vyskytuje stejn´a barva, kter´a oznaˇcuje v´yˇskov´y profil i pro jin´e ´uˇcely. M˚uˇze j´ım b´yt textov´y popis, ˇci zv´yraznˇen´ı nˇejak´e pr´emie. Vhodnou kombinac´ı tˇechto metod m˚uˇzeme probl´em odstranit.

Za vˇerohodnˇe stanovenou v´yˇsku metodou shora pup(x) a metodou zdola pdown(x) pro x-t´y sloupec prohl´as´ıme x-t´y sloupec, kter´y spln´ı podm´ınku

|pdown(x) − pup(x)| ≤ krelativekheight, x ∈ {0, ..kwidth−1}, krelative ∈ h0, 1i, (4.3) a pro usnadnˇen´ı si tak´e nadefinujeme funkci

p(x) =

kde krelative je relativn´ı velikost moˇzn´e chyby, a byla zvolena hodnota krelative = 0.05. Porovn´an´ım v´ysledk˚u, z dvou rozd´ıln´ych metod, prakticky vylouˇc´ıme moˇznost

nalezen´ı podobn´e barvy, kter´a vˇsak nepˇredstavuje v´yˇsku z´avodu. Tato metoda bude m´ıt za d˚usledek ˇcastˇeji nestanovenou v´yˇsku v r´amci vybran´eho sloupce, avˇsak spo-lehlivost spr´avnˇe stanoven´eho pixelu bude vyˇsˇs´ı.

Stanoven´ı souˇradnice vˇerohodn´eho pixelu

Kombinaci metod budeme vyuˇz´ıvat jen pro stanoven´ı x-ov´e souˇradnice vˇerohodn´eho pixelu, coˇz je takov´a souˇradnice, o kter´e lze s velkou pravdˇepodobnost´ı prohl´asit, ˇze jej´ı v´yˇsku lze velmi pˇresnˇe urˇcit z´akladn´ımi metodami shora a zdola. U takov´e souˇradnice pak lze stanovit tˇemito metodami, prakticky bez rizika chyby, hledanou v´yˇsku a tu pak vyuˇz´ıt v metod´ach s omezen´ım. Pokud bychom stanovili vˇerohodnou souˇradnici pˇri prvn´ı splnˇen´e podm´ınce (4.3) st´ale by existovalo riziko, ˇze nebyla zvo-lena spr´avnˇe. Profil trasy se zejm´ena nenach´az´ı na cel´e jeho ˇs´ıˇrce. Takˇze se pokus´ıme rizikov´ym oblastem obr´azku, pokud to bude moˇzn´e, vyhnout.

K doc´ılen´ı spolehliv´ych v´ysledk˚u cel´y obr´azek rozdˇel´ıme na t ˇc´ast´ı podle osy x, budeme tedy hledat v menˇs´ıch intervalech. Mnoˇziny x-ov´ych souˇradnic Ti jsou tedy d´any jako platit (4.3). Prostˇredn´ı z tˇechto k2 souˇradnic pˇredstavuje n´ami hledanou v´ychoz´ı souˇradnici, kter´a je d´ale pouˇz´ıv´ana. Pro zv´yˇsen´ı d˚uvˇeryhodnosti cel´e mnoˇziny Ti zavedeme podm´ınku

P|Ti|

j=1p(Ti,j)

|Ti| < k3, k3 ∈ h0, 1i (4.6) kde k3je relativn´ı ´uspˇeˇsnost urˇcuj´ıc´ı podobnost stanoven´ı pixelu pomoc´ı dvou rozd´ıln´ych metod na dan´e mnoˇzinˇe x-ov´ych souˇradnic.

Poˇcet souˇradnic, kter´e by splnily uveden´e podm´ınky m˚uˇze b´yt velmi rozs´ahl´y.

K dalˇs´ımu postupu vˇsak potˇrebujeme pouze jedinou a tak vybereme prvn´ı, kter´a krit´eria spln´ı. Abychom nejprve vyhled´avali mezi nejlepˇs´ımi kandid´aty na stano-ven´ı vˇerohodn´e souˇradnice, budeme prohled´avat mnoˇziny Ti v n´asleduj´ıc´ım poˇrad´ı {Tb|T |

2 c, Tb|T |

2 c+1, Tb|T |

2 c−1, .., Tt, T1}.

Omezen´ı metod

Metoda shora i zdola trp´ı z´asadn´ım probl´emem, kter´y spoˇc´ıv´a v moˇzn´em zanesen´ı podobn´e barvy do obr´azku nesouvisej´ıc´ı s profilem trasy. V´yraznˇe vylepˇsit lze tak, ˇze se omez´ı hled´an´ı, v sloupci pixel˚u, jen na urˇcitou ˇc´ast. Pokud nebudeme prohled´avat oblasti, kter´e jistˇe nemohou obsahovat hledanou v´yˇsku, vyhneme se potenci´alnˇe moˇzn´ym chyb´am. Potˇrebujeme tedy co nejv´ıce z´uˇzit mnoˇzinu sloupce, kde hled´ame.

Z´aroveˇn se, ale nesm´ı mnoˇzina zmenˇsit pˇr´ıliˇs, mohli bychom i ´uplnˇe vynechat hledan´y pixel.

U z´akladn´ıch metod operujeme v kaˇzd´em sloupci s mnoˇzinou P0 = {0, 1, ..kheight− 1}. Tuto mnoˇzinu, vˇsak bez jak´ychkoliv dalˇs´ıch znalost´ı, z´uˇzit nelze. Z praktick´eho hlediska vˇsak v´ıme, ˇze vozovka vytv´aˇr´ı prakticky spojitou funkci a jej´ı sklon, jistˇe nem˚uˇze b´yt vˇetˇs´ı neˇz 30%. Takov´e silnice se zkr´atka obvykle v˚ubec nebuduj´ı, v silniˇcn´ı cyklistice se na tento ´udaj m˚uˇzeme pomˇernˇe dobˇre spolehnout. V obr´azku vˇsak pracujeme pouze s pixely a tak´e se zde vyskytuj´ı urˇcit´e chyby. Z´aroveˇn m˚uˇze b´yt profil v r˚uzn´em pomˇeru os x a y.

Pokud m´ame tedy danou pozici pixelu P1 = [x1, y1], m˚uˇzeme podle naˇseho pˇredpokladu tvrdit, ˇze pixel P2 = [x2, y2] bude m´ıt souˇradnici y2omezenou podm´ınkou

y1− |x1− x2|kmultiple≤ y2 ≤ y1 + |x1− x2|kmultiple, (4.7) kde kmultiple je koeficient moˇzn´e zmˇeny v ose y v z´avislosti na ose y. Zav´ad´ıme tedy omezen´ı na jin´em sloupci, ide´alnˇe s co moˇzn´a nejbliˇzˇs´ı souˇradnic´ı na ose x. Tato z´avislost je jedin´ym rozd´ılem oproti metod´am, kter´e jsou pops´any v´yˇse. Metoda shora s omezen´ım zˇrejmˇe mus´ı zaˇc´ınat na souˇradnici y2 = y1+ |x1 − x2|kmultiple+ kdetect, kde kdetect oznaˇcuje poˇcet detekˇcn´ıch pixel˚u. Metoda zdola pak zaˇc´ın´a na souˇradnici y2 = y1− |x1− x2|kmultiple− kdetect

Pokroˇcil´e metody s omezen´ım nejprve stanov´ı v´ychoz´ı(vˇerohodn´y) pixel Pv = (xv, yv) a d´ale pokraˇcuj´ı na pixel Pv+1 = [xv + 1, yv + 1], kde se pomoc´ı omezen´e metody shora ˇci zdola urˇc´ı yv+1. Obdobn´ym zp˚usobem se d´ale pokraˇcuje na dalˇs´ı pixely, dokud nenaraz´ıme na posledn´ı souˇradnici na ose x. Omezuj´ıc´ı podm´ınka se aplikuje pro nejbliˇzˇs´ı zjiˇstˇen´y pixel. Takto jsme urˇcili vˇsechny hledan´e pixely pravostrann´e ˇrady x-ov´ych souˇradnic Xr = {xv, xv+1, xv+2, ..xkwidth−1}. Stejn´ym

postupem urˇc´ıme i postupnˇe y-ov´e souˇradnice k pixel˚um s x-ov´ymi souˇradnicemi Xl = {xv, xv− 1, xv − 2, .., x0}.

Ve v´ychoz´ı implementaci jsou zvoleny konstanty kdetect = 10, kmultiple = 5, kter´e bezpeˇcnˇe zaruˇc´ı moˇznost naj´ıt hledan´y pixel. Metody s omezen´ım nejprve potˇrebuj´ı naj´ıt vˇerohodn´y pixel, coˇz je pomˇernˇe v´ypoˇcetnˇe n´aroˇcn´y algoritmus. Pˇresto jsou d´ıky omezen´ı, celkovˇe rychlejˇs´ı neˇz metody z´akladn´ı, a z´aroveˇn maj´ı schopnost l´epe rozpoznat hledan´y profil trasy. Drobnou nev´yhodou je nutnost pˇresnˇejˇs´ıho nastaven´ı limitu barev, kter´e jsou rozpozn´av´any pˇri stanoven´ı vˇerohodn´eho pixelu.

4.4.2 Hranov´ a detekce

Navrˇzen´a metoda sloupcov´e detekce vykazuje ve velk´em mnoˇzstv´ı pˇr´ıpad˚u velice dobr´e v´ysledky, v nˇekter´ych vˇsak selh´av´a. Jiˇz u sloupcov´e detekce byla zavedena z´avislost na ostatn´ıch sloupc´ıch, jelikoˇz nadmoˇrsk´a v´yˇska silnice v obr´azku pˇredstavuje hranu. Nab´ız´ı se tedy moˇznost vyuˇz´ıt detekci hran, kter´a je v oblasti rozpozn´av´an´ı obrazu velmi dobˇre zn´ama.

Potˇrebujeme z´ıskat hrany z obr´azku, kter´y zn´azorˇnuje profil z´avodu. Hrany sta-nov´ıme pomoc´ı Cannyho detektoru, kter´y se skl´ad´a ze 4 z´akladn´ıch krok˚u. Nejprve eliminuje ˇsum pomoc´ı Gaussova filtru, n´aslednˇe se stanov´ı gradient, naleznou lok´aln´ı maxima a nakonec se eliminuj´ı nev´yznamn´e hrany. K realizaci v programovac´ım ja-zyce vyuˇzijeme knihovnu OpenCV . Vstupn´ı obr´azek nejprve pˇrevedeme do odst´ın˚u ˇsedi, pomoc´ı funkce cvtColor. N´aslednˇe jej pomoc´ı funkce blur vyhlad´ıme filtrem o velikosti 3 x 3. A na konec pouˇzijeme funkci Canny, kter´a vytvoˇr´ı hrany podle Can-nyho detektoru. Uveden´y postup je volen pˇresnˇe dle tutori´alu vyuˇzit´e knihovny [18].

Velmi d˚uleˇzit´a je volba horn´ıho a doln´ıho prahu pro detektor. Tato volba v´yraznˇe ovlivˇnuje mnoˇzstv´ı detekovan´ych hran. Na obr´azku 4.3 vid´ıme v´ysledek detekce v pˇr´ıpadˇe velmi n´ızk´eho prahu. Doˇslo tedy k nalezen´ı velk´eho poˇctu hran, i takov´ych, kter´e profil v˚ubec nevyznaˇcuj´ı. N´asledn´e odhalen´ı spr´avn´e hrany by tak bylo velmi sloˇzit´e.

Na obr´azku 4.4 naopak vid´ıme vhodnˇe zvolen´y prah, kter´y poˇcet hran velmi omezil. Pˇrestoˇze se jedn´a o ide´aln´ı obr´azek, s velmi vhodnˇe zvolen´ym prahem pro detekci hran, st´ale byly nalezeny i takov´e hrany, kter´e nepˇredstavuj´ı v´yˇskov´y profil trasy. K ide´aln´ımu pˇr´ıpadu, kdy by byly nalezeny jen hrany pˇredstavuj´ıc´ı hledan´y