Documente Academic
Documente Profesional
Documente Cultură
PROIECT DE DIZERTAŢIE
Absolvent:
Coordonator ştiinţific: BÃLÃCEANU I. ANDREI
CONF. DR. ING. IOAN ȘTEFAN SACALÃ
BUCUREŞTI
Iunie 2016
CUPRINS
1.INTRODUCERE.....................................................................................................................3
2.STUDIUL ACTUAL AL APLICATIILOR EXISTENTE ÎN DOMENIU..............................7
2.1 NVIDIA DRIVE PX.........................................................................................................7
2.2.VEHICULUL AUTONOM DE LA GOOGLE................................................................8
2.3.SISTEMELE DE ASISTENŢĂ A ŞOFERULUI MOBILEYE.......................................9
2.4.SISTEMELE DE ASISTENŢĂ A ŞOFERULUI PLK TECHNOLOGIES...................11
2.5.SISTEME DE ASISTENŢĂ A ŞOFERULUI OFERITE DE LUXOFT.......................12
2.6.SOLUŢII OFERITE DE COMPANIA ITSEEZ.............................................................13
2.7.CERCETĂRI REALIZATE DE MERL (MITSUBISHI ELECTRICRESEARCH
LABORATORY)..................................................................................................................14
3.DESCRIEREA SOLUŢIEI PROPUSE..................................................................................15
3.1.ELEMENTE GENERALE.............................................................................................15
3.2.MOTORUL GRAFIC UNITY.......................................................................................17
3.3. LIBRĂRIA OPENCV...................................................................................................18
3.4.LIBRĂRIA EMGUCV...................................................................................................19
3.5.STRUCTURA APLICAŢIEI..........................................................................................20
3.6.TRANSFORMAREA ÎN IMAGINI CU TONURI DE GRI..........................................23
3.7.EXTRAGEREA CONTURURILOR FOLOSIND ALGORITMUL CANNY..............24
3.8.FILTRUL DE TIP NETEZIRE GAUSSIANĀ...............................................................26
3.9.FILTRUL DE TIP THRESHOLDING...........................................................................28
3.10.RECUNOAŞTEREA DRUMULUI.............................................................................29
3.11.RECUNOAŞTEREA SEMNULUI DE DE CIRCULAŢIE STOP..............................33
3.12.RECUNOAŞTEREA ALTOR VEHICULE.................................................................35
3.13.RECUNOAŞTEREA PIETONILOR...........................................................................37
3.14.RECUNOAŞTEREA SEMAFORULUI......................................................................41
3.15.CONTROLUL MAŞINII.............................................................................................43
3.16.REZULTATELE SIMULĂRII.....................................................................................45
4.CONCLUZII..........................................................................................................................47
5.ANEXE..................................................................................................................................49
5.1.ANEXA 1 CLASA CAPTURARE TEXTURA.............................................................49
5.2.ANEXA 2 CLASA DETECTOR...................................................................................50
5.3.ANEXA 3 CLASA MASINA.........................................................................................51
5.4.ANEXA 4 CLASA DETECTIE PIETONI.....................................................................51
5.5.ANEXA 5 CLASA DETECTIE BENZI........................................................................52
5.6.ANEXA 6 CLASA DETECTIE SEMN STOP..............................................................53
5.7.ANEXA 7 CLASA DETECTIE SEMAFOR.................................................................55
5.8.ANEXA 8 CLASA DETECTIE MASINI......................................................................56
6.BIBLIOGRAFIE....................................................................................................................58
2
1.INTRODUCERE
La început s-a încercat imitarea ochiului uman dar structura acestuia este
foarte complexă și medicina curentă nu are o înțelegere completă a
mecanismelor vederii . De asemenea , adaptarea modelului organic al ochiului
unei structuri inorganice prezintă probleme . Din aceste motive , s-au căutat alte
abordări în alte domenii , cele mai bune rezultate realizându-se folosind principii
geometrice . Odata cu scăderea costului camerelor video , creșterea calităţii
imaginilor acestora precum și creșterea puterii de procesare a calculatoarelor ,
domeniul vederii artificiale s-a maturizat .
În ziua de astăzi , oricine are acces la camere care pot captura imagini de
calitate foarte bună în orice condiții , un exemplu fiind camerele de pe
smartphone-uri care folosesc algoritmi pentru procesarea imaginilor pentru a
compensa absenţa obiectivelor . Multe din problemele recunoașterii obiectelor
din imagini rămân nerezolvate și în ziua de astăzi .
3
Domeniile de aplicabilitate variază în funcţie de obiectivele care aceste
sisteme le pot îndeplini .
Unul dintre domeniile recente în care se aplică aceste metode este în cazul
vehiculelor autonome . În categoria vehiculelor autonome intră vehiculele
acvatice (USV – Unmanned Surface Vehicle) , vehicule terestre (UGV –
Unmanned Ground Vehicle) , vehicule aeriene (UAV – Unmanned Aerial
Vehicle ) . Complexitatea sistemelor vizuale de pe aceste vehicule depinde de
autonomia care se dorește . Aceastea variază de la sisteme complexe de
recunoaștere a elementelor esențiale din mediu , precum persoane , drum , sol ,
zone de aterizare , clădiri , asistate de alte sisteme precum detectori pentru
distanţă , sonare , GPS și sisteme de luare a deciziilor , în cazul vehiculelor
complet autonome , fără pilot , pană la vehicule în care sistemele bazate pe
vedere doar furnizează unui pilot informaţii în diferite situații .
4
2) Pre-procesare . Înainte de a aplica o metodă de vedere artificialā pentru
a extrage informații , este de obicei necesară procesarea datelor pentru a asigura
că acestea îndeplinesc anumite condiții . Acest pas , de regulă , presupune
trecere imaginilor prin o multitudine de filtre . Exemple sunt : reducerea
zgomotului pentru reducerea informațiilor false , îmbunătățirea contrastului etc.;
5
- Petele , care oferă o descriere mai complexă a structurilor de imagine în
ceea ce privește regiunile . Descriptorii de tip pete pot conține adesea un punct
preferat (un maxim local sau un centru de greutate) .
- Creste , care sunt primele elemente după care ne uitam în cazul
obiectelor alungite . Din punct de vedere practic, o creastă poate fi gândită ca o
curbă unidimensională .
Atenția omului este limitată , acesta nu se poate concentra intens mai mult
de 9 secunde pe un anumit element . De asemenea , atenţia nu este distributivă
acesta neputând să se concentreze pe mai mult de 4 lucruri în același timp . În
ziua de astăzi există mulți factori care pot acapara atenția șoferului în timp ce
acesta conduce , de la pasageri pană la dispozitive electronice personale .
Reacția omului este de asemenea limitată . Media timpului de reacție a unui adult
este de 276 de milisecunde . [13]
6
acesta nu a consumat substanțe alterante sau se află într-o stare alterată . O
porțiune mare de accidente însă sunt cauzate exact din cauza faptului că omul se
află într-o astfel de stare , printre cele mai comune , intoxicația cu alcool și
starea de somnolență . În 2014 , 32% din accidentele din Statele Unite ale
Americii au fost cauzate de persoane care se aflau într-o stare de intoxicație cu
alcool . Aceste peirderi de viața ar putea fi evitate dacă mașinile ar fi echipate cu
sisteme care să poată detecta și preveni astfel de incidente , prin intervenția
directă asupra mașinii sau alertarea șoferului . [13]
7
2.1 NVIDIA DRIVE PX
O firmă care realizează cercetări în domeniu este nVIDIA prin platforma
DRIVE PX . Aceasta combină metode din domeniul deep learning şi fuziune a
senzorilor cu algoritmi din domeniul viziunii pe calculator. Această platformă este
capabilă să combine date de la 12 camere împreună cu lidar , radar şi senzori
ultrasonici ceea ce permite o imagine de 360 de grade în jurul vehiculului care
permite detectarea tuturor elementelor atât statice cât şi dinamice din jurul
vehiculului .[17]
8
2.2.VEHICULUL AUTONOM DE LA GOOGLE
9
2.3.SISTEMELE DE ASISTENŢĂ A ŞOFERULUI MOBILEYE
10
SeeQ2 dezvoltată de MobilEye pentru calcularea în timp real a transformatelor de
imagine necesare procesării video . De asemenea , sistemul vine cu un buzzer
pentru alertare audio precum şi un dispozitiv Eye Watch Display pe care sunt
afişate informaţii vizuale de avertizare .[19]
Acest tip de sistem pentru evitarea cicliştilor este instalat deja pe camioane
şi autobuze în districul Ealing al Londrei cu planuri de viitor pentru instalarea
acesor sisteme pe mijloace de transport în comun şi în alte districte .[19]
11
Fig.6.OPTIAN [Sursa:www.hktdc.com/manufacturers-suppliers/PLK-Technologies-Co-Ltd/]
12
vizuală prin marcarea în timp real a obiectelor pe ecrane sau , în viitor , direct pe
parbrizul interactiv al vehiculului . Soluțiile software propuse de Luxoft
funcţionează pe diferite platforme bazate pe QNX , Linux , Android sau Windows .
[21]
13
Fig.8.Soluţii de detecţie a pietonilor şi a semnelor de circulaţie oferite de itseez
[Sursa:http://itseez.com/products/]
14
De exemplu , cercetătorii au creat algoritmi pentru extragerea zonelor de
interes din imagini şi clasificarea acestor regiuni sau obiecte în funcţie de un
element comun . Acest lucru premite de asemenea urmarirea obiectelor specifice
în imagini precum şi estimarea unei traiectorii a acestuia . Multe din proiecte se
concentrează pe analiza unor obiecte tridimensionle bazându-se pe imagini
bidimensionale cum ar fi estimarea pozitiei obiectelor şi recunoaşterea acestora .
[23]
Unul din proiectele realizate de aceștia a fost realizarea unei corelări a
poziției vehicului cu reprezentarea acesteia într-un model tridimensional al unui
oraș . Pentru a accelera realizarea calculelor cercetătorii s-au axat şi pe
imbunatatirea procesului de extratie a iamginilor acestea putand fi trecute prin
filtre direct în dispozitivele de achizitionare a imaginii înainte de a fi trecute prin
algoritmii de procesare vizuală . Aceste cercetări au aplicații în mai multe
domenii de la roboti industriali pană la aplicatii medicale . Cercetări în acest
domeniu au fost însă initiate pentru realizarea unui vehicul autonom sau pentru a
oferi sisteme de asistenţă a şoferului în viitoarele modele de autoturisme
realizate de Mitsubishi.[23]
3.1.ELEMENTE GENERALE
15
Elemente centrale care ar trebui luate în considerare includ:
- unde se află drumul sau marcaje de drum;
- detecţia altor vehicule care se află pe drum;
- unde se află pietonii;
- detecţia semnelor de circulaţie cele mai importante;
- detecţia semaforului.
16
3.2.MOTORUL GRAFIC UNITY
17
Motorul grafic Unity este alcatuit din două părţi principale : editorul 3D şi
editorul de cod . În editorul 3D se construieşte lumea tridimensională în care se
va desfăşura simularea precum şi setarea proprietăţilor acesteia precum
materiale , aspectul obiectelor care populează mediul şi ataşarea componenetelor
care dau funcţionalitatea . Modelele tridimensionale au fost realizate cu ajutorul
programului Blender , un pachet software care permite crearea de modele
tridimensionale şi animaţii .
Motorul grafic Unity este bazat pe obiecte , fiecare element din lumea
tridimensională fiind reprezentat de un obiect . Fiecare obiect are o serie de
parametri care pot fi observaţi în partea dreaptă a ecranului . Printre proprietăţi
se întâlnesc transformatele obiectelor tridimensionale , cum ar fi poziţie , locaţie
şi dimensiune , modelul folosit pentru calculul coliziunii şi materialul aplicat
modelului . Tot în această secţiune se ataşează şi script-urile care reprezintă
codul ce dă funcţionalitate simulării .
18
Librăria poate fi utilizată în urmatoarele limbaje de programare : C++ , C ,
Python , Java și poate fi integrată cu MATLAB . LIBRăRIA ruleaza pe Windows ,
Linux , Android , MacOS . Se poate folosi de de instrucțiuni de tip MMX și SSE
dacă procesorul pe care rulează suportă aceste facilităţi , precum și interfețe
pentru CUDA de la nVidia sau OpenCL de la AMD . Aceste facilităţi nu sunt
folosite în lucrarea curentă . Deoarece motorul grafic Unity permite programarea
doar în C# iar librăria OpenCV nu suportă acest limbaj de programare trebuie să
apelăm la o interfață între limbajul C# și OpenCV . Din acest motiv am folosit
adițional și librăria EmguCV . [5]
3.4.LIBRĂRIA EMGUCV
19
Double , UINT16 , INT16 , INT32 .
O altă metodă de încărcare a imaginilor și cea mai des folosită în această
lucrare este:
1. Image<Bgr,Byte> img=new Image<Bgr,Byte>(„exemplu.jpg”) ;
3.5.STRUCTURA APLICAŢIEI
1. using UnityEngine;
UnityEngine conţine toate funcţiile care ţin de motorul grafic Unity cum ar
fi structuri de date care reprezintă obiectele din spațiul tridimensional și funcții
care permit modificarea stării acestora .
20
1. using System.Collections;
1. using Emgu.CV;
2. using Emgu.CV.Util;
3. using Emgu.CV.UI;
4. using Emgu.CV.CvEnum;
5. using Emgu.CV.Structure;
1. using System.Runtime.InteropServices;
2. using System;
3. using System.Drawing;
1. using System.IO;
21
creat , de obicei la pornirea simulatorului . Pentru camera la care va fi ataşat
scriptul este necesar specificarea structurii de tip RenderTexture de care să se
folosească ceea ce se face prin proprietatea RenderTexture.active .Această
structură este optimizată pentru a stoca imaginile preluate în timp real de către o
cameră . Apoi trebuie creată o nouă structură de tip Texture2D de dimensiunile
rendtex pentru a putea stoca pixelii din aceasta .
22
5. }catch(Exception Ex) {
6. Debug.Log (Ex.ToString ());
7. return null;}}
Funcţia de încărcare a imaginii returnează imaginea citită de pe memoria
locală şi accepta ca intrare numele locaţiei în format string . Încarcarea imaginii
este înconjurată de un bloc try catch care depistează dacă există imaginea în
memoria calculatorului .
23
În reprezentarea digitală a imaginilor , pixelii sunt stocaţi în format binar,
cuantificaţi . Imaginile în tonuri de gri destinate pentru afișare vizuală sunt
stocate cu 8 biți per pixel , ceea ce permite 256 intensități diferite .
Reprezentările binare presupun că 0 este negru și valoarea maximă 255 la 8 BPP
(bit per pixel)este de culoare albă . Precizia oferită de acest format este abia
suficientă pentru a evita artefactele , dar foarte convenabilă pentru programare,
deoarece un singur pixel ocupă apoi un singur octet.[1]
Y=0.21R+0.71G+0.07B
24
tehnică care găsește o funcție care optimizează un anumit funcțional . Printre
metodele de detectare a marginilor dezvoltate până în prezent, algoritmul de
detectare a marginilor Canny este una dintre cele mai strict definite metode care
oferă o detecție cu o acurateţe bună . Datorită optimalităţii de a întruni cele trei
criterii de detectare margine și simplităţii procesului de punere în aplicare , este
unul dintre cei mai populari algoritmi pentru detectarea de margine , motiv
pentru care a fost ales și pentru această lucrare . Pe lângă acestea librăria
OpenCV conține o implementare optimizată pentru viteză de procesare cât mai
mare .
√
G= G2x +G2y
Θ=atan 2(G x , G y )
25
După aplicarea suprimarii non-maxim, pixelii de margine sunt destul de
aproape de marginea reală. Cu toate acestea, există încă unii pixeli margine în
acest moment cauzaţi de zgomot și variație de culoare. Pentru a scăpa de
răspunsurile false , este esențial filtrarea pixelului margine cu valoarea
gradientului slabă . Astfel două valori prag sunt setate la clarificarea diferitelor
tipuri de pixeli de margine, unul este numit valoare prag ridicată , iar celălalt se
numește valoarea prag scăzut . Dacă valoarea gradientului pixelului marginea
este mai mare decât valoarea de prag ridicată , aceştia sunt marcaţi că pixeli
puternici de margine. Dacă valoarea gradientului pixelului margine este mai mică
decât valoarea de prag mare și mai mare decât valoarea de prag scăzut, ele sunt
marcate că pixeli margine slabi. Dacă valoarea pixelilor este mai mică decât
valoarea de prag scăzut, aceştia vor fi suprimaţi . Cele două valori de prag sunt
valori determinate empiric, care vor trebui să fie definite atunci când se aplică la
imagini diferite . Aceste limite sunt date funcției prin variabilele canny_thresh și
canny_threshL . [1]
26
2
x
−
1 2
G(x)= e 2σ
√2π σ
În spațiul bidimensional este produsul a două astfel de funcții gaussiene una
pentru fiecare dimensiune:
2 2
x +y
−
1 2σ
2
G(x)= e
√2π σ
unde x este distanța de la origine în axa orizontală, y este distanța de la origine
în axa verticală, și σ este abaterea standard a distribuției Gauss. Atunci când
este aplicat în două dimensiuni, această formulă produce o suprafață a cărei
contururi sunt cercuri concentrice cu o distribuție Gaussiană din punctul central.
Valorile acestei distribuții sunt utilizate pentru a construi o matrice de convoluție
care se aplică imaginii originale. Valoarea noua a fiecarui pixel este setat la o
medie ponderată a pixelilor vecini . Valoarea pixelului original primește cea mai
mare pondere și pixelii vecini primesc ponderi mai mici în funcție creşterea
distanței de la pixelii originali . [1]
27
Cele mai simple metode de thresholding înlocuiesc fiecare pixel dintr-o
imagine cu un pixel negru în cazul în care intensitatea de imagine I{i, j} este mai
mică decât o constantă fixă T ( I{i, j} <T ) , sau un pixel alb dacă intensitatea
imaginii este mai mare decât constanta T . Constanta este dată de variabila
limita.
Metoda de treshholding folosită în această lucrare este cea mai simplă din
metodele exprimate mai sus . Algoritmul analizează în imagine fiecare pixel și îl
compară cu o valoarea predidefinită . Dacă este mai mică pixelul ste înlocuit cu
negru , dacă este mai mare acesta este înlocuit cu valoarea maximă data de
variabila limita_max , în cazul acesta 255 adică alb complet.
3.10.RECUNOAŞTEREA DRUMULUI
28
scenă într-un mediu urban iar iluminarea poate fi modificată uşor . De
asemenea , mă voi concentra pe detecţia limitelor drumului şi a marcajului
central din centrul drumului .
Scopul metodei este de a găsi instanţe imperfecte ale unor obiecte într-o
anumita clasa de elemente printr-o procedură bazată pe vot . procedură de
votare se face pe o instanţă de obiecte deja extrase din imagine din care se aleg
candidaţii şi un spaţiu acumulator creat de algoritm pentru calcularea
transformatei Hough .
Iniţial metoda a fost creată pentru a detecta decât liniile dintr-o imagine ,
dar revizii multiple asupra formulelor inţiale au extins această metodă şi altor
forme geometrice precum cercuri şi elipse . În această lucrare , voi folosi
transformata Hough doar pentru detecţia liniilor . Transformata Hough folosită
astăzi în recunoaşterea imaginilor a fost inventată de către Richard Duda şi Peter
Hart în 1972 care au denumit-o atunci versiunea generalizată a transformatei lui
Hough după ideile iniţiale publicate de către Paul Hough în 1962 . [1]
În cele mai multe cazuri , imaginea iniţială este trecută printr-un algortim
Canny inainte pentru a obţinem contururile care sunt stocate separat că o
mulţime de coordonate de puncte sau pixeli din imagine . Implementarea
transformatei Hough în OpenCV accepta la intrare doar multimi de puncte care
constituie contururi extrase deja , deci aplicarea filtrului Canny înainte este un
pas obligatoriu . Datorită imperfecţiilor din imaginea originală sau a imperfecţiilor
contururilor detectate de algoritm pot aparea întreruperi în contururi sau puncte
lipsă din curbele care le alcatuiesc pe acestea în funcţie de zgomotele din
imagine la care a fost supus algortimul . [1]
29
Scopul transformatei Hough este de a adresa aceată problemă prin
facilitarea grupării acestor puncte în categoria adecvată . Aceasta analizează
mulţimea de puncte extrase în fazele de detecţia conturului printr-o procedură de
votare . Cel mai simplu caz este detecţia liniilor . O linie dreaptă are ecuaţia
y=mx+b care poate fi reprezentată că un punct (b,m) . Liniile verticale pot
deveni problematice deoarece dau valori parametrului m care pot ieşi din limitele
alocate . Astfel Duda şi Hart au propus folosirea formei normale a lui Hesse din
motive de resurse computaţionale . În acest caz , r reprezintă distanţa de la
origine către cel mai apropiat punct al liniei drepte şi θ unghiul dintre axa x şi
linia care conectează originea cu cel mai apropiat punct .[1]
Din acest motiv , este posibilă asocierea fiecarei linii dintr-o imagine a unei
grupări (r,θ) . Planul în care sunt valabile acest tip de coordonate poartă
denumirea de spaţiu Hough . Dat fiind un singur punct în acest plan atunci toate
liniile drepte care trec prin acel punct corespund unei sinusoide în planul (r,θ)
care este unică acestui punct . Un set de două sau mai multe puncte care produc
o linie dreaptă creează sinusoide care se intalnesc în planul (r,θ) pentru acea
linie. În acest fel problema detectării punctelor coliniare poate fi convertită în
problema găsirii unor curbe concurente .[1]
30
află pe linia corespunzatoare . Deci elementul cu cea mai mare valoare indică
linia dreaptă .
1. void Update()
2. {
3. imagine = IncarcaImagine ("/Resources/img_orig.jpg");
4. imagine = Proceseaza (imagine);
5. SalveazaImagine (imagine,"/Resources/drum.jpg");
6. }
31
această poate fi eliminată . De asemenea , am ales culori diferite pentru a
delimita liniile din dreaptă sau stânga scenei . Algoritmul ia fiecare linie şi verifică
dacă punctele acesteia sunt incluse într-un dreptunghi care conţine decat pixelii
din dreapta imaginii . Dacă punctele sunt în dreapta atunci linia va fi desemnată
cu o altă culoare , în acest caz verde .
Fig.11.Stagiile de procesare pentru marcarea drumului : imagine originală (dreapta) , aplicare filtru
Canny(sus), algoritmul Hough(jos)
32
de bază Detector . Încarcarea şi procesarea imaginilor se vor face tot în funcţia
Update după randarea completă a imaginii .
1. void Update()
2. {imagine = IncarcaImagine ("/Resources/img_orig.jpg");
3. imagine = Proceseaza (imagine);
4. SalveazaImagine (imagine,"/Resources/semn_stop.jpg");}
Apoi voi defini două limite în care se încadrează naunta roşie cautată . Pe
spectrul nuanțelor culoarea roşie se află în jurul valorii 20 şi peste valoarea 160 .
Apoi voi trece prin toți pixelii matricii care conţine valorile nauntei şi voi extrage
decat pe cei care corespund valorilor stabilite .
33
Zonelor de culoare apoi li se va aplica un filtru thresholding pentru a
obţine o delimitare mai bună a acestora precum şi pentru a obţine date mai bune
la aplicarea filtrului Canny care va scoate toate contururile din imaginea
prelucrată .
Fig.12. Stagiile de procesare a imaginii : imaginea originală , extracţia culorii, filtrul Canny si marcarea pe
imaginea inţială
34
O prima ipoteza de la care pornim este că vehiculele se vor afla mereu pe
drum . Drumul este mereu aflat în partea de jos a imaginii şi ne interesează
decat vehiculele de pe drum care sunt la o distanta medie faţa de vehiculul care
conţine camera . Astfel că am definit o zonă care să conțină decat pixelii de la
jumatatea imaginii în jos . Acest lucru simplifică detecţia vehiculelor precum şi
elimină eventuale zone eronate detectate deasupra drumului .
Mai intai trebuie să convertim imaginea din spaţiul BGR în spațiul HSV ,
după care se extrag primele două canale care dau nuanţa şi saturația imaginii .
Urmatorul pas este reprezentat de alegerea limitelor de culoare după care să se
uite funcțiile . Deoarece gama de culori în care sunt disponibile vehiculele din
ziua de astazi este foarte mare şi nu putem lua toate aceste variatii separat , mă
voi concentra pe 3 culori de bază : roşu , albastru , verde . Acest lucru
presupune trecerea de 3 ori prin filtrul de culoare .
Din contururile care sunt obtinute sunt selectate doar cele neîntrerupte .
După extragerea conturilor programul încearcă aproximarea acestor contururi cu
dreptunghiuri şi calculează aria acestora .
35
1.if(CvInvoke.ContourArea (conturAproximat, false) > arie) {
2.listaDreptunghi.Add (CvInvoke.MinAreaRect
(conturAproximat));}
Fig.13. Stagiile de detectare a maşinilor : imagine originală (stanga sus) , extracţia culorii (dreapta
sus) , aplicarea filtrului Canny (dreapta jos) , marcarea vehiculelor (dreapta jos) (detecţiile pentru cele 3 culori
au fost combinate intr-o singura imagine)
3.13.RECUNOAŞTEREA PIETONILOR
36
O altă abordare o reprezintă cautarea oamenilor după pigmentaţia pielii . Această
abordare depinde foarte mult de distanţa persoanelor faţă de cameră deoarece la
distanţe mari şi rezoluţii mici zona feţei sau a mainilor , de unde poate fi extrasă
pigmentaţia pielii , nu este suficient de mare pentru a permite o detecţie
adecvată .
37
atunci s-au dezvoltat îmbunătăţiri ale metodei pentru detecţia oamenilor şi în
imagini video precum şi o gama largă de animale şi vehicule . [1]
Primul pas este asigurarea unor valori ale culorii normalizate . Algoritmul HOG se
ocupă de acest fapt , deci nu este nevoie de alte etape de preprocesare.
Urmeaza calcularea valorilor gradientului . Urmatorul pas este reprezentat de
crearea histogramei celulelor . Fiecare pixel are o valoare corespunzatoare bazat
pe valori găsite în crearea gradientului . Celule pot fi rectagulare sau circulare ca
forma iar canalele hitogramei sunt răspândite între valori 0-180 sau 0-360 .
Pentru a compensa pentru diferente de iluminare şi contrast , gradientul trebuie
normalizat ceea ce necesită gruparea celuleror în blocuri interconectate .
Rezultatul final este concatenarea vectorilor de componente normalizate ale
38
histogramei celulelor . Aceste blocuri de obicei se suprapun ceea ce duce la faptul
că fiecare celulă contribuie de mai multe ori la rezultatul final . De regulă , există
două tipuri de blocuri : blocri rectangulare ( bloc R-HOG ) şi blocuri circulare
(bloc C-HOG). [1]
Blocuri R-HOG sunt în general patrate reprezentate de 3 parametri :
numarul de celule per bloc , numarul de pixeli per celulă , şi numarul de canale
per celulă a histogramei . În testele realizate de Dalal şi Triggs pentru detecţia
oamenilor paramtrii optimali erau patru celule de 8x8 pixeli per bloc şi 9 canale .
[1]
1. MCvObjectDetection[] regiuni;
2. HOGDescriptor DescriptorHOG = new HOGDescriptor ()
3. DescriptorHOG.SetSVMDetector(HOGDescriptor.GetDefaultPeopleDetector
());
39
1.regiuni=DescriptorHOG.DetectMultiScale(img,0,default(Size),
default(Size),1.05,2,false);
3.14.RECUNOAŞTEREA SEMAFORULUI
40
Similar programului pentru detecţia semnului stop am pornit de la premiza
că semaforul care ne interesează se va află mereu în partea dreaptă a imaginii
deci putem să ignoram jumatea stangă . Acest lucru se face prin definirea unui
dreptunchi care conţine decat pixelii din dreaptă imaginii . Conversia în spaţiul de
culori HSV se face folosind functia CvtColor .
41
Fig.16. Stagiile de procesare pentru recunoaşterea semaforului
3.15.CONTROLUL MAŞINII
42
repeta verificarea variabilei ruleaza pentru a determină dacă maşina trebuie să
se deplaseze sau să stea pe loc . Pentru a se deplasa coordonatele vor fi
înmulţite cu o variabilă care conţine viteza . Direcţia va fi selectată în funcţie de o
denumire . Variabila manual este pentru a putea da comanda de ignorare funcţiei
de frânare automată iar limita reprezintă aria minimă a obiectului detectat peste
care va frâna automat .
1. void Start () {
2. myTransform = this.transform;
3. ruleaza = false; }
1. void Update () {
2. if (Input.GetKeyUp ("w")) {
3. ruleaza = !ruleaza;
4. direcţie = "faţa"; }
5. if (Input.GetKeyUp ("s")) {
6. ruleaza = !ruleaza;
7. direcţie = "Spate";
8. if (Input.GetKeyUp ("m")) {
9. manual = !manual;}
Blocurile " if " verifică dacă utilizatorul a apăsat unul din butoanele
corespunzatoare şi modifică variabilele în funcţie de comandă , în cazul de faţă
modificând direcţia şi oprind maşină .
43
1. public void setViteza(float arie)
2. {
3. if (manual != true) {
4. if (arie > limita) {
5. viteza = 0.0f;
6. } }
7. }
3.16.REZULTATELE SIMULĂRII
44
Fig.17. Detecţia elementelor in condiţii slabe de iluminare şi ceaţă
45
cazul maşinilor care nu mai sunt detectate aproape deloc . Prezenţa ceţei
introduce artefacte în detectarea contururilor , acestea aparând întrerupte şi deci
nu mai sunt luate în considerare .
4.CONCLUZII
46
situaţia aleasă . Deoarece detectarea obiectelor folosind doar imagini capturate
de la camere care înregistrează în lumina naturală este foarte complexă şi este
foarte influenţată de mediul în care se află vehiculul precum şi de factori din
natura cum ar fi conditiile atmosferice şi timpul zilei , m-am concentrat pe un
mediu urban . De asemenea , ma-m concentrat pe detecţia obiectele care le-am
considerat cele mai importante pentru un vehicul aflat pe drum : limitele
drumului , pietonii , semnul de circulaţie stop , semaforul şi alte vehicule aflate
pe drum .
47
STOP marcate mare pe el putem folosi un algoritm de detecţie al literelor sau un
algortim de detecţie şi comparaţie a colţurilor extrase din imagine semnului şi
compararea acestora cu o imagine standard din memoria locală . Deoarece
detecţia după culoare este sensibilă , programul poate detecta şi alte semne de
ciculaţie predominat roşii ca fiind semnul stop .
48
5.ANEXE
49
37. CvInvoke.CvtColor (img, gray,
ColorConversion.Bgr2Gray);
38. return gray; } }
39.
40. public UMat aplicaGaussianBlur(UMat img,int kernel_gauss)
41. { UMat blur = new UMat ();
42. CvInvoke.GaussianBlur (img, blur, new Size
(kernel_gauss, kernel_gauss), 0, 0);
43. return blur; }
44.
45. public Image<Bgr,Byte> aplicaThreshhold(Image<Bgr,Byte>
img,double limita,double limita_max)
46. { UMat thres_img = new UMat ();
47. UMat gray = aplicaGrayscale (img);
48. CvInvoke.Threshold (gray, thres_img, limita,
limita_max, ThresholdType.Binary);
49. return thres_img.ToImage<Bgr,Byte> (); }}
50
79. case "Spate":
80. myTransform.position-=Vector3.forward*speed;
81. break;} }
82.
83. public void setViteza(float arie)
84. { if (manual != true) {
85. if (arie > limita) { viteza = 0.0f;}}
86. }
51
117. public int limita =50;
118. public double minLungimeLinie=50;
119. public double minDistanta=10;
120. public double Canny_thresh=100;
121. public double Canny_threshL=50;
122. private Image<Bgr,Byte> imagine;
123. private LineSegment2D vertline=new LineSegment2D (new
Point (0, 0), new Point (0, 50));
124. void Update()
125. { imagine = IncarcaImagine
("/Resources/img_orig.jpg");
126. imagine = Proceseaza (imagine);
127. SalveazaImagine (imagine,"/Resources/drum.jpg");
128. }
129. public override Image<Bgr,Byte> Proceseaza(Image<Bgr,Byte>
img) { img.ROI = new Rectangle
(0,img.Height/2,img.Width,img.Height);
130. UMat Contururi = aplicaCanny
(img,Canny_thresh,Canny_threshL);
131. SalveazaImagine(Contururi.ToImage<Bgr,Byte>(),"/Resources/drum_
Canny.jpg");
132. LineSegment2D[] linii = CvInvoke.HoughLinesP (
133. Contururi,
134. rho,
135. theta,
136. limita,
137. minLungimeLinie,
138. minDistanta );
139.
140. foreach (LineSegment2D linie în linii) {
141. double angle = linie.GetExteriorAngleDegree (vertline);
142. Debug.Log ("Angle " + angle);
143. if (angle < 80.0 || angle>90.0 ) {
144. if(linie.Length>100){
145. Point p1 = linie.P1;
146. Point p2 = linie.P2;
147. bool dr = CvInvoke.ClipLine (new
Rectangle (img.Width / 2, 0, img.Width / 2, img.Height), ref p1, ref
p2); if (dr == true) {
148. img.Draw (linie, new Bgr
(System.Drawing.Color.Green), 3);} else {
img.Draw (linie, new Bgr (System.Drawing.Color.Red), 3);}}}}
149. return img;}}
52
154. public int Canny_threshL = 50;
155. public double arie = 0.1;
156. public maşină maşină;
157. public bool closed = true;
158. double arieMax = 0;
159. private Image<Bgr,Byte> imagine;
160. void Update ()
161. { imagine = IncarcaImagine
("/Resources/img_orig.jpg");
162. imagine = Proceseaza (imagine);
163. SalveazaImagine (imagine,
"/Resources/semn_stop.jpg");
164. }
165.
166. public override Image<Bgr,Byte> Proceseaza
(Image<Bgr,Byte> img)
167. { img.ROI = new Rectangle (img.Width / 2, 0, img.Width
/ 2, img.Height);
168. UMat Canny = new UMat ();
169. Mat channel1 = new Mat ();
170. Mat channel2 = new Mat ();
171. Mat hsv = new Mat ();
172. CvInvoke.CvtColor (img, hsv,
ColorConversion.Bgr2Hsv);
173. CvInvoke.ExtractChannel (hsv, channel1, 0);
174. CvInvoke.ExtractChannel (hsv, channel2, 1);
175. ScalarArray lower = new ScalarArray (limita_joasa);
176. ScalarArray upper = new ScalarArray (limita_inalta);
177. CvInvoke.InRange (channel1, lower, upper, channel1);
178. CvInvoke.BitwiseNot (channel1, channel1);
179. CvInvoke.Threshold (channel2, channel2, 10, 255,
ThresholdType.Binary);
180. CvInvoke.BitwiseAnd (channel1, channel2, channel1,
null);
181. CvInvoke.GaussianBlur (channel1, channel1, new Size
(5, 5), 2, 0, (BorderType)4);
182. Canny = aplicaCanny (channel1.ToImage<Bgr,Byte> (),
Canny_thresh, Canny_threshL);
183. SalveazaImagine (eroded,
"/Resources/stop_erode.jpg");
184. SalveazaImagine (channel1.ToImage<Bgr,Byte> (),
"/Resources/stop_thresh.jpg");
185. SalveazaImagine (Canny.ToImage<Bgr,Byte> (),
"/Resources/stop_Canny.jpg");
186. List<CircleF> listaCercuri = new List<CircleF> ();
187. VectorOfVectorOfPoint contururi = new
VectorOfVectorOfPoint ();
188. CvInvoke.FindContours (Canny,
189. contururi, null,
190. RetrType.List,
191. ChainApproxMethod.ChainApproxSimple,
53
192. default(Point));
193. int nrContururi = contururi.Size;
194. for (int i = 0; i < nrContururi; i++) {
195. VectorOfPoint contur = contururi [i];
196. VectorOfPoint conturAproximat = new
VectorOfPoint ();
197. CvInvoke.ApproxPolyDP (
198. contur,
199. conturAproximat,
200. 5,
201. closed
202. );
203. if (CvInvoke.ContourArea (conturAproximat,
false) > arie) { listaCercuri.Add
(CvInvoke.MinEnclosingCircle (conturAproximat));
204. } }
205.
206. foreach (CircleF cerc în listaCercuri) {
207. if (cerc.Area > arieMax) {
208. arieMax = cerc.Area;}
209. img.Draw (cerc, new Bgr
(System.Drawing.Color.Green), 2);}
210. maşină.setViteza ((float)arieMax);
211. return img; }}
54
232. CvInvoke.CvtColor(img, hsv,
ColorConversion.Bgr2Hsv);
233. CvInvoke.ExtractChannel(hsv, channel1, 0);
234. CvInvoke.ExtractChannel(hsv, channel2, 1);
235. ScalarArray lower = new
ScalarArray(limita_joasa) ;
236. ScalarArray upper = new
ScalarArray(limita_inalta) ;
237. CvInvoke.InRange(channel1, lower, upper,
channel1);
238. CvInvoke.BitwiseNot(channel1,channel1);
239. CvInvoke.Threshold(channel2,channel2, 10, 255,
ThresholdType.Binary);
240. CvInvoke.BitwiseAnd(channel1, channel2,
channel1, null);
241. CvInvoke.GaussianBlur (channel1, channel1,new
Size(5,5), 2,0,(BorderType)4);
242. Canny = aplicaCanny
(channel1.ToImage<Bgr,Byte> (), Canny_thresh, Canny_threshL);
243.
244. SalveazaImagine (channel1.ToImage<Bgr,Byte>
(), "/Resources/semafor_thresh.jpg");
245. SalveazaImagine (channel1.ToImage<Bgr,Byte>
(), "/Resources/semafor_Canny.jpg");
246. List<CircleF> listaCercuri = new List<CircleF>
();
247. VectorOfVectorOfPoint contururi = new
VectorOfVectorOfPoint ();
248. CvInvoke.FindContours (Canny,
249. contururi,null,
250. RetrType.List,
251. ChainApproxMethod.ChainApproxSimple,
252. default(Point));
253. int nrContururi = contururi.Size;
254. for (int i = 0; i < nrContururi; i++) {
255. VectorOfPoint contur = contururi [i];
256. VectorOfPoint conturAproximat = new
VectorOfPoint ();
257. CvInvoke.ApproxPolyDP (
258. contur,
259. conturAproximat,
260. 5,
261. true );
262. if (CvInvoke.ContourArea (conturAproximat,
false) > arie) { listaCercuri.Add (CvInvoke.MinEnclosingCircle
(conturAproximat));}}
263.
264. foreach (CircleF cerc în listaCercuri) {
265. if (cerc.Area > arieMax) {
266. arieMax = cerc.Area;}
267. img.Draw (cerc, new Bgr
55
(System.Drawing.Color.Green), 2);}
268. maşină.setViteza ((float)arieMax);
269. return img; }
56
306. CvInvoke.InRange (channel2, lower, upper,
channel2);
307. CvInvoke.BitwiseNot (channel2, channel2);
308.
309. CvInvoke.GaussianBlur (channel2, channel2, new
Size (5, 5), 2, 0, (BorderType)4);
310.
311. SalveazaImagine (channel2.ToImage<Bgr,Byte>
(), "/Resources/maşini_thresh.jpg");
312. Canny = aplicaCanny
(channel2.ToImage<Bgr,Byte> (), Canny_thresh, Canny_threshL);
313. SalveazaImagine (Canny.ToImage<Bgr,byte> (),
"/Resources/maşini_Canny.jpg");
314. Debug.Log ("j " + j);
315. VectorOfVectorOfPoint contururi = new
VectorOfVectorOfPoint ();
316.
317. CvInvoke.FindContours (Canny,
318. contururi, null,
319. RetrType.List,
320. ChainApproxMethod.ChainApproxSimple,
321. default(Point));
322. int nrContururi = contururi.Size;
323. for (int i = 0; i < nrContururi; i++) {
324. VectorOfPoint contur = contururi [i];
325. VectorOfPoint conturAproximat = new
VectorOfPoint ();
326. CvInvoke.ApproxPolyDP (
327. contur,
328. conturAproximat,
329. 5,
330. true
331. );
332. if (CvInvoke.ContourArea
(conturAproximat, false) > arie) {
333. listaDreptunghi.Add (CvInvoke.MinAreaRect
(conturAproximat)); }}}
334. foreach (RotatedRect dreptunghi în listaDreptunghi)
{img.Draw (dreptunghi, new Bgr (System.Drawing.Color.Green), 2); }
335. return img; }}
57
6.BIBLIOGRAFIE
58