DOMENIUL: CALCULATOARE ȘI TEHNOLOGIA INFORMAȚIEI SPECIALIZAREA: CALCULATOARE LUCRARE DE DIPLOMĂ Coordonator șt iințific Conf.dr.ing Florin… [630196]
Iași, 2017
UNIVERSITATEA TEHNICĂ „Gheorghe Asachi ” din IAȘI
FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE
DOMENIUL: CALCULATOARE ȘI TEHNOLOGIA INFORMAȚIEI
SPECIALIZAREA: CALCULATOARE
LUCRARE DE DIPLOMĂ
Coordonator șt iințific
Conf.dr.ing Florin Pantilimonescu
Absolvent: [anonimizat], 2017
UNIVERSITATEA TEHNICĂ „Gheorghe Asachi ” din IAȘI
FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE
DOMENIUL: CALCULATOARE ȘI TEHNOLOGIA INFORMAȚIEI
SPECIALIZAREA: CALCULATOARE
Componentă auto pentru recunoașterea
semnelor de circulație
LUCRARE DE DIPLOMĂ
Coordonator științific
Conf. dr.ing. Florin Pantilimonescu
Absolvent: [anonimizat] ,
legitimat(ă) cu seria nr. , CNP
autorul lucrării
elaborată în vederea susținerii examenului de finalizare a studiilor de licență
organizat de către Facultatea de Automatică și Calculatoare din cadrul Universității Tehnice
„Gheorghe Asachi ” din Iași, sesiunea a anului universitar , luând
în considerare conținutul Art. 34 din Codul de etică universitară al Universității Tehnice
„Gheorghe Asachi ” din Iași (Manualul Procedurilor, UTI.POM.02 – Funcționarea
Comisiei de etică universitară), declar pe proprie răspundere, că această lucrare este
rezultatul propriei activități intelectuale, nu conține porțiuni plagi ate, iar sursele
bibliografice au fost folosite cu respectarea legislației române (legea 8/1996) și a
convențiilor internaționale privind drepturile de autor.
Data Semnătura
UNGUREANU SEBASTIAN
CI XT 540867 [anonimizat]
COMPONENTĂ AUTO PENT RU RECUNOAȘTEREA SEM NELOR DE
CIRCULAȚIE
IULIE 2017 2016-2017
29.06.2017
Cuprins
Capitolul 1. Introducere ………………………….. ………………………….. ………………………….. ………………. 1
Capitolul 2. Fundamentarea teoretică și docume ntarea bibliografică pentru tema propusă ……….. 2
2.1. Modelul RGB ………………………….. ………………………….. ………………………….. ………………….. 3
2.2. Semnele de circulație ………………………….. ………………………….. ………………………….. ………… 3
2.3. Prezentarea generală a sistemului ………………………….. ………………………….. …………………… 5
2.4. Detectarea semnelor de circulație ………………………….. ………………………….. ……………………. 6
2.4.1. Detectarea prin segmentarea culorii în spațiul de culoare HSV/HSL ……………………… 6
2.4.2. Detecta rea semnelor de circulație pe baza formei acestora ………………………….. ……….. 8
2.5. Recunoașterea semnelor de circulație ………………………….. ………………………….. ……………. 10
2.6. Aplicații ale sistemelor de detectare și recunoaștere a semnelor de circulație ……. 10
2.7. Specificațiile privind caracteristicile așteptate de la aplicație ………………………….. ………… 12
Capitolul 3. Proiectarea aplicației ………………………….. ………………………….. ………………………….. . 13
3.1. Componentele software ………………………….. ………………………….. ………………………….. …… 13
3.2. Tehnologii folosite ………………………….. ………………………….. ………………………….. …………. 14
3.3. Componente hardware ………………………….. ………………………….. ………………………….. …….. 16
3.3.1. Raspberry Pi 3 B ………………………….. ………………………….. ………………………….. ……… 16
3.3.2. Procesorul Cortex A53 ………………………….. ………………………….. ………………………….. 18
3.3.3. Picamer a ………………………….. ………………………….. ………………………….. …………………. 20
3.4. Schema bloc pentru interconectarea componentelor principale ………………………….. ……… 21
Capitolul 4. Implementarea aplicației ………………………….. ………………………….. ……………………… 22
4.1. Descrierea implementării ………………………….. ………………………….. ………………………….. … 22
4.2. Problemele apărute pe parcursul dezvoltării algoritmului și soluții găsite …………. 23
4.3. Funcționarea sistemului ………………………….. ………………………….. ………………………….. …… 24
4.4. Comunicarea cu alte sisteme și salvarea/stocarea informațiilor ………………………….. ……… 26
4.5. Interfața cu utilizatorul ………………………….. ………………………….. ………………………….. ……. 26
4.6. Calibrarea sistemului ………………………….. ………………………….. ………………………….. ………. 27
Capitolul 5. Testarea aplicației și rezultate experimentale ………………………….. ………………………. 28
5.1. Instalarea și lansarea aplicației ………………………….. ………………………….. ……………………… 28
5.2. Resurse hardware necesare ………………………….. ………………………….. ………………………….. . 28
5.3. Date de test și benchmarkuri ………………………….. ………………………….. ………………………… 29
5.4. Aspecte legate de fiabilitate și securitate ………………………….. ………………………….. ……….. 31
5.5. Rezultate experimentale ………………………….. ………………………….. ………………………….. ….. 32
5.6. Utilizarea sistemului ………………………….. ………………………….. ………………………….. ……….. 32
Capitolul 6. Concluzii ………………………….. ………………………….. ………………………….. ………………. 33
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. …. 35
Anexe ………………………….. ………………………….. ………………………….. ………………………….. ………… 37
Componentă auto pentru
recunoașterea semnelor de circulație
Sebastian Ungureanu
Rezumat
Această temă își propune să analizeze modurile de realizare ale unui echipament capabil
să identifice semnele de circulație și să comunice într -o rețea.
Soluția se bazează pe un sistem mobil prevăzut cu o cameră video care preia informații din
proximita tea căii de rulare, pentru a identifica semnele. Ea urmărește un răspuns rezonabil obținut
într-un timp cât mai scurt. Sistemul mobil are rolul de a oferi un model redus pentru testarea soluției
în condiții dinamice, dar și pentru o aplicație industrială. Semnele de circulație vor fi amplasate pe
partea dreaptă a traseului, echipamentul mobil urmând a executa manevrele impuse de acestea.
Practic, un vehicul autonom va urmări linia neagră de pe traseul stabilit ajutat de trei senzori
de linie, dar în același timp va lua și decizii în funcție de semnele detectate , pentru a putea observa
rezultatele algoritmului de recunoaștere. Sistemul își propune recunoașterea a patru semne de
circulație și simularea deciziilor în funcție de semn, la fel ca într -o situație reală.
Pentru controlul vehiculului s -a folosit o placă de dezvoltare FRDM KL -25Z și trei senzori
de linie, iar pentru executarea algoritmul ui de recunoaștere a semnelor, platforma Raspberry Pi 3,
care prelucrează imaginile preluate cu o cameră vid eo.
Lucrarea a fost realizată în colaborare cu un alt coleg, iar eu m -am ocupat de dezvoltarea
algoritmului de recunoaștere și de realizarea conexiunii dintre cele două plăci de dezvoltare.
Scopul final al temei este adaptarea algoritmului în condiții din amice, situație în care sistemul
trebuie să prelucreze diferite imagini în timpul deplasării vehiculului, unele cu semne, altele fără
sau făcute în viteză fără nici o focalizare, îngreunând astfel considerabil obținerea rezultatului
dorit. Pentru captarea și prelucrarea imaginilor am folosit bibliotecile OpenCv și Raspicam. Baza
algoritmului o reprezintă filtrele aplicate pentru segmentarea imaginii, care fac detectarea semnelor
mai ușoară prin extragerea obiectelor care sunt de interes, celelalte fiind eli minate. După detectarea
semnului, el se compară cu cele din baza de date, pentru a putea fi recunoscut. Rezultatul este
trimis la FRDM prin cale serială folosind un cablu USB, iar apoi interpretat în funcție de semnul
identificat.
După efectuarea a mai mu ltor teste, am descoperit singur o parte din cazurile de excepție
care ar face imposibilă detectarea celor patru semne de circulație. Pentru fiecare caz am găsit o
soluție cât mai eficientă, iar rezultatul final a fost unul satisfăcător.
Introducere
1
Capitolul 1. Introducere
Am ales această temă pentru lucrarea mea de licență, deoarece ea reușește sa îmbine cele
două pasiuni ale mele, șofatul și progr amarea . În proiectul meu am vrut să pun în practică
cunoștințele a cumulate până în momentul actual, dar și concepția mea despre cum ar putea evolua
industria auto cu ajutorul automatizării. Deși implementarea mașinilor inteligente este abia la
început, fiind automatizate doar câteva funcții într -o mașină de ultimă genera ție, cum ar fi :
parcarea automată, detectarea liniei albe a părții carosabile sau detectarea semnelor cu limitare de
viteză , evoluția este una promițătoare.
Cum siguranța este pe primul loc în acest domeniu, orice implementare trebuie făcută cu o
precizie foarte mare pentru a evita erorile care ar putea produce accidente grave. Urmând această
regulă, am încercat să construiesc un sistem care să răspundă în timp real solicitărilor, dar să ofere
și un nivel ridicat de siguranță. O astfel de implementare pe o mașină a viitorului ar putea crește
gradul de siguranță al pasagerilor, șoferul fiind atenționat frecvent asupra pericolelor sau chiar
forțat să ia anumite decizii.
Cu toate acestea, automatizarea ar oferi doar un mic ajutor conducătorilor auto și consider
că nu ne putem baza pe ea în totalitate. Detectarea semnelor de circulație ar fi un pas mare în
această industrie dacă s -ar impune acest lucru pentru fiecare autovehicul și s -ar crea un nou
standard asupra unor noi semne care să fie mai ușor de de tectat ori verificarea perdiodică a celor
actuale .
O astfel de componentă ar fi utilă în special șoferilor grăbiți, care ignoră indicatoarele de
pe partea carosabilă, producând des accidente, de obicei în intersecții. Văzând des accidente, m –
am gândit la multe soluții privind siguranța în trafic și astfel am decis să încerc rezolvarea uneia
dintre probleme.
Cum această implementare nu este un standard la momentul actual, fiind disponibilă doar
pe unele mașini din clasa premium, iar numărul de semne detec tate este mic, semnele de circulație
pot apărea în trafic în moduri diferite, u nele fiind uș or de recunoscut, iar altele nu.
Factorii extern i precum lumina soarelului, ploaia, ză pada, ceața, copacii pot fa ce ca
recunoașterea unui semn să fie imposibilă, iar acest lucru ar face ca implementarea de mai sus să
fie inutilă în astfel de situații. Pentru evitarea unor astfel de scenarii, testarea sistemului se va face
în laborator, unde traseul va fi aproape ideal, iar semnele vor fi amplasate astfel încât să f ie vizibile
în totalitate pentru a fi posibilă detectarea lor.
Sistemul est e format dintr -un kit robot cu patru roți, senzori pentru detectarea li niei negre,
două plăci de dezvoltare și o cameră video pentru captarea imagi nilor. Pe traseu sunt așezate
semne le de circulație ale căror dimensiuni sunt reduse pentru a intra în cadrul imag inilor preluate
de camera video. Detectarea lor se face pe distanțe mici, aproximativ 30 -50 centimetri.
Detectarea unui semn poate dura două sau trei secunde ,uneori chiar mai mult, în funcție
de cum este poziționat în cadrul pozei. Acest timp poate părea mare, dar se datorează faptului că
am încercat să măresc precizia algoritmului pentru a găsi semnul corect, fără a da rezultate eronate.
Într-o situație reală, acest timp este ideal aș zice, numai dacă detectarea este cea corectă ș i
algoritmul nu confundă semnele între ele ori detectează obiecte străine .
În continuare voi face o prezentare a domeniului aplicației, a concepte lor care stau l a baza
procesării imagi nilor și recunoașterii semnelor de circulație, a modele lor deja implementate și a
rezultate lor așteptate. După acest capitol voi descrie proiectarea aplicației și metodele alese,
componentele hardware și software folosite, iar apoi voi prezenta pas cu pas implementarea
aplicației.
La final voi prezenta rezultatele obținute și concluziile în comparaț ie cu așteptările pe care
le-am avut inițial .
Sebastian Ungureanu
2
Capitolul 2. Fundamentarea teoretică și documentarea bibliografică pentru
tema propusă
Recunoașterea semnelor rutiere este o tehnologie prin care un vehicul este capabil să
recunoască semnele de circulație introduse pe șosea , atenționând șoferul asupra pericolelor care
pot apărea. Această tehnologie poate detecta mai multe tipuri de semne, cum ar fi de exemplu
“Stop”, “Limit ă de viteză”, ”Oprire interzisă”, ele fiind clasificate în mai multe categorii.
În prezent ea este dezvoltată de mulți furnizori de automobile , printre care ș i
Continental sau Delphi. Pentru detectare sunt folosite tehnici de procesare a i maginilor, iar
metodele pot fi în general împărțite în diferite categorii: bazate pe culoare, pe forme sau bazate
pe învățare.
Convenția de la Viena privind semnele și semnalele rutiere este un tratat semnat în
1968, care a fost capabil să standardizeze semnele de circulație în diferite țări. Aproximativ 52
de țări au semnat acest tratat, 31 fiind din Europa. Convenția a clasifica t pe larg semnele rutiere
în șapte categorii desemnate cu litere (A-H). Această standardizare a fost principala modalitate
de a ajuta producătorii de echipamente originale să dezvolte un sistem de recunoaștere a
semnelor din trafic, care ar putea fi utiliz at la nivel global. Cu ajutorul acestui standard s -au
dezvoltat algoritmi care recunosc ușor semnele prin faptul ca ies rapid în evidență , față de restul
obiectelor din imagine. [1]
Aceste prime sisteme care recunosc limitel e de viteză au fost dezvoltate î n cooperare
de către Mobileye și Continental AG. Prima dată au apărut la sfârșitul anului 2008 pe BMW
seria 7, iar următorul în an pe Mercedes S -Class, acestea fiind modele le de top ai celor doi
producători.
În această primă v ariantă sunt detectate doar semnele de viteză rotunde găsite în
întreaga Europă. Sistemele di n a doua generație pot detecta ș i restricțiile de depășire. Au fost
implementate tot în 2008, pe Opel Insignia, iar apoi pe Opel Astra și Saab 9 -5. [2]
Sistemele moderne sunt dezvoltate utilizând rețele neuronale convoluționale, care sunt
determinate în principal de cerințele autovehiculelor. În aceste situații, sistemul trebuie să
detecteze o varietate mare de semne de circulație și nu doar pe cele cu limitare de viteză. Așa
cum am menționat mai sus, Convenția de la Viena privind semnele de circulație vine în ajutor,
deoarece rețelele neuronale folosesc procesarea imaginilor și ”Computer Vision1” pentru a
antrena rețeaua cu potenț ialele rezultate.
Sistemul trebuie să fie suficient de modular pentru a fi ușor de adaptat pentru diferite
forme a le semnelor de cir culație, cum ar fi detectarea și recunoașterea acestora în S.U.A unde
au forma dreptunghiulară, p recum și a celor din Europa unde forma este circulară .
Semne le de circulație sunt detectate prin anal izarea informațiilor de culoare , în special
roșu și albastru , conținute în imagin e. Semnele detectate sunt apoi clasificate în funcție de
caracteristicile formei lor (triunghi, pătra t și forme circulare) . Combinarea informațiilor de
culoare și formă este clasificată în una din următoarele categorii: pericol, informații , obligația
sau interdicția. Recunoașterea semnelor de circulație se realizează prin compararea pictogramei
din inter iorul fiecă rui semn cu ce le din baza de date . Acest lucru s -a dovedit a fi cea mai
consumatoare etapă de timp a procesului, dovedind că o repartiție a semnelor de circulație în
clase este esențială pentru reducerea timpului de recunoaștere . [3]
1 Computer Vision este un domeniu interdisciplinar care se ocupă cu modul în care computerele pot fi făcute
pentru a obține înțelegerea la nivel înalt din imagini sau videoclipuri digitale.
Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
3
2.1. Modelul RGB
Modelul de culoare RGB este un model de culoare aditivă în care lumina roșie, verde
și albastră sunt adăugate împreună în diverse moduri pentru a reproduce o gamă largă de culori.
Numele modelului provine din engleză din inițialele celor trei culori primare adiționale, roșu,
verde și albastru (red, green, blue).
Scopul principal al modelului de culoare RGB este de a detecta, reprezenta și afișa
imagini în sisteme electronice, cum ar fi televizoare și computere, deși a fost de asemenea
utilizat în fotografierea convențională. Înainte de era electronică, modelul de culoare RGB avea
deja o teorie solidă în spatele ei, bazată pe percepția umană asupra culorilor. [4]
În reprezentarea electronică, pixelul este reprezentat de cele trei culori, fiecare având o
intensitate cuprinsă între 0 și 255. Valoarea 0 pentru cele trei culori reprezintă culoarea neagră ,
iar cea de 255 culoarea albă . Folosind acest model, se pot reprezenta în total 2553=
16.777.216 de culori. În Figura 2.1 se pot vedea cele trei culori primare și rezultatul combinării
lor.
Figura 2.1 Modelul RGB.
.
2.2. Semnele de circulaț ie
Dat fiind faptul că traficul a crescut în ultimele opt decenii, multe țări au adoptat semne
simplif icate și standardizate pentru că, în timpul călătoriilor internaționale, să se evite
diferențele lingvistice.
Semnele de circulaț ie au caracteristici di stincte care pot fi utilizate pentru detectarea ș i
identificarea lor. Acestea sunt concepute în culori și forme specifice, cu textul sau simbolul în
contrast cu fundalul, însă cu toate acestea există mai mulți factori care pot împiedica detectarea
și recunoașterea acestora, cum sunt modificările cauzate de schimbarea nivelului de lumină,
amurg, ceață, umbre, semn de circulație deteriorat, ploaie sau ninsoare, copaci sau stâlpi care
pot acoperi parțial ori în totalitate indicatorul din trafic. Siguranța este prioritară în trafic, iar
din această cauză precizia de detectare a semnelor de circulație este considerat ă un element
foarte important, deoarece nedetectarea unui semn ar putea avea un impact negativ asupra
șoferului sau ar provoca în mod inevitabil un accident în cazul mașin ilor fără pilot.
Pentru o diferențiere mai ușoară s -a făcut următoarea clasificare:
Indicatoare de avertizare;
Indicatoare de reglementare;
Indicatoare de prioritate;
Indicatoare de interzicere sau restricție;
Sebastian Ungureanu
4
Indicatoare de obligare;
Indicatoare de orie ntare;
Indicatoare de informare;
Indicatoare de informare turistică;
Panouri adiționale. [5]
Dar și cateva restricții privind fabricarea semnelor:
Sunt concepute în forme de 2 D, fixe, cum ar fi triunghiuri,v cercuri ,
octogoane sau dreptunghiuri;
Culorile pentr u semne sunt alese pentru a fi î n contrast cu împrejurimile, care
le fac ușor de recuno scut de către conducătorii auto;
Culorile sunt reglementate în funcție de categoria de sem n;
Informațiile de pe semnul rutier au o culoare , iar res tul semnului are o altă
culoare în contrast cu cealaltă ;
Nuanța de culoare care acoperă semnul trebuie să corespundă unei anumite
lungimi de undă în spectrul vizibil;
Semnele sunt situate în locuri bine definite în raport cu drumul, astfel încât
conducătorul auto poate , mai mult sau mai puțin , anticipa localizarea acestor
semne;
Acestea pot conține o pictogramă , un șir de caractere sau ambele;
În fiecare țară , semnele rutiere sunt caracterizate prin util izarea de fonturi de
text fixe și înălțimi de caractere .
Figura 2.2 Semne de circulație din diferite țări europene.
În Figura 2.2 se pot observa cu ușurință micile diferențe între semne în funcție de țara
în care le întâlnim. De exemplu , unele țări folo sesc culoarea galbenă, în timp c e majoritatea
folosesc culoarea alb ă. Această diferențiere poate afecta un sistem de recunoaștere a semnelo r,
devenind impracticabil în țările care nu respectă exact standardul impus.
Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
5
2.3. Prezentare a generală a sistemului
Construcție:
1) Camera video care captează imaginile de pe partea carosabilă ;
2) Algori tmul preia imaginea de la cameră și o convertește în formatul HSV2, apoi o
binarizează pentru a fi mai rapid de procesat ;
3) Se aplică filtrul Gaussian pentru eliminarea zgomotel or;
4) Detect orul Canny ajută la găsirea contururilor prin detectarea muchiilor ;
5) Se caută cifrele sau literele ce pot apărea pe unele semne de circulație, ușurând astfel
clasificarea acestora ;
6) Tot pentru clasificare a mai rapidă se caută forma semnului întâlni t pentru a fi căutat apoi
doar în clasa specifică formei găsite ;
7) După ce semnul a fost căutat în baza de date și identificat, rezultat ul este afișat pe un ecran
sau pe computerul de bord al mașinii în sistemele reale .
2 HSV (hue, saturation, and value) nuanță, saturație și valoare și este, de asemenea, adesea numită HSB (B pentru
luminozitate) Aplicarea de tectorului
Canny pentru
detectarea muchiilor
Utilizarea
algoritmului Freeman
Chain Code pentru
detectarea cifrelor și
literelor Utilizarea tehnicii de
aproximare
poligonală a curbelor
digitale pentru
detectarea formei
semnului din imagine Afișarea rezultatului
final Imaginea captată de
cameră în format RGB
Convertirea la
HSV(nuanță, saturație,
valoare/intensitate) și
binarizare
Aplicarea filtrului
Gaussian pentru
netezire
Figura 2. 3 Exemplu de algoritm pentru sistemul de recunoaștere a semnelor de circulație .
Sebastian Ungureanu
6
2.4. Detectarea semnelor de circulaț ie
În etapa de detectare, imaginea este preprocesată, îmbunătățită și segmentată în
concordanță cu proprietățile semnulu i, cum ar fi culoarea sau forma . Ieșirea este o imagine
segmentată care conține potențiale le regiuni c are ar putea fi recunoscute ca posibile semne
rutiere. Eficiența și viteza de detectare sunt factori importanți în întregul proces, pentru că
reduce spațiul de căutare și indică doar potenți alele regiuni .
2.4.1 . Detectarea pr in segmentarea culorii în spa țiul de culoare HSV /HSL
Scopul etapei de segmentare a culorii este de a separa cu loarea de interes de celelalte
prezent e într -o imagine, care să permită identificarea semnului. Acest lucru ar putea fi o metodă
de detectare fără cusur , știind că culorile semnelor de cir culaț ie sunt st andardizate pentru
fiecare țară. C u toate acestea este probabil să întâlnim semn e de circulație a că ror culoare s -a
schimbat din cauza condițiilor de mediu , cum ar fi expunerea la soare.
Conversia din RGB în HSV se face după următoarele formule: [6]
H=Θ dacă B ≤G (1)
H=360 – Θ dacă B>G (2)
iar Θ= cos−1{[𝑅−𝐺
2−𝐵
2]
√𝑅2+𝐺2+𝐵2−𝑅𝐺−𝑅𝐵−𝐺𝐵} (3)
S=max(R,G,B) -min(R,G,B) (4)
L=0.212R+0.715G+0.072B (5)
a b
c d
Figura 2.4 Aplicarea filtrelor în spațiul de culoare HSV: a – imaginea originală; b – norma lizarea
nuanței; c – normalizarea saturației d – luminozitate/valoare.
Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
7
2.4.1.1. Filtrul Gaussian
Netezirea Gaussiană este folosită în mod obișnuit cu detectarea marginilor.
Majoritatea algoritmilor de detectare a marg inilor sunt sensibili la zgomot. Filtrul 2 D
Laplacian, construit dintr -o discretizare a operatorului Laplace, este foarte sensibil la medii
zgomotoase. Folosirea unui filtru Gaussian de blurare înainte de detectarea margini i are scopul
de a reduce nivelul zgomotului din imagine, ceea ce îmbunătățește rezultatul următorului
algoritm de detectare a marginilor. [7]
Filtrarea va fi cu atât mai puternică cu câ t dimensiunea nucleului de convoluț ie
Gaussian este mai mare .
a b
Figura 2.5 Exemplu de aplicare a filtrului Gaussian: a –imagine normală; b – imagine modificată .
2.4.1.2. Detectorul Canny
Detectorul de frontiere Canny este con siderat de mulț i detectorul optim de
frontiere.
Canny ș i-a propus definirea un ui detector de frontiere care să îmbunătățească
detectoarele existente, di n urmatoarele puncte de vedere:
scăderea ratei de eroare – detect orul să nu piardă puncte de frontieră ;
și să nu răspundă la puncte care nu sunt puncte de frontieră ;
punctele de frontieră sa fie bine localizate – distanț a dintre cele găsite de detector și
cele reale să fie minimă ;
detectorul să furnizeze un singur ră spuns la un singur punct de frontieră .
Pe baza acestor crite rii, detectorul Canny efectuează mai întâi o netezire a imaginii,
pentru eliminarea zgomotului. Apoi calculează Gradientul imaginii pentru a evidenția zonele
cu variație mare a intensității. În con tinuare, algoritmul parcurge aceste zone și elimină orice
pixel care nu este un maxim local pe direcț ia gradientului. Matricea gradientului este mai
departe redusă prin histerezis. S unt utilizate două praguri, T1< T2. Dacă valoarea amplitudinii
este sub T1, pixelul este eliminat; dacă valoarea este >T2, pixelul este reț inut ca pixel de
frontieră . Dacă valoarea amplitudinii pixelul ui este cuprinsă între cele două praguri, atunci:
pixelul este eliminat dacă nu există o cale de la el la un pixel cu amplitudinea gradientului >T 2,
altfel este reț inut ca pixel de frontieră. [7]
Sebastian Ungureanu
8
a b
Figura 2.6 Exemplu de aplicare a detectorului Canny: a – imaginea originală; b – imaginea
modificată.
2.4.2. Detectarea semnelor de circulație pe baza formei acestora
2.4.2.1. Identificarea semnelor de circulație de formă triunghiulară și
dreptunghiulară
Formele triunghiulare și dreptunghiulare sunt identificate prin găsirea colțurilor ale
fiecărei regiuni de interes, folosind algoritmul de detectare Harris.
Existența c olțurilor este apoi testată în 6 puncte diferite de control tl, tc, tr, bl, bc și br.
În momentul în care unul din c ele 6 puncte de control se gă sește în colțul semnului de circulaț ie,
acestuia i se atribuie valoarea 0.25 , iar când se întâlnește în zona c entrală i se atribuie valoarea
0.34. [3]
Figura 2.7 Identificarea colțurilor semnului .
Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
9
Probabilităț ile ca un anumit semn de circulați e conține un pătrat ( sqp), un tri unghi cu
vârful în sus (tup) sau un triunghi cu vârful în jos (tdp ) sunt calculate cu ajutorul ecu ațiilor de
mai jos:
sqp=tl+tr+bl+br (6)
tup=1.32×(bl+br)+tc 1.1×(tl+tr) (7)
tdp=1.32×(tl+tr)+bc 1.1×( bl+br) (8)
2.4.2.2. Identificarea semnelor de circulație de formă circulară
Cercul reprezintă cea mai simplă formă geometrică de identificat deoarece în cazul în
care o rot ație modifică percepția formei , un cerc poate fi rotit și îi menț ine aspectul indiferent
de unghiu l de rotație.
Un algoritm pentru detectarea cercurilor este cel care folosește tranformata Hough,
pentru a determina parametrii săi. Un cerc cu raza R și centrul (a,b) poate fi descris de
următoarele ecuații:
x = a + Rcos( Θ) (9)
y = b + Rsin( Θ) (10)
Dacă o imagine conține multe puncte, iar unele din ele se încadrează în perimetrul
cercurilor, atunci program ul trebuie să caute o tuplă cu trei parametri (a,b,R) pentru a descrie
fiecare centru.
În cazul în care cercurile din imagine au raza c unoscută, căutarea se reduce de la 3D la
2D, fiind căutat doar centrul cercurilor, dat de paramentrii a și b.
Adevăratul punct central va fi comun pentru toate cercurile parametrizate și poate fi
găsit cu un vector de acumulare Hough.
Figura 2.8 Identificarea cercurilor folosind tranformata Hough .
Cercurile multiple cu aceeași rază pot fi găsite cu aceeași tehnică. Dacă raza nu este
cunoscută, atunci acumularea de puncte din spațiul parametrilor va cădea pe suprafața unui con
cu r nivele, căutarea fiind 3D în acest caz. [8]
Sebastian Ungureanu
10
Figura 2.9 Aplicarea transformatei Hough pentru identificarea cercurilor multiple .
2.5. Recunoa șterea semnelor de circulaț ie
În această etapă urmează a fi analizate rezultatele obținute în fazele precedente, iar apoi
identificarea semnelor dintr -o bază de date pusă la dispoziția sistemului. După prelucrarea
imaginii de la intrare se obține o pictogramă, semnul de circulație în c azul de față, care va fi
comparată cu cele de referință.
În etapa de recunoaștere, fiecare semn de circulaț ie este testat pe un anumit set de
caracteristici (după un model ), pentru a decide dacă este în grupul de semne rutiere sau nu , și
apoi este clasificat în diferite grupe. Aceste caracteristici sunt alese astfel încât să se sublinieze
diferențele dintre clase. Forma semnelor joacă un rol central în această etapă, ele fiind împărțite
pe categorii , cum ar fi triunghiuri, cercuri, oct ogoane , etc. Pictograma obținută permite o etapă
ulterioară de repartizare , prin analizarea ei impreună cu textul din interiorul semnului , fiind
ușor de stabilit clasa individuală. După acest pas, începe căutarea semnului în clasa respectivă,
iar apoi se a fișează rezultatul.
Deși imaginea a trecut prin mai multe filtre, a poi semnul a fost clasificat cât mai exact ,
acest proces de căutare necesită cel mai mult timp de execuție, fiind nevoie de un microprocesor
cât mai puternic.
2.6. Aplicaț ii ale sisteme lor de detectar e și recunoaștere a semnelor de
circulaț ie
Tehnicile de detectare și recunoaș tere a semnelor rutiere au fost dezvoltate într -o gamă
de domenii de aplicare care includ :
o Sistem ul de asistență pentru șoferi ( DSS3) care poate detecta și recunoaște
semne le de circulație în timp real , care ajută la îmbunătățirea f luxului și
siguranței în trafic;
o Intreținere a drumurilor , care este folosit ă pentru a verifica prezența și starea
semnelor de circulație;
o Inventarierea se mnelor d e circulaț ie reprezintă o provocare pentru cei care sunt
responsabili pentru in stalarea și întreținerea acestora.
3 DSS (Decision support system ) – sistem suport pentru luarea deciziilor.
Fundamentarea teoretică și documentarea bibliografică pentru tema propusă
11
Din 2008 până în prezent, sistemele TSR4 (Traffic Sign Recognition) s -au dezvoltat
continuu, iar numărul mașinilor care folosesc această implementare a crescut considerabil.
Aparent, mecanismul acestui sistem nu este foarte complicat : tehnologia utilizează o
cameră video integrată în oglinda interioară sau retrovizoare , care înregistrează traseul parcurs
de mașină. Imaginile sunt comparat e cu ce le stocate în baza de date, iar dacă valabilitatea
semnelor întâlnite este c onfirmată, acestea sunt afișate sub forma unei pictograme pe ecranul
computerului de bord.
În cazul în care vehiculul este dotat cu sistem de navigație sau cu un serviciu d e
informații despre trafic, TSR accesează datele oferite de device -ul/serviciul respectiv. Astfel,
limitările de viteză sunt afișate chiar dacă indicatoarele nu au fost observate sau, pur și simplu,
lipsesc cu desăvârșire (grație GPS5-ului, TSR recunoaște zona și afișeză viteza maximă de
deplasare conform legislației în vigoare – 50 km/h pentru localități, 90 km/h drumuri naționale,
100 km/h pentru drumuri europene, 130 km/h autostrăzi ). Ulterior, sistemul s -a dezvoltat
datorită tehnologiei și apariției sis temelor de calcul mai puternice care poate recunoaște mai
mult tipuri de semne, printre care cele de restricționare a depășirilor, de limitare a vitezei în
anumite intervale orare sau de pătrundere în zonele interzise.
În viitor, cei de la Continental (care, alături de experții Mobileye, sunt pionierii
sistemelor TSR moderne) promit că “asistentul” va fi capabil să recunoască avertizările
inscripționate pe asfalt, dar și indicatoarele specifice anumitor țări.
La sfârșitul unui test publicat de Auto Bil d Germania în 2011, ce a vizat compararea
mai multor sisteme TSR, s -a ajuns la un verdict neplăcut pentru producători (și clienți,
deopotrivă): tehnologia nu convinge.
Acest lucru se datorează faptului că sistemul funcționează defectuos pe toate mașinile,
rezultând erori mai mici sau mai mari, lucru care a făcut să scadă credibilitatea clienților. Un
șofer cu acest sistem implementat se poate baza pe el prea mult, iar la o informație greșită poate
fi neatent și detectarea necorespunzătoare sau neidentifica rea unui semn l -ar induce în eroare.
După doi ani, reprezentanța BMW în România afirmă faptul ca lucrurile au evoluat,
sistemul a fost updatat, iar acum funcționeaza bine. Sistemul nu este încă perfect d eoarece mai
există și unele mici erori, cauzate, în principal, de haosul specific circulației din România ( spre
exemplu , TSR poate deveni confuz în zonele unde muncitorii care repară drumurile instalează,
într-un singur loc, mai multe indicatoare de atenționare ). [9]
La moment ul actual, Ford a dezvoltat un sistem care recunoaște semnele limitării de
viteză, dar ia și decizii automate în funcție de semnul detectat. O cameră implementată în
spatele uneia dintre oglinzile retrovizoare observă fiecare indicator din trafic pe lângă care trece
autovehiculul și îl va afișa pe bord. [10]
Un sistem asemănător este și pe Mazda 6, care recunoaște semnele de circulație ș i
avertizează șoferul la depășirea benzii de mers. [11]
Compani a suedeză Mapillary își propune să construiască o aplicație care să te ajute să
descifrezi tainele mesajelor de pe drumurile dintr -o altă țară. Toate imaginile sunt conectate în
3D și obiectele recunoscute în acestea sunt automat etichetate și încadrate î n datele geospațiale.
Până în prezent, compania a întocmit o hartă a peste două milioane de kilometri, cu ajutorul
algoritmilor din spatele inteligenței artificiale, iar în viitor, aceștia își propun să adauge 500 de
noi semne în sistemul de recunoaștere a imaginilor și să extindă procesul dincolo de granițele
Europei și Statelor Unite. [12]
În tot acest timp în care constructorii de automobile investesc miliarde de euro în
tehnologii avansate de recunoaștere a semnelor rutiere și de prevenire a accidentelor,
4 TSR (Traffic Sign Recognition) – recunoațerea semnelor de circulație.
5 GPS (Global P ositioning System ) sistem de poziționare globală .
Sebastian Ungureanu
12
EuroNCAP6 cere standardizarea semnelor de circulație din Europa , pentru a veni în ajutorul
lor, precum Convenția de la Viena.
EuroNCAP și EuroRAP7 vor să introducă un standard de semnalizare rutieră în Europa.
Acest standard v izează atât indicatoarele folosite, cât și marcajele rutiere, iar scopul proiectului
este uniformizarea acestor elemente pentru a ajuta șoferii care călătoresc în mai multe state
europene. Cei de la EuroNCAP subliniază faptul că sistemele de avertizare la depășirea benzii
de mers au dificultăți la acest capitol în unele state și că sistemul ar funcționa mult mai bine
dacă toate marcajele rutiere ar fi proiectate în același stil.
În cadrul programului European Road Assessment, EuroNCAP dorește o colaborare
strânsă între constructorii de automobile și cei care construiesc și amenajează drumurile din
Europa. Dacă cele două pă rți ar colabora, arhitectura drumurilor, marcajele de pe margine și
vehiculele inteligente ar putea salva mii de vieți în fiecare an. Deș i sistemele respective au fost
realizate în baza unor investiții colosale, calitatea semnelor rutiere și modul de realizare al
acestora au fost ignorate. Nici o țară din Europa nu verifică sistematic nivelul de calitate al
marcajelor și semnelor rutiere. [13]
2.7. Specificaț iile privind caracterist icile așteptate de la aplicație
Se dorește obținerea unei aplicații modulare, ușor de implementat pe diverse platforme
cu rezultate bune în timp real și grad ridicat de siguranță. Doi factori critici sunt imaginile de
intrare, care trebuie să fie cât mai clare și să cuprindă toată zona în care se pot afla semnele,
dar redimensionate apoi la o rezoluție mică. Celălalt factor este microprocesorul care va
prelucra imaginile, sarcină care poate dura și câteva secunde , timp destul de mare pentru o
aplicație de timp real.
Timpul de execuție este direct proporțional cu rezoluția imaginii, iar din acest motiv
este reco mandat la început ca imaginea să fie adusă la o dimensiune cât mai mică , dar fără a se
neglija detaliile importante. Cu toate că noile camere video/foto oferă imagini de înaltă
rezoluție, peste 10 megapixeli, pentru o aplicație de recunoaștere a semnelor de circulație, este
recomandat ca imaginea de intrare să aibă sub 1 mega pixel chiar, pentru o prelucrare rapidă.
În același timp au evoluat ș i microprocesoarele, ajungând cu frecvența la ordinul de 109 Hz,
dar și cu numărul de nuclee la patru sau opt pentru sistemele obișnuite, performanța crescând
considerabi l.
6 EuroNCAP (European New Car Assessment Programme ) Programul european de evaluare a mașinilor noi
7 EuroRAP (European Road Assessment Programme ) Programul european de evaluare a drumurilor
Proiectarea aplicației
13
Capitolul 3. Proiectarea aplicației
Platforma pe care se va implementa aplicația este Raspberry Pi 3 , care va comunica și
cu FRDM KL -25Z. Va fi montată și Pic amera care va capta imaginile ce vor fi prelucrate de
algoritm. Noua versiune a camerei oferă o calitate bună, iar rezoluția maximă este de 8 MP.
Pentru un timp de răspuns mai bun, imag inile vor fi captate la o rezoluție mult mai mică, sub
1MP, dar cu toate acestea calitatea lor rămâne optimă, încât sistemul să poată funcționa corect.
Pe Raspberry va fi executat algoritmul de recunoaștere a semnelor de circulație, care
va primi ca da te de intrare imagini de la Pic amera în timp real, iar după recunoaștere se vor
trimite rezultatele către FRDM.
După prelucrare, semnul obținut se va compara cu semnele de referință pentru a se face
identificarea acestuia. Aplicația își propune recunoașterea a patru semne de ci rculație și anume:
”Stop”, ”Cedea ză trecerea”, ”Curbă la stânga” și ”Limitarea vitezei la 100 km/h”. Am ales doar
aceste semne pentru a obține un sistem cu un timp de răspuns bun, dar și cu o precizie ridicată.
Avantajul este timpul redus de procesare, pozele de referință având fiecare 10000 de pixeli
doar. Chiar dacă semnele au forme diferite, nu este nevoie de o clasificare separată a acestora,
datorită numărului redus din baza de date.
Sistemul în cauză este doar un prototip al unui sistem real în care numărul semnelor din
baza de date ar fi de ordinul zecilor, fiind nevoie de o separare a c ategoriilor pentru a ușur a
căutarea, eliminând comparați ile irelevante.
Pentru o funcționare corectă, semnele trebuie să fie cât mai clare, fără deformări sau
obstacole , iar vehiculul în mișcare să aibă o viteză redusă pentru a putea fi recunoscute. Cu c ât
senzorul camerei este mai performant, acest lucru însemnând o bună focalizare a capturii foto
într-un timp cât mai scurt, cu atât algoritmul va primi la intrare fotografii mai clare, iar semnele
vor fi identificare rapid după prelucrarea acestora .
Distanța dintre cameră și semn t rebuie să fie de aproximativ 50 cm, sistemul fiind test at
pe un traseu din laborator. Pentru o situație reală, algoritmul ar trebui modificat, dat ele de
intrare fiind diferite. Traseul fiind unul scurt, este necesar un timp de r ăspuns sub două, trei
secunde , iar rezultatul fără erori, pentru ca autovehiculul să ia decizia corectă.
3.1. Componentele software
Algoritmul care va fi executat va avea o structură simplificată, comparativ cu algoritmii
noi de pe sistemele implementate pe autovehicule. Numărul redus de semne ce urmează a fi
identificate f ace posibilă eliminarea unor etape din procesarea imaginii, precum și renunțarea
la rețele le neuronale.
Sebastian Ungureanu
14
În Figura 3.1 este prezentată structura algoritmului de recunoaștere a semnelor de circulație
folosit în această temă :
3.2. Tehnologii folosit e
Algoritmul are nouă mari etape de procesare, toate executate pe secvențial. Singurele
clase folosite sunt cea Mat, implementată în OpenCv și Raspicam_cv din Raspicam, plus
metodele lor. Aceste biblioteci au fost necesare deoarece m -au ajutat să lucrez mult mai uș or
cu imaginea primită de la Pic amera.
Sistemul de operare folosit pe Raspberry Pi 3 este Raspbian, care este bazat pe Debian
și face parte din familia Unix. El este principalul sistem de operare pentru toată familia
Raspberry, începând din anul 2012. Este un s istem de operare ușor de folosit, majoritatea
comenzilor întâlnite sunt întâlnite și pe Linux Mint sau Cent OS de exemplu. Faptul că este un
software liber oferă un mare avantaj, fiind accesibil oricărui utilizator în mod gratuit.
Prima distribuție Debia n a fost anunțată pe 16 august 1993 de Ian Murdock . El stă la
baza mai multor sisteme de operare printre care se numără: Ubuntu, MEPIS, Dreamlinux,
Damn Small Linux, Xandros, Knoppix, BackTrack, Linspire, Kanotix, Parsix, LinEx și Linux
Mint. Această distr ibuție este menținută la zi datorită efortului voluntar depus de utilizatori de
pe întreg mapamondul. Ea este testată riguros înainte de a fi lansată, pentru a asigura un grad
ridicat de stabilitate. Nu este foarte ușor de configurat, această distribuție f iind orientată în
principal către utilizatorul profesionist, dar are un foarte bun sistem de actualizare. Versiunile Imaginea captată
cu Pi Camera în
format RGB Aplicarea zoomului
asupra imagini și
binarizare Aplicarea filtrului
Gaussian pentru
netezire
Găsirea și
desenarea
contururilor într -o
nouă mască Detectarea
muchiilor
folosind
detectorul Canny Aplicarea eroziunii
și dilatării pe noua
mască
Găsirea celui mai
mare obiect din
mască și extragerea
sa individuală Compararea
pictogramei g ăsite
cu cele de referință Trimiterea
rezultatului către
FRDM Kl -25Z
Figura 3. 1 Schema algoritmului de recunoaștere a semnelor de circulație .
Proiectarea aplicației
15
mai noi tind să fie orientate mai mult către utilizatorul obișnuit și beneficiază de asistență de
calitate oferită de comunitatea de utiliz atori. [14]
Debian este cunoscut pentru o mare varietate de opțiuni. Versiunea curentă stabilă de
pachete software include peste douăzeci și nouă de mii pachete software pentru nouă arhitecturi
de calculator, utilizînd Linux Kern elplus . Acestea variază de la arhitecturile Intel / AMD 32 –
bit/64 -bit arhitecturi de obicei găsite în computere personale la arhitectura ARM8 frecvent
întâlnite în domeniul sistemelor integrate și mainframe -uri IBM zSeries eServer. Principalele
caracteristici ale Debian sunt managerul de pachete APT, arhive cu un număr mare de pachete,
politici stricte în ceea ce privește pachete le, și de înaltă calitate de înoire. Aceste practici permit
upgrade -uri ușor între versiuni, precum și instalarea autom ată și îndepărtarea de pachete.
Ca limbaj de programare, am avut de ales între Python, C++ și Matlab. Deși în Matlab
sau Python era mai rapid de făcut implementarea, am ales C++ datorită timpului mai mic de
execuție, lucru extrem de important într -o aplic ație real -time.
De ce este C++ mai rapid?
Python și Matlab sunt limbaje interpretate, iar C++ este compilat. Matlab de exemplu,
folosește un compilat or JIT (Just In Time) pentru translarea scriptului în cod mașină. Un alt
avantaj al limbajului C++ este faptul că lucrează direct cu memoria. În unele aplicații el poate
fi mai rapid decât Matlabul de câteva zeci de ori . [15]
Limbajul C++ a fost dezvoltat de Bjarne Stroustrup la începutul anilor 1980, adăugând
îmbu nătățiri limba jului C. Acestea au început cu adăugarea noțiunii de clase, apoi de funcții
virtuale, suprascrierea operatorilor, moștenire multiplă, șabloane (template) și excepții. [16]
Alt cr iteriu pentru această alegere a fost faptul că pănă acum, am utilizat cel mai mult
limbajul C++ și m -am obișnuit cu sintaxa și structura lui.
Pentru algoritmul folosit, a fost nevoie de biblioteca OpenCv care are implementate
clase și metode special pentru Computer Vision. Alegerea ei a fost una ușoară, fiind primul
proiect de acest gen, iar la o căutare mai amănunțită am observat că este foarte populară și
utilizată de o comunitate de peste zece mii de programatori. Acest lucru m -a ajutat să găsesc
rezolvarea unora dintre problemele în tâlnite de mine pe parcursul dezvoltării algoritmului.
Prima dată, ea a fost dez voltată de Intel pentru aplicațiile de timp real ș i cele 3D, iar
apoi întreținută de Itseez. Este scrisă în C++, dar poate fi folosită și de către alte limbaje
(Python, Matlab , Java).
Prima versiune a fost lansată în anul 2000, a urmat apoi versiunea 1.0 în 2006. În 2009
s-a făcut update la versiunea 2.0. Ultimul update este 3.2, lansat pe 23 decembrie 2016, care
va fi folosit și în aplicația curentă.
Ea rulează pe o varieta te de platforme, fiind foarte accesibilă oricui :
Desktop: Windows, Linux, macOS, FreeBSD, NetBSD, OpenBSD;
Mobile: Android, iOS, Maemo, BlackBerry 10.
Utilizatorii pot descărca ultima lansare de pe site -ul https://sourceforge.net/ ori pot l ua
ultimele surse de pe GitHub. [17]
A doua bibliotecă pe care am folosit -o a fost Raspicam, p entru a putea accesa direct
Picamera cu ajutorul limbajului C++. Cu ajutorul clasei Raspicam_cv și a metodelor ei am
reușit să captez imaginile necesare procesării.
Folosind aceste două biblioteci , am obținut imaginea de intrare, iar apoi cu metodele
din clasa Mat, am prelucrat -o.
8 ARM (Advanced RISC Machine ) este o familie de arhitecturi de calcul redus de instrucțiuni (RISC) p entru
procesoare de calculator, configurate pentru medii diferite .
Sebastian Ungureanu
16
Primul pas a fost aplicarea zoomului pentru scoaterea în evidență a semnului căutat,
apoi binarizarea imaginii. Funcția pe ntru zoom se găsește în Anexe la pagina 38, având același
nume . Folosind filtrul Gaussian am eliminat zgomotele nedorite, obținând o imagine mai
netedă de pe care am putut detecta mai ușor muchiile de i nteres cu detectorul Canny. Având
implementate ac este metode, le -am testat cu mai mulți parametri pentru a vedea care ar fi cei
optimi pentru obținerea celor mai bune rezultate.
Apoi , am folosit o mască și o nouă imagine pentru obținerea unei pictograme c u semnul
căutat. Comparația s -a făcut direct pixel cu pixel, cu patru imagini de referință salvate într -un
director de pe Raspberry. Funcția de comparar e se găsește în Anezx la pagina 38.
Dacă semnul nu este identificat, se reia întregul proces folosind m etoda goto, începând
de la capturarea unei noi imagini. Când semnul e ste identificat, se trimite automat un caracter
către FRDM, indicând funcția pe care o are de executat. Fiecare caracter este trimis î n funcție
de semnul recunoscut. Funcțiile pentru capt ura unei imagini și trimiterea caracterului, se găsesc
la paginile 36, respectiv 37 din Anexe.
3.3. Componente hardware
3.3.1 . Raspberry Pi 3 B
Principala resursă hardware este Raspberry Pi 3 B, platformă pe care va rula aplicația
creată și care va comunica direct și cu celelalte componente.
Raspberry Pi este un SBC (Single -Board Computer) de dimensiunile unui card de
credit, produs în UK de către Raspberry Pi Foundation cu scopul de a promova învățarea
noțiunilor de bază din domeniul informaticii în școli. Este cel mai de succes computer britanic,
fiind vândute unsprezece milioane de bucăți până în noiembrie 2016.
Prima generație (Raspberry Pi 1 B) a fost lansată în februarie 2012. A doua în 2015, iar
ultima (Raspb erry Pi 3 B) în februarie 2016. [18]
Figura 3.2 Raspberry Pi 3 B .
În imaginea de mai sus sunt prezentate principalele caracteristici ale platformei
Raspberry Pi 3 B.
Proiectarea aplicației
17
Față de prima generație, performanța a crescut de aproximativ zece ori, trecând de la
un CPU9 cu un singur nucleu ta ctat la 700 Mhz, la un CPU cu patru nuclee tactate la 1.2 Ghz.
Memoria RAM10 a fost și ea dublată la 1GB. Față de versiunea a doua, are un procesor și o
placă video cu frecvențe mai mari, plus conectivitate Bluetooth și Wireless.
Pentru alimentare este nevoie de o sursă de 5V și maxim 2.5A. [19]
Figura 3.3 Sysbench11 test cu un fir de execuție .
Figura 3.4 Sysbench test cu 4 fire de execuție .
Figura 3.5 Test de memorie .
În Figura 3.3, Figura 3.4 și Figura 3.5 sunt trei teste privind performanțele celor trei
generații de Raspberry. [20]
În primul test, Pi 3 este cu 60% mai performant decât Pi 2 și cu 170% față de prima
generație. În aplicația multi -threading12, diferența este considerabil mai mare față de Pi 1 care
9 CPU (Central processing unit ) Unitatea centrală de prelucrare .
10 RAM ( Random Access Memory ) Memoria cu acces aleator .
11SysBench este un instrument de referință modular, cross -platform și multi -threaded pentru evaluarea
parametrilor sistemului de operare care sunt importanți pentru un sistem care rulează sub o sarcină intensivă.
12 Multi -thread ing este o tehnică prin care un singur set de cod uri poate fi utilizat de mai multe procesoare în
diferite stadii de execuție .
Sebastian Ungureanu
18
are un procesor single core, Pi 3 fiind de zece ori mai rapid. Raportul de performanță este
același în s chimb și în acest test cu Pi 2. Superior este și în testul de memorie.
Figura 3.6 Nivelul performanțelor altor platforme .
În Figura 3.6 avem și o comparație cu alte p latforme, adversarul său fiind Jetson TX1,
care este mult mai performant, dar prețul de vânzare este de 500 dolari, față de 35 dola ri cât
costă Raspberry Pi 3, randamentul fiind în favoarea celui din urmă. [21]
3.3.2 . Procesorul Cortex A53
Figura 3.7 Schema arhitecturii procesorului A53 .
Cortex A53 este urmașul lui A7, având ca atuuri arhitectura ARMv8 pe 64 de biț i,
putând executa instrucțiuni atât pe 64 de biți cât și pe 32 de biți, dar și un consum mic raportat
cu creșterea performanței . El are două niveluri de memorie cache13, 8-64 KB L1 pentru fiecare
nucleu separat și o memorie comună L2 de până la 2MB.
13 Memoria cache este o zonă de memorie rapidă care echipează un dispozitiv electronic in scopul de a mări
viteza de lucru a a cestuia.
Proiectarea aplicației
19
Config urația procesorului :
Toate nucleele dintr -un grup au configurații identice, care au fost det erminate în timpul
construcției de configurare. Aceste configurații nu pot fi modificate prin software:
o Fie că toa te nucleele au protecție în memoria cache L1, fie nu are nici unul ;
o Fie că toate nucleele au Extensii SIMD14 avansate și Extensii în virgulă mobilă,
fie nici unul nu are ;
o Fie că toate nucleele au Extensii de criptografie15, fie nu are nici unul ;
o Toate nucleele trebuie să aibă memorie cache L1 de aceeași mărime, unul exact
ca toate celelalte.
Unul din avantajele mari ale acestui procesor o reprezintă implementarea arhitecturii
SIMD, tehnică ce permite executarea unei instrucțiuni folosind date multip le. Ea este utilă și la
procesarea unei imagini, de exemplu la modificarea luminozității sau co ntrastului. Pixelii
având câte trei culori (roșu, verde și albastru), se execută o singură ope rație, dar folosind toate
cele trei valori simultan.
Procesorul Cortex -A53 suportă prote cția memoriei cache sub formele ECC16 sau
paritate pe orice memorie RAM.
Instanțe din procesor utilizând două opțiuni de implementare separate:
• Protecție cache SCU -L2;
• Protecție cache CPU.
Aceste opțiuni permit procesorului Cortex -A53 să detecteze și să corecteze o eroare de
un bit în orice memorie RAM și detectarea erorilor pe doi biți în unele memorii RAM .
Core Wait for Interrup t (așteptarea nucleului pentru o întrerupere) este o caracteristică
a arhitecturii ARMv8 -A care pune nucleul într -o stare de putere redusă, dezactivând u-i
majoritatea ceasurilor, păstrând în același timp nucleul alimentat. Aceeași funcție o deține și
Core Wait for Event (așteptarea nucleului pentru un eveniment). Tot pentru economisirea
energiei este implementată și WFI( Wait For Interrupt) pentru memoria cache L2, funcție ce se
activează doar dacă cele patru nuclee sunt deja în modul WFI. Această condiție apare din cauza
faptului că memoria L2 este comună. [22]
14 SIMD (Single instruction, multiple data ) este una dintre arhitecturile de calculatoare paralele menționate în
Taxonomia lui Flynn.
15 Criptografia este o ramură a matematicii care se ocupă cu securizarea informației precum și cu autentificarea
și restricționarea accesului într -un sistem informatic
16 ECC ( Error -correcting code ) este un tip de stocare a datelor pe computer care poate detecta și corecta c ele
mai frecvente tipuri de corupție internă a datelor.
Sebastian Ungureanu
20
3.3.3. Picamera
Figura 3.8 Picamera .
A doua component ă importantă este Raspberry Pic amera V2 prezentată în Figura 3.8 , cu
care voi prelua imaginile ce urmează a fi prelucrate. Prima ei versiune a apărut în 2013, la un
an după lansarea lui Raspberry Pi 1 și avea un senzor OmniVision17 OV5647 cu o rezoluție
maximă de 5MP(2592 × 1944 pixeli). În 2016 a apărut versiunea a dou a, mai performantă cu
un senzor Sony IMX219 , capabil de o rezoluție de 8MP( 3280 × 2464 pixel i). [23]
MMAL18 este un layer(strat) care oferă o interfață foarte simplificată pentru firmware –
ul camerei care rulează pe GPU19. Conce ptual, acesta prezintă camera cu trei "porturi": portul
permanent, portul video și portul de previzualizare.
Portul permanent o ri de câte ori este folosit pentru a capta imagini, forțează modul
aparatului de fotografiat la unul dintre cele două moduri de funcționare acceptate, astfel încât
imaginile să fie capturate folosind zona completă a senzorului. De asemenea, utilizează un
algoritm puternic de reducere a zgomotului pe imaginile capturate, astfel încât să apară o
calitate superioară.
Camera suportă mai multe formate foto, cum ar fi: JPEG ( accelerat ), JPEG + RAW,
GIF, BMP, PNG, YUV420, RGB888 . În proiect am folosit formatul JPEG. Ea este capabilă sa
înregistreze și video în formatul RAW cu codecul h.264, la o rezoluție maximă de
1920×1080(Full HD) pixeli cu 30 fps(cadre pe secundă), 720p(HD) cu 60 fps și 480p(VGA)
cu 90 fps.
Conectarea cu Raspberry se face printr -o panglică de 15 centimetri conectată la interfața
serială Camera Port.
Puterea consumată este foarte mică, fiind necesar maxim 250 mA. Datorită consumului
mic, nu este nevoie de o sursă de curent foarte puternică, iar acest lucru ajută la o portabilitate
mai mare.
17 OmniVision este o companie care proiectează și dezvoltă tehnologii avansate de imagini digitale și produse
pentru utilizare în telefoane mobile, notebook -uri, netbook -uri și camere web, camere de supraveghere și
supraveghere, divertisment, camere digitale și video, sisteme autoimunitare și imagistică medicală.
18 MMAL (Multi -Media Abstraction Layer ) Stratul de abstractizare multi -media .
19 GPU (Graphics processing unit ) unitate de procesare graf ică, numită ocazional unitate de procesare vizuală
(VPU), este un circuit electronic special conceput pentru a manipula și modifica rapid memoria pentru a accelera
crearea de imagini într -un tampon de cadru destinat ieșirii pe un dispozitiv de afișare.
Proiectarea aplicației
21
Alt avantaj este faptul că poate capta peste 30 cadre pe secundă, lucru necesar într -o
aplicație de timp real, algoritmul nefiind obligat să piardă timp așteptând datele de intrare de
la camera video . [24]
Realizarea cone xiunii dintre Raspberry și FRDM a fost realizată cu ajutorul unui cablu
USB -miniUSB identic cu cel din Figura 3.9 . Ambele plăci suportă interfața serială, iar acest
lucru a simplificat transmiterea rezultatelor.
Tot cu ajuto rul acestui cablu se alimenteaz ă și placa FRDM, puterea livrată fiind
suficientă, placa având un consum de aproximativ 100 mA. Pentru alimentarea întregului
sistem voi folosi o baterie externă ca cea din Figura 3.10 , conectată prin USB la Raspberry,
care poate furniza 5V și 2A. Puterea este suficientă, luând în calcul consumul redus al
platformei și a faptului că singurele periferice sunt camera si placa FRDM, ambele având un
consum redus așa cum am specificat mai sus.
Figura 3.9 Cablu usb -mini usb . Figura 3.10 Baterie externă .
3.4. Schema bloc pentru intercone ctarea componentelor principale
Figura 3.11 Schema bloc a intercon ectării componentelor principa le.
Raspberry
Pi 3Sursa de
alimentare
Pi
CameraFRDM
KL-25Z
Sebastian Ungureanu
22
Capitolul 4. Implementarea aplicației
4.1. Descrierea implementării
În această etapă voi prezenta în amănunt algoritmul, problemele întâlnite, precum și
rezolvările l or, iar la final rezultatele obț inute.
Primul pas a fost obținerea datelor de intrare, în cazul de față imaginea , care va fi
prelucrată. Folosing clasa Raspicam_cv din biblioteca Raspicam am reușit să preiau imaginea
de la cameră și să o stoc hez într -o matrice bidimensională folosind clasa Mat din biblioteca
OpenCv . Inițial setările camerei nu erau cele optime, așadar a fost nevoie să modific rezoluția
imaginii, aducând -o la 800×800 pixeli. Am ales acest format deoarece în urma unor testări cu
rezoluții diferite, aceasta a oferit cele mai bune rezultate. Pentru că nu am putut seta o rezoluție
mai mică, am redimensionat ulterior imaginea la 300×300 pixeli, folosind metoda resize. Acest
lucru crește viteza de execuție al agoritmului, procesorul a vând mai puține operații de
efectuat ,iar memoria consumată fiind mai mică . Imaginea obținută este în format RGB.
Aplicația fiind testată în laborator, semnele vor fi instalate pe traseu, astfel încât să fie
captate în mijlocul imaginii. Având acest avanta j, am dat un zoom la imagine de 25%, elimând
o parte din obiectele care nu sunt în zona de interese. Pentru zoom am folosit doi vectori de
tipul Point2f , unul pentru intrare și unul pentru ieșire, în care am pus noile coordonate are
imagini și cele inițial e. Apoi, cu metodele getPerspectiveTransform și warpPerspective am
obținut noua imagine cu zoomul setat de mine.
Consultând documentația, am trecut la pasul următor, și anume tranformarea imaginii
RGB în una binară. Am creat o altă imagine în care am sto cat cea binară, poza originală
păstrând -o pentru o etapă următoare. Este necesar ca imaginea să fie binară, pentru ca filtrele
următoare să fie mai eficiente
Aplicând filtrul Gaussian , am ne tezit imaginea, elimi nând zgomotele pentru o detectare
mai ușoară a semnului. Nucleul filtrului a fost de dimensiune 5, pentru un efect mai bun, dar și
pentru o aplicare mai rapidă. Un nucleu de dimensiuni mari îngreunează timpul de execuție,
fiind nerecomandat în aplicațiile de timp real. În continuare am folosit detectorul Canny pentru
detectarea muchiilor, etapă ce ajută la găsirea conturului semnului ce urmează a fi detectat.
După ce am căutat toate contur urile, am creat o mască în care le -am desenat , obținând
o imagine alb -negru. Pixel ii negri reprezintă partea din imagine cu obiectele care nu sunt de
interes, iar zonele cu pixelii albi vor scoate în evidență semnul pe care îl căutăm . Din cauza
faptului că în anumite imagini pot apărea obiecte care să nu fie eliminate după aplicarea
filtrelor, în masca precedentă pot apărea mai multe contururi desenate , și nu doar cel a semnul ui
căutat. Pentru elimanarea obiectelor în plus am folosit eroziunea. După procesarea imaginii de
până acum, conturul cel mai mare este cel al semnului căutat în ma joritatea cazurilor. Pentru
extragerea obiectului separat, se caută conturul cu aria cea mai mare, urmând a fi încadrat într –
un dreptunghi și pus î ntr-o nouă imagine. Dacă nu este găsit nici un obiect, imaginea este goală,
iar algoritmul o ia de la capăt, preluând o nouă fotografie. A doua verificare este de a nu
compara pozele albe sau negre cu cele de referință. Există șansa ca numărul mare de pixeli albi
ori negri de pe un semn de circulație sa corespundă într -un procent suficient de mare cu o poză
forma tă în proporție foarte mare din pixeli doar albi sau negri , ceea ce ar da un rezoltat complet
eronat.
Înainte ca imaginea să treacă prin a doua verificare , se readuce la rezoluția imaginilor
de referință, 100×100 pixeli. Se aplică un prag cu valoarea de 80 pentru separarea pixelilor albi
de cei negri, eliminând nuanțele de gri.
Implementarea aplicației
23
Semnele de referință sunt stocare într -un director separat, iar citirea lor am făcut -o cu
ajutorul bibliotecii dirent.h.
Fiecare poză din baza de date are dimensiunea 100×100 pixeli, fiind nevoie doar de
binarizare și aplicarea pragului, dar cu valoarea de 127, asta datorită faptului că poza este
perfect clară și se obține rezultatul ideal. Compararea se face pixel cu pixel, utilizând tipul
uchar , care stochează valorile fiecărui pixel, 0 pentru negru și 255 pentru alb în cazul de față ,
pentru că am aplicat acel prag de separare. Ca să imi dau seama care este semnul detectat după
această comparație , aflu maximul de pixeli identici dintre cele patru imagini de referință.
Imaginea cu cel mai mare număr de pixeli identici cu semnul detectat este cel mai probabil
rezultat. Pentru o precizie mai bună, am stabilit că doar în cazul în care asemănarea este de cel
puțin 75%, atunci semnul este cu adevărat identificat. Această nouă verificare este utilă în cazul
în care se poate extrage un obiect necunoscut, dar să aibă un număr oarecare de pixeli identici
cu pozele din baza de date.
Pentru un grad mai ridicat de siguranță, am adăugat o logică m ajoritară 2/3. Astfel, dacă
la trei identificări consecutive, incluzând și cea în care semnul este necunoscut, măcar două din
ele nu sunt identice, atunci semnul se declară necunoscut, iar procesul se reia de la capăt,
preluând o nouă imagine. Totuși aceasă metodă s -a dovedit a fi eficientă, dar lentă în testul de
timp real , datorită faptul ui că pozele consecutive nu sunt suficient de clare, camera nefiind
îndeajuns de performantă încăt să focalizeze atât de bine în timp ce vehiculul este în mișcare .
Dacă semnul a fost găsit, numele imaginii de referi nță este pus într -un string , care va fi
utilizat la pasul următor. O v ariabilă ”cmd”, de tipul char, v a primi o literă în funcție de semnul
recunoscut. Caracterul va fi trimis la FRDM și se va lua o decizie în funcție de rezultatul primit.
4.2. Problem ele apărute pe parcursul dezvoltării algoritmului și soluții
găsite
Inițial am testat aplicația pe laptopul personal, folosind imagini din trafic sau făcute în
laborator cu telefonul mobil. Așa am început construirea algoritmului, u rmând pașii e numerați
mai sus. După primele etape , rezultatele intermediare nu erau tocmai cele așteptate,
segmentarea fiind diferită în funcție de imagine. Am modificat nucleul pentru filtrul Gaussian,
de la 3 până la 11, iar după mai multe teste, am observat că cele mai bune rezultate se obțin cu
cel de dimensiune 9. Ulterior, când am pus în funcțiune sistemul complet și am făcut testarea
în laborator pentru a vedea rezultatele în timp real, am modificat din nou nucleul la 5, așa cum
este și recomandat pentru un astf el de sistem, rezultatele fiind satisfăcătoare. A doua problemă
au fost muchiile fără contur sau conturile foarte mici care erau desenate în mască. Pentru
eliminarea lor am folo sit procesul de eroziune de două ori, cu dimensiunea eroziunii 2. Astfel
am ob ținut o mască mai curată, cu un număr redus de obiecte. Pentru a nu deforma și forma
semnelor căutate, am folosit procesul invers, și anume dilatarea. Tot de două ori cu
dimensiunea dilatării 2, dar zonele modificate fiind doar contururile rămase după eroz iune.
Cea mai mare problemă a fost extragerea celui mai mare obiect din noua imagine pentru
a obține o pictogramă de forma imaginii de referință. Studiind mai mult biblioteca OpenCv,
am descoperit funcția boundingRect , care folosită împreună cu cea de de tectare a celui mai
mare contur, extrage obiectul cel mai mare, îl încadrează într -un dreptunghi, iar apoi îl copiază
în noua poză. Încadrarea se face pe baza coordonatelor, stocate în contururi, care este un vector
2D de coordonate.
După acest pas, tot ce mai aveam de făcut era să compar pictograma obținută cu cele
patru semne de referință. Testând mai mult imagini, unele fără semne de circulație, am întâlnit
o eroare de tipul A ssertion. Verificând funcția din bibliotecă care trimitea această eroare, am
observat că imaginea avea numărul de linii și coloane egal cu 0. Acest lucru se întâmpla din
cauza faptului că dupa aplicarea filtrelor si eroziunii, imaginea rămasă era una alb ă, neavând
Sebastian Ungureanu
24
nici un obiect de extras și se obținea o poză goală. Astfel, am făcu t această verificare, iar în
cazul în care pictograma obținută este goală, algoritmul sare la pasul 1 și preia o nouă imagine.
Din testele făcute, am mai observat că unele poze în care predomină pixelii albi sau negri , ar
putea avea un număr suficient de m are de pixeli comuni cu poza de referință , ceea ce ar face
ca algoritmul să ofere un rezultat pentru ele, acest lucru fiind o eroare. Așadar, înainte de
compararea cu semnele de referință, verific dacă poza n u conține în procent de peste 80 % pixeli
doar al bi ori negri. În caz contrar, algoritmul o ia de la capăt și se prelucrează o nouă imagine.
Pentru logica majoritară 2/3, am creat o funcție care întâi incrementează câte o variabilă
pentru fiecare semn detectat. Se calculează maximul dintre aceste valori , iar comanda va primi
caracterul specific acestei valori. De exemplu, dacă în urma a trei detectări consecutive, se
găsește de două ori semnul ” Stop” (se incrementează cu 2 vari abila atribuită lui) și o dată
semnul ”Cedează Trecerea” (se incrementează cu 1), maximul este 2 și comanda va primi
caracterul ‘r’,specific semnului ”Stop” . Această codifcare a fost făcută de mine pentru a putea
urmări mai ușor rezultatele algoritmului. Dacă se detectează trei semne diferite, se declară
”semn necunoscut”.
Realizân d testarea în două locuri diferite, am observat rezultate diferite și am decis să
salvez pozele din ambele medii și să le prelucrez pe laptop. După procesarea a două seturi de
imagini și obținerea rezultatelor diferite, am constat at faptul că lumina incint ei influențează
calitatea pozelor, camera foto fiind afectată de acest factor. Neavând o a doua cameră, a fost
nevoie să modific setările camerei pentru a prelua fotografii cât mai optime.
La această problemă se poate adăuga și claritatea semnelor de cir culație. Pentru o
evidențiere mai bună, am decupat semnele și le -am așezat pe câte un suport cu o mărime
potrivită raportată la dimensiunea traseului, dar și a sistemului mobil pe care se testează
aplicația. Într-un sistem implementat pe autovehicule, aces t lucru rămâne valabil, fiind necesar
un standard al semnelor, așa cum este Convenția de la Viena, dar și verificarea lor periodică,
pentru a schimba semnele deteriorate ori a înlătur a obiectele care le -ar acoperi.
4.3. Funcționarea sistemului
În continuare voi prezenta pe scurt principalii pași din funcționarea sistemului, în care
se vor observa etapele prelucrării.
a b
Implementarea aplicației
25
c d
e f
g h
Figura 4.1 Etapele algoritmului.
În Figura 4.1 sunt prezentate principalii pași ai algoritmului de recunoaștere, precum și
modificările de la prima etapă, până la ultima.
a – Imaginea originală ;
b – Imaginea după aplicarea zoomului, binarizare și aplicare filtrului Gaussian ;
c – Rezultatul a plicării detectorului Canny ;
d – Desenarea contururilor interioare rezultând masca inițială ;
Sebastian Ungureanu
26
e – Aplicarea eroziunii și a dilatării;
f – Noua imagine obținută doar cu obiectele de interes ;
g – Imaginea obținută după extragerea celui mai mare obiect ;
h – Semnul de referință .
Imaginile din figurile g și h sunt cele comparate final, în exemplul de mai sus
asemănarea fiind de 92.12%, iar semnul detectat este ”Curbă la stânga” și caracterul trimis este
‘g’.
4.4. Comunicarea cu alte sisteme și salvarea/stoca rea informațiilor
Sistemul are două mari componente care comunică între ele și anume:Raspberry Pi 3 și
FRDM KL -25Z. Algoritmul care rulează , trimite rezultatul către FRDM pentru a fi interpretat
și a se lua deciziile în funcție de semnul identificat. Comunicarea se face pe cale serială folosind
dispozitivul de comunicare ACM0 . Mai exact, în fiș ierul ttyACM0 din directorul ”dev”, se
scrie câte un caracter, în cazul de față ,comanda, care va fi trimisă la FRDM. Ea este realizată
cu ajutorul unui cablu USB.
Comunicarea serială reprezintă o formă de I/ O, în care biții dintr -un byte sunt transferați
unul câte unul, într -o secvență sincronizată pe u n singur fir.
Un atu al USB -ului este siguranța crescută a transferurilor de date, se poate spune că
este o magistrală robustă. La asigurarea acestei calități, contribuie o serie de factori: principii
funcționale, accesorii implementate în acest scop, res tricții constructive bine definite. Pentru a
garanta securitatea datelor este implementată o metodă CRC20 pentru corectarea erorilor. În
caz de eroare, sistemul hotărăște retransmiterea de trei ori a pachetului de date alterat, după
care este informat utili zatorul care decide asupra modului de acționare.
Într-un sistem industrial comunicarea s -ar putea realiza între Raspberry și un ecran sau un
difuzor .
Pentru stocare am folosit un card microSD de 8GB, pe care am instalat sistemul de
operare Raspbian și bi bliotecile necesare . Cele patru semne de referință sunt salvate în
directorul proiectului. Fiind o aplicație de timp real, rezultate nu sunt salvate, scopul lor fiind
modificarea comportamentului sistemului.
4.5. Interfața cu utilizatorul
Utilizatorul poate observa rezultatele , în funcție de comenzile pe care le execută
vehiculul în timpul parcurgerii traseului. Cunoscând semnificația semnelor de circulație, el își
poate da seama dacă sistemul funționează corect în funcție de deciziile pe care le ia.
Pentru a nu crea confuzii utilizatorului, placa FRDM va aprinde un led de culoare
diferită pentru fiecare semn detectat. În felul acesta si stemul se poate testa fără a fi nevoie de
vehiculul în mișcare, ci doar urmărind modificarea culorii ledului.
Imple mentat pe o mașină, rezultatele ar putea fi afișate în computerul de bord, putând
fi adăugate și inf ormații despre semnul detectat .
20 CRC (Control Redundant Ciclic) este o tehnică folosită pentru detecția erorilor de transmisie.
Implementarea aplicației
27
4.6. Calibrarea sistemului
Fiind o aplicație de tip real primele rezul tate nu au fost cele așteptate și a fost nevoie să
fac unele modificări atât hardware, cât și software. După nenumărate teste cu seturi diferite de
date de intrare, am modificat nucleul Gaussian de la 9 la 5 pentru o netezire mai puțin
accentuată. Inițial am comparat semnele identificate cu semnele de referință în format RGB,
dar rezultatele erau cele nedorite în multe cazuri, în special datorită aplicării pragului care este
recomandat pentru imagini binare . După tranformarea ambelor imagini din format RGB în cel
Gray, rezultatele au fost mai bune, atât în medii cu lumină puternică, cât și în cele cu iluminare
mai scăzută . Un alt parametru important a fost dimensiunea eroziunii, dar și numărul repetării
acesteia. Pentru primul set de imagini, o aplicare a eroziunii de cinci sau șase ori avea un
rezul tat excelent, eliminând toate obiectele în afara semnului de circulație. După testarea unui
alt set de fotografii, inclusiv testarea în timp real, am observat rezultate diferite, majoritatea
imaginilor obținute după eroziune fiind albe. Am redus numărul de eroziuni la 2, chiar dacă
însemna un mic compromis.
Hardware, am avut de calibrat camera, setările inițiale fiind nepotrivite pentru aplicația
mea. Am modificat rezoluția, iar apoi valoarea ISO21 și expunerea, motivul fiind lumina
artificială din laborato r în cazul în care provine de la un bec sau neon ori lumina naturală, dar
cu o intensitate mai mică față de spațiul din aer liber. Cu o valoare ISO mică, poza va ieși mai
întunecată în condiții de iluminare slabă, pierzându -se multe detalii importante. Cu toate că
modificarea nu aduce rezultatele cele așteptate, este o soluție mult mai bună decât utilizân d
camera cu setările implicite. Același rezultat se obține și cu
modificarea expunerii, diferența fiind mai accentuată.
21 ISO este u n sistem pentru cuantificarea sensibilității ("vitezei") unei emulsii fotosensibile sau a unui senzor
de imagine al camerei digitale cu semiconduc tori la lumina vizibilă.
Sebastian Ungureanu
28
Capitolul 5. Testarea aplicației și rezultate experimentale
5.1. Instalarea și lansarea aplicației
Raspberry Pi vine fără sistem de operare, fiind necesar instalarea lui pe un card
microSD. De pe site -ul oficial am descărcat varianta ” RASPBIAN JESSIE LITE ”, apoi am
montat -o pe card.
Aplicația rulează automat pe Raspberry, din momentul în care sistemul de operare
boote ază. Configurarea s -a realizat prin adăugarea căi i și numelui executabilului în fișierul
”rc.local”.
Pentru procesarea imaginilor și captarea lor cu Pic amera a fost nevoie de instalarea
bibliotecilor OpenCv și Raspicam .Camera a fost testată inițial folosind comanda raspistill , iar
apoi am comparat fotogafiile cu cele făcute cu ajutorul bibliotecii Raspicam. Rezultatele nu au
fost identice, parametrii impliciți fiind diferiți și a fost nevoie să modific expunerea și valoarea
ISO, pentru a capta mai multă lumină.
5.2. Resurse hardware necesare
Aplicația a fost rulată inițial pe laptopul personal, care are o configurație hardware
mai puternică, rezultate fiind foarte bune. Timpul de procesare este în medie de 0.06 secunde,
încărcarea procesorului fiind de ~15%, iar memoria consumată 1 0-20MB. Din acest punct de
vedere, nu există nici o limitare, sistemul având resurse hardware suficiente. Testând și cu
imagine cu rezoluția de 3000×4000, sistemul este considerabil mai lent, timpul ajung ând la 3
secunde, încărcarea procesorului la 80% max im, iar memoria 100 -160 MB. Acest lucru este
normal, datorită mărimii de 12MP a imaginii care este încărcată în memoria RAM în timpul
execuției.
Din aceste motive am ales să folosesc imagini la o rezoluție mică, de 300×300 pixeli.
Figura 5.1 Rularea programului folosind imagini cu rezoluția 300×300 pixeli .
Figura 5.2 Rularea programului folosind imagini cu rezoluția 300 0x4000 pixeli .
Testarea aplicației și rezultate experimentale
29
În Figura 5.1, respectiv 5.2 se poate observa încărcarea memoriei și a procesorului în
funcție de dimensiunea imaginii de intrare.
Pe Raspberry, aplicația consumă aproximativ aceleași resurse, dar în schimb timpul este
mai mare de aproape trei ori, durata prelucrării unei imagini fiind de ~0.15 s ecunde. Acest
lucru se datorează în special procesoarelor diferite, laptopul având un procesor I7 4700MQ pe
arhitectură diferită, tot quad core, dar cu Hyperthreading și frecvența maximă de 3.2Ghz, față
de 1.2Ghz cât are procesorul A53 de pe Raspberry Pi 3 B.
Fiind nevoie să trimit doar câte un caracter la FRDM, am setat baudrate -ul la 9600 bps,
suficient de mare pentru acest transfer de date, care nu va depăși 20 de caractere pe secundă,
în cel mai defavorabil caz.
5.3. Date de test și benchmarkuri
Pentru testarea inițială, am folosit diferite poze făcute și în laborator, dar și din trafic
pentru a observa diferențele și a modifica procesarea schimbând unii parametri.
Figura 5.3 Imagine din trafic cu semnul S top. Figura 5.4 Imagine din laborator cu semnul Stop .
Figura 5.5 Semnul Curbă la stânga. Figura 5.6 Semnul Cedează trecerea.
Testând algoritmul pe aceste imagini primite ca date de intrare, recunoașterea a avut
loc cu succes, iar asemănarea depășind 75% așa cum am stabilit de la început. Imaginea din
Figura 5.6 a fost făcută cu Pic amera și se poate observa influența luminii, fiind nevoie de
mărirea expunerii pentru a capta o imagine cu luminozitatea potrivită astfel încât să fie scos în
evidență semnul căutat.
Sebastian Ungureanu
30
Figura 5.7 Semnul Cedează trecerea. Figura 5.8 Semnul Cedează trecerea din trafic.
Figura 5.9 Imagine cu semnul Stop. Figura 5.10 Imagine cu semnul Cedează trecerea.
Deși aceste imagini par asemănătoare cu primele 4, rezultatele sunt diferite. În Figura
5.7 avem aceeași imagine ca în Figura 5.6, dar se poate observa o mică diferență a lum inii, ceea
ce face ca semnul să nu fie identificat. Imaginea următoare are o rezoluție mică, muchiile
obiectelor neputând fi detectate, rezultând o imagine preponderent formată din pixeli albi.
Identificarea semnului ”Stop” din a treia imagine ar putea fi posibilă, doar dacă se modifică
majoritatea parametrilor pentru filtrele aplicate imaginii, ceea ce ar face ca algoritmul să
răspundă negativ la celelalte fotografii. În ultima imagine, deși pare ideală, semnul nu este găsit
din cauza zoomului aplicat, car e scoate din cadru o parte importantă, ce face ca detectorul
Canny să nu poată găsi conturul întreg.
Pentru a observa eficiența redimensionării imaginilor de intrare, am realizat șase teste
cu fotografii de rezoluții diferite, în car e am măsurat timpul de execuție .
Figura 5.11 0.09MP Figura 5.12 1MP Figura 5.13 2MP
Testarea aplicației și rezultate experimentale
31
Figura 5.14 4MP Figura 5.15 8MP Figura 5.16 16MP
Figura 5.11 – Timpul de execuție exprimat în secunde pent ru o fotografie 300×300 pixeli
Figura 5.12 – Timpul de execuție exprimat în secunde pentru o fotografie 1000×1000 pixeli
Figura 5.13 – Timpul de execuție exprimat în secunde pentru o fotografie 1440×1440 pix eli
Figura 5.14 – Timpul de execuție exprimat în secunde pentr u o fotografie 2000×2000 pixeli
Figura 5.15 – Timpul de execuție exprimat în secunde pentr u o fotografie 2828×2828 pixeli
Figura 5.16 -Timpul de execuție exprimat în secund e pentru o fotografie 4000×4000 pixeli
5.4. Aspecte legate de fiabilitate și securitate
De la varianta inițială și până la cea finală, sistemul de recunoaștere a fost testat de peste
zece ori, de fiecare dată cu succes, exceptând cazurile c ând lumina era scăzută ori prea
puternică, iar acest lucru afecta calitatea pozelor captate de cameră. Cu toate astea, sistemul ar
funcționa, comportamentul vehiculului rămânând neschimbat, deoarece ar primi de la
Raspberry caracterul specific pentru ”semn necunoscut”. Ca metodă de precauție, pe placa
FRDM a fost setat un timer care se resetează de fiecare dată când primește un c aracter. Dacă
timpul depășește cinci secunde, sistemul se oprește, indicând o defectare a modulului de
recunoaștere a semnelor de circulație.
Pentru ca vehiculul să pornească, este necesar ca algoritmul de recunoaștere să își
înceapă execuția primul, el trimițând o comandă de start înainte să intre în bucla infinită. În
cazul în care se pierde conexiunea între cele două componente sau apare o problemă la FRDM,
platforma Raspberry trebuie resetată.
Pentru a vedea și fiabilitatea în timp, am testat continuu modeul de recunoaștere a
semnelor zece ore, verificând periodic dacă reacționează la apariția semnelor, rezultatul fiind
poziti v. Eficiența a fost aceeași până la final, recunoașterea semnelor fiind la fel de rapiă și
precisă. Este foarte impo rtant ca alimentarea să nu fie întreruptă.
Sebastian Ungureanu
32
5.5. Rezultate experimentale
a b c d
Figura 5.17 Testarea modului pentru recunoașterea semnelor și verificarea
rezultatelor urmărind culoarea ledurilor:a -recunoașterea semnului ”Cedează trecerea”;b –
recunoașterea semnului ”Curbă la stânga”, c -recunoașterea semnului ”Stop”, d -recunoașterea
semnului ”Limită viteză 100 km/h.
În cele patru imagini de mai sus se poate obseva funcționarea sistemului, algoritmul
recunoscând cele patru semne de circulație și aprinzându -se câte un led de culoare diferită.
Testarea s -a efectuat în spațiu închis, dar pe timp de zi și lumina a fost puternică, semnele fiind
ușor de identificat.
5.6. Utilizarea sistemului
Aplicația va fi testată pe un traseu din laborator, iar pentru punerea în f uncțiune, trebuie
doar alimentate platforma Raspberry și motoarele de pe kitul robot. După ce algoritmul de
recunoaștere începe să ruleze, vehiculul este pus în mișcare automat .
Modulul de recunoaștere fiind independent, poate fi folosit și separat fără k itul robot.
Având doar două componente hardware și sursa de alimentare, modulul este portabil și se poate
utiliza în majoritatea spațiilor din aer liber sau în incinta unei clădiri. Folosind doar algoritmul,
ar putea fi implementat și pe alte platforme împreună cu o interfață grafică , de exemplu pentru
crearea unei aplicații mo bile folosită pe smartphone -uri.
Concluzii
33
Capitolul 6. Concluzii
În urma realizării acestui proiect, am învățat despre cum ne putem folosi de tehnologia
actuală, care a ajuns la un nivel înalt și poate prelua multe sarcini ale oamenilor. Tema și -a
propus inițial realizarea unui sistem capabil să atenționeze șoferii cu p rivire la semnele de
circulație întâlnite, oferind informații în timp real. Chiar dacă rezultatele finale sunt
satisfăcătoare, sistemul încă nu este suficient de sigur și precis încât să poată fi folosit în alte
scopuri decât cele experimentale.
După o ce rcetare amănunțită am observat că nu există încă un astfel de sistem perfect,
chiar și cele mai avansate având o marjă de eroare. Acest a lucru a însemnat o provocare mai
mare, fiind motivat să găsesc o soluție optimă care ar putea fi un model pentru o vii toare
aplicație profesională. Pe toată durata dezvoltării aplicației am întâmpinat diferite probleme,
astfel am descoperit singur complexitatea acestui algoritm și am înțeles de ce nu există o
versiune fără erori, deși se fac studii intense pe această temă de peste zece ani.
O îmbunătățire considerabilă este înlocuirea camerei cu una mai performantă, calibrată
pentru a scoate fotografii optime în orice condiții și să nu d epindă de factori precum:lumina
soarelului, ploaie, ninsoare, cer înnorat. O astfel de cameră ar putea face practică utilizarea
sistemului și pe timp de noapte, ajutată de lumina farurilor de exemplu. Consider acest lucru
posibil de realizat, deoarece am testat aplicația și noaptea, utilizând ca sursă de lumină blițul
de la tele fon, iar detectarea a fost cu succes, evident nu la fel de rapidă și precisă ca atunci când
este făcută ziua.
Privind și semnele aflate în trafic, sunt de părere că nu toate îndeplinesc un standard
astfel încât să poată fi ușor de recunoscut cu un astfel de program, multe fiind greu de observat
chiar și de ochiul uman. Un nou standard mai riguros, asemănător Convenției de la Viena, ar
ajuta dezvoltatorii unor astfel de aplicații, iar sistemul ar fi practicabil la scară globală sau cel
puțin doar în Europa.
Testând aplicația cu un număr cât mai mare de imagini și obținând rezultate diferite,
am decis să modific unii parametri setați inițial . Astfel, am redus întâi rezoluția pentru a
micșora timpul de prelucrare și am aplicat un zoom mai mare. Dimensiunea n ucleului pentru
filtrul Gaussian am redus -o de la 9 la 5, asta după ce am observat rezultate mai bune atunci
când testarea se face în timp real. Un motiv ar fi faptul că un nucleu mai mic necesită un timp
de procesare mai mic, dar modifică mai puțin imagin ea, care oricum nu este la fel de clară ca
atunci când camera este într -o poziție fixă , din cauza focalizării lente. Există și un dezavantaj
setând un nucleu de dimensiune mai mică, mai exact, imaginea va fi procesată mai rapid dar
vor rămâne mai mult e obiecte care vor fi detectate cu detectorul Canny, iar apoi verificate pe
rând pentru a stabili care este mai mare.
Având la dipoziție biblioteca OpenCv, variantele de implementare sunt foarte variate
în funcție de scopul final al aplicației. Urmărind recuno așterea a unui număr restrâns de semne,
am încercat să dezvolt un algoritm rapid, dar și cu câteva etape de verificare pentru o precizie
mai bună. Ideea numărării pixelilor albi și negri a fost rezultatul numeroaselor teste și a unor
rezultate greșite care păreau greu de explicat. Abordând mai mult această problemă, am venit
cu ideea de a adăuga un element în plus de precizie și anume, redundanța. Sistemul fiind în
mișcare, pozele captate pot fi deformate, iar unele obiecte extrase și comparate ar putea fi
detectate ca semn de circulație. În schimb, încercarea detectării consecutive, reduce
considerabil numărul unor astfel de greșeli.
Sebastian Ungureanu
34
Față de așteptările pe care le am avut inițial, rezultatele nu a u fost identice, dar aplicația
și-a atins scopul în mare mă sură, recunoașterea fiind foarte rapidă, sub o secundă dacă imaginea
este clară, dar și precisă fără a confunda semnele între ele. Utilizată pe sistemul mobil, este
nevoie ca acesta să aibă o viteză redusă pentru ca fotografiile captate de cameră sa fie fo calizate
cât mai bine, altfel filtrele aplicate asupra imaginii ar deforma toate obiectele, inclusiv semnul
căutat.
În încheiere, sunt de părere că momentan, un compute r nu poate prelua orice sarcină.
În unele cazuri el este incapabil de a lua decizii car e nu sunt predictibile sau de a observa detalii
care în anumite situaț ii, doar un om le -ar putea percepe .
Bibliografie
35
Bibliografie
[1] „Unece,” [Interactiv]. Available:
https://www.unece.org/fileadmin/DAM/trans/conventn/C onv_road_signs_2006v_EN.p
df. [Accesat 23 March 2017].
[2] „Autobild,” 18 Iunie 2008. [Interactiv]. Available:
http://www.autobild.de/artikel/assistenzsystem -von-opel-722126.html. [Accesat 22
Aprilie 2017].
[3] A. Todea, „Regie Live,” 2014. [Interactiv]. Available:
https://biblioteca.regielive.ro/proiecte/transporturi/sisteme -de-detectare -si-
recunoastere -a-semnelor -de-circulatie -330333.html. [Accesat 10 March 2017].
[4] „Wowarea,” 2006. [Interactiv]. Available:
http://www.wowarea.com/englis h/help/color.htm. [Accesat 21 May 2017].
[5] O. Groza, „Ovidiugroza,” 22 Februarie 2009. [Interactiv]. Available:
https://ovidiugroza.wordpress.com/2009/02/22/indicatoare -rutiere/. [Accesat 5 Mai
2017].
[6] H. Fleyeh, „Research Gate,” 3 12 2004. [Inter activ]. Available:
https://www.researchgate.net/publication/4152112_Color_detection_and_segmentation
_for_road_and_traffic_signs. [Accesat 25 Martie 2017].
[7] F. Moldoveanu, „Andrei Clubcisco,” [Interactiv]. Available:
http://andrei.clubcisco.ro/cursuri/ 4spg/9.detectia.frontierelor.in.imagini.PDF. [Accesat
25 Mai 2017].
[8] R. Harvey, „Rochester Institute of Technology,” 11 10 2005. [Interactiv]. Available:
https://www.cis.rit.edu/class/simg782/lectures/lecture_10/lec782_05_10.pdf. [Accesat
10 Mai 2017].
[9] „Webcar Blog,” 8 Iulie 2013. [Interactiv]. Available:
http://www.webcarblog.ro/sistemul -de-recunoastere -a-semnelor -de-circulatie/.
[Accesat 14 Aprilie 2017].
[10] B. Cristea, „Playtech,” 30 Martie 2015. [Interactiv]. Available:
https://playt ech.ro/2015/noul -ford-s-max-recunoaste -automat -semnele -de-circulatie -si-
ajusteaza -viteza/. [Accesat 20 Mai 2017].
[11] „Mazda,” Mazda, 2017. [Interactiv]. Available: http://www.mazda.ro/modele/mazda6 –
sedan -2017/performance/. [Accesat 28 Mai 2017].
[12] I. Bîrsan, „Playtech,” 7 Februarie 2017. [Interactiv]. Available:
https://playtech.ro/2017/in -curand -vei-putea -traduce -semnele -de-circulatie -cu-ajutorul –
smartphone -ului/. [Accesat 28 Mai 2017].
[13] S. Toma, „Automarket,” 30 Iunie 2011. [Interactiv]. Av ailable:
http://www.automarket.ro/stiri/euroncap -cere-standardizarea -semnelor -de-circulatie –
din-europa -39037.html. [Accesat 23 Aprilie 2017].
[14] „Debian,” [Interactiv]. Available: https://www.debian.org/intro/about.ro.html. [Accesat
28 Mai 2017].
Sebastian Ungureanu
36
[15] S. Mallick, „Learn OpenCv,” 30 Octombrie 2015. [Interactiv]. Available:
https://www.learnopencv.com/opencv -c-vs-python -vs-matlab -for-computer -vision/.
[Accesat 2 Martie 2017].
[16] „Prezentarecpp,” 2012 Iunie 2012. [Interactiv]. Available:
https:// prezentarecpp.wordpress.com/2012/06/09/istoric/. [Accesat 5 Martie 2017].
[17] M. Felsberg, „Cvl Isy Liu,” 2015. [Interactiv]. Available:
https://www.cvl.isy.liu.se/education/graduate/opencv/Lecture1_History.pdf. [Accesat 5
Martie 2017].
[18] S. Bush, „Ectronicsweekly,” 25 Mai 2011. [Interactiv]. Available:
https://www.electronicsweekly.com/market -sectors/embedded -systems/dongle –
computer -lets-kids-discover -programming -on-a-2011 -05/. [Accesat 23 Aprilie 2017].
[19] „Raspberrypi,” [Interactiv]. Available: https://www.raspberrypi.org/products/raspberry –
pi-3-model -b/. [Accesat 20 Ianuarie 2017].
[20] C. Stanton, „Element 14,” 29 Februarie 2016. [Interactiv]. Available:
https://www.element14.com/community/community/raspberry -pi/blog/2016/02/29/the –
most -comprehensive -raspberry -pi-comparison -benchmark -ever. [Accesat 5 Mai 2017].
[21] M. Larabel, „Phoronix,” 5 Martie 2016. [Interactiv]. Available:
http://www.phoronix.com/scan.php?page=article&item=raspberry -pi-3&num=3.
[Accesat 20 Mai 2017].
[22] „Infocenter ARM,” 2014. [Interactiv]. Available:
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0500d/DDI0500D_cortex_a53_r
0p2_trm.pdf. [Accesat 23 Mai 2017].
[23] „Raspberrypi,” [Interactiv]. Available:
https://www.raspberrypi.org/documentation/har dware/camera/. [Accesat 23 Mai 2017].
[24] D. Jones, „Picamera,” [Interactiv]. Available:
https://picamera.readthedocs.io/en/release -1.13/index.html. [Accesat 23 Mai 2017].
Anexe
37
Anexe
Anexa 1. Codul sursă
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <stdlib.h>
#include <iostream>
#include <ctime>
#include <dirent.h>
#include <raspicam/raspicam_cv.h>
#include<unistd.h>
#include<fstream>
using namespace cv;
using namespace std;
using namespace raspicam ;
#define ker 5 //dimensiunea nucleului pentru filtrul Gaussian
#define red 1 //nivelul redundantei, pentru valoarea 1 sistemul este
neredundant, dar mai rapid
#define erosion_size 2
#define dilate_size 2
#define idem 7500 //indicele pentru stabilirea asemanarii intre semnul detectat
si cel de referinta
#define iso 100 //valoarea ISO pentru setarea camerei
#define exposure 5 //valoarea expunerii pentru setarea camerei
void captura(Mat &image )
{
raspicam ::RaspiCam_Cv Camera ;
//setare parametri camera
Camera.set( CV_CAP_PROP_FORMAT , CV_8UC3 );
Camera.set(CV_CAP_PROP_FRAME_WIDTH ,800);
Camera.set(CV_CAP_PROP_FRAME_HEIGHT ,800);
Camera.set(CV_CAP_PROP_GAIN ,iso);
Camera.set(CV_CAP_PROP_EXPOSURE ,exposure );
if (!Camera.open())
{
cerr<<"Error opening the camera" <<endl;
}
Camera.grab(); //start captura
Camera.retrieve (image);
Size size2 (300, 300);
resize(image, image, size2); //redimensionarea imaginii la o rezolutie mai
mica
Camera.release();
}
Sebastian Ungureanu
38
void redundanta (char *semne,int &r,int &g,int &b,int &v,int &n)
{
int k;
for (k = 0; k < red; ++k)
{
if (semne[k] == 'r')
r++;
else if (semne[k] == 'g')
g++;
else if (semne[k] == 'b')
b++;
else if (semne[k] == 'v')
v++;
else if (semne[k] == 'n')
n++;
}
}
void maxim(int r, int g, int b, int v, int n,int &max,char &cmd)
{
if (r > g && r > b && r > v && r > n)
{
max = r; cmd = 'r';
}
else
if (g > b && g > v && g > n)
{
max = g; cmd = 'g';
}
else
if (b > v && b > n)
{
max = b; cmd = 'b';
}
else
if (v > n)
{
max = v; cmd = 'v';
}
else
{
max = n; cmd = 'n';
}
}
void send(char a)
{
ofstream fd ;
fd.open("/dev/ttyACM0" ); //deschiderea fisierului ttyACM0 in care
va fi scris caracterul a, pentru a fi trimis prin seriala la FRDM
fd<<a;
fd.close();
}
Anexe
39
int comparare (Mat src,Mat dst)
{
int x, y,count=0;
uchar color, color2;
for (x = 0; x < src.rows; x++)
{
for (y = 0; y < src.cols; y++)
{
color = dst.at<uchar>(Point(x, y));
color2 = src.at<uchar>(Point(x, y));
if ((color == color2))//compararea pixelilor din cele doua
matrice
count++;
}
}
return count;
}
void zoom(Mat src,int zoom)
{
Point2f outputQuad [4], inputQuad [4];
Mat lambda (2, 4, CV_32FC1 );
lambda = Mat::zeros(src.rows, src.cols, src.type());
inputQuad [0] = Point2f(zoom, zoom);
inputQuad [1] = Point2f((src.cols – zoom), zoom);
inputQuad [2] = Point2f((src.cols – zoom), src.rows – zoom);
inputQuad [3] = Point2f(zoom, src.rows – zoom);
outputQuad [0] = Point2f(0, 0);
outputQuad [1] = Point2f(src.cols – 1, 0);
outputQuad [2] = Point2f(src.cols – 1, src.rows – 1);
outputQuad [3] = Point2f(0, src.rows – 1);
lambda = getPerspectiveTransform (inputQuad , outputQuad );
warpPerspective (src, src, lambda, src.size());
}
int verificareAlbNegru (Mat src)
{
int x, y, alb = 0;
uchar color ;
for (x = 0; x < src.rows; x++)
{
for (y = 0; y < src.cols; y++)
{
color = src.at<uchar>(Point(x, y));
if (src.at<uchar>(x, y) == uchar(255)) //compararea
fiecarui pixel pentru a vedea daca este alb
alb++;
}
}
return alb;
}
Sebastian Ungureanu
40
char selectareComanda (string semn )
{
if (semn == "stop.jpg" )
return 'r';
else if (semn == "curba_stanga.jpg" )
return 'g';
else if (semn == "viteza.jpg" )
return 'v';
else if (semn == "cedeaza_trecerea.jpg" )
return 'b';
else if (semn == "necunoscut" )
return 'n';
}
int main()
{
char semne[red];
int idx=0;
int i,max,count,alb,max2=0;
char cmd='l';
int r,g,b,v,n,marime_zoom ;
string semn ,fileName ;
int aria_maxima ,index_contur_maxim ,contur_maxim ;
string inputDirectory = "/home/pi/imagini/referinta" ; //calea catre
folderul in care se gasesc semnele de referinta
Mat img0 ,img1,dst,mask,src,crop;
Size s(100, 100); //dimensiunea folosita la redimensionarea obiectului
inainte de a fi comparat cu semnele de referinta
Rect bounding_rect ;
DIR *directory ;
struct dirent *_dirent=NULL;
Mat element = getStructuringElement (cv::MORPH_CROSS ,
cv::Size(2 * erosion_size + 1, 2 * erosion_size + 1),
cv::Point(erosion_size , erosion_size ));
Mat element2 = getStructuringElement (cv::MORPH_CROSS ,
cv::Size(2 * dilate_size + 1, 2 * dilate_size + 1),
cv::Point(dilate_size , dilate_size ));
vector< vector<Point> > contururi ;
send('s');
while(1)
{
directory = opendir(inputDirectory .c_str());
e: //eticheta pentru metoda goto
index_contur_maxim = 0;
captura(img0);
marime_zoom = img0.cols/ 10;
zoom(img0,marime_zoom );
cvtColor (img0, img0, CV_RGB2GRAY ); //transformarea imaginii din
format RGB in format Gray
img1=img0.clone();
Anexe
41
//aplicarea filtrului Gaussian
for ( i = 1; i < ker; i = i + 2)
{
GaussianBlur (img1, img1, Size(i, i), 0, 0);
}
//aplicarea detectorului Canny
Canny(img1, img1, 100, 200);
//gasirea contururilor
findContours (img1, contururi , CV_RETR_EXTERNAL , CV_CHAIN_APPROX_NONE );
mask = Mat::zeros(img1.rows, img1.cols, CV_8UC1);
//desenarea contururilor
drawContours (mask, contururi , -1, Scalar(255), CV_FILLED );
//crearea unei noi imagini folosita pentru decupare
crop.create(img0.rows, img0.cols, CV_8UC1);
//setarea fundalului alb a noii imagini
crop.setTo(Scalar(255, 255, 255));
//aplicarea eroziunii si a dilatarii asupra mastii
erode(mask, mask, element, Point(-1, -1), 2);
dilate(mask, mask, element2 , Point(-1, -1),2);
//copierea in noua imagine crop doar obiectele de interes
detectate din imaginea originala
img0.copyTo(crop, mask);
aria_maxima = 0;
//gasirea conturului maxim
findContours (mask, contururi , CV_RETR_EXTERNAL , CV_CHAIN_APPROX_NONE );
for (i = 0; i < contururi .size(); i++) //parcurg fiecare contur
{
double a = contourArea (contururi [i], false);
if (a > aria_maxima ) {
aria_maxima = a;
contur_maxim = i; //memorarea indexului conturului maxim
bounding_rect = boundingRect (contururi [i]); // decuparea intr –
un dreptunghi a celui mai mare contur
}
}
crop(Rect(bounding_rect )).copyTo(crop);
//verificarea pozei sa nu fie goala
if(crop.cols==0 || crop.rows==0)
{
idx=0;
send('n');
goto e;
}
Sebastian Ungureanu
42
resize(crop, crop, s);
src = crop.clone();
threshold (src, src, 80, 255, CV_THRESH_BINARY );
//verificarea imaginii pentru a vedea daca nu predomina pixelii albi
sau negri, in proportie de peste 80%
alb=verificareAlbNegru (src);
if(alb>8000 || alb<2000) //daca rezultatul este true,se declara semn necunoscut
{
send('n');
idx=0;
goto e;
}
max = 0;
while ((_dirent = readdir(directory )) != NULL)
{
fileName = inputDirectory + "/" + string(_dirent->d_name);//
imaginea ce urmeaza a fi citita
dst = imread(fileName .c_str());// citirea imaginei de referinta
if (dst.data == NULL)
{
continue ;
}
cvtColor (dst, dst, CV_RGB2GRAY );
threshold (dst, dst, 127, 255, CV_THRESH_BINARY );
count=comparare (src,dst);//compararea obiectului detectat cu
semnele de referinta
if (max < count)
{
max = count;
semn = _dirent->d_name;
}
}
closedir (directory );
if(max>idem)
semn=semn;
else
semn="necunoscut" ;
cmd=selectareComanda (semn); //setarea comenzii in functie de
semnul detectat
semne[idx]=cmd;
Anexe
43
if(red>1)// doar pentru cazul in care sistemul este redundant
{
if(idx==(red-1))
{
r = g = b = v = n = 0;
redundanta (semne,r,g,b,v,n);
maxim(r,g,b,v,n,max2,cmd);
if(max2>red/2)
{
idx=-1;
send(cmd);
}
else
{
idx=0;
send('n');
goto e;
}
}
}
else
{idx=-1;
send(cmd);
}
idx++;
}
return 0;
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: DOMENIUL: CALCULATOARE ȘI TEHNOLOGIA INFORMAȚIEI SPECIALIZAREA: CALCULATOARE LUCRARE DE DIPLOMĂ Coordonator șt iințific Conf.dr.ing Florin… [630196] (ID: 630196)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
