V14 Proiect De Diploma Draghici Ciprian [305782]
UNIVERSITATEA “LUCIAN BLAGA” DIN SIBIU
FACULTATEA DE INGINERIE
DEPARTAMENTUL DE CALCULATOARE ŞI INGINERIE ELECTRICĂ
PROIECT DE DIPLOMĂ
Conducător ştiinţific : Asist. dr. ing. Cătălina NEGHINĂ
Îndrumător: Asist. dr. ing. Cătălina NEGHINĂ
Absolvent: [anonimizat]-Ciprian DRĂGHICI
Specializarea: [anonimizat], 2016 –
UNIVERSITATEA “LUCIAN BLAGA” DIN SIBIU
FACULTATEA DE INGINERIE
DEPARTAMENTUL DE CALCULATOARE ŞI INGINERIE ELECTRICĂ
Monitorizarea traficului rutier
Conducător ştiinţific: Asist. dr. ing. Cătălina NEGHINĂ
Îndrumător: Asist. dr. ing. Cătălina NEGHINĂ
Absolvent: [anonimizat]-Ciprian DRĂGHICI
Specializarea: Ingineria Sistemelor Multimedia
Cuprins
Monitorizarea traficului rutier 2
Introducere 1
Capitolul 1 4
Spații de culoare în procesarea imaginilor 4
1.1 Spațiul RGB 5
1.2 Conversia unei imagini color într-o imagine grayscale 6
1.3 Spațiul HSV [5i] 7
Capitolul 2 8
[anonimizat] 8
2.1 Metode de segmentare [6i] 8
2.1.1 Thresholding sau determinarea pragurilor de segmentare (Prăguire) [6] 9
2.1.2 Metoda de segmentare Otsu 11
2.2. Extragerea contururilor 16
2.3 Operații morfologice 17
2.3.1 Erodarea 18
2.3.2 Dilatarea 19
2.3.3 Deschiderea imaginilor 20
2.3.4 Închiderea imaginilor 22
Capitolul 3 24
Captarea unei secvențe video 24
3.1 Conectarea la cameră 24
3.2 [anonimizat] 25
3.3 [anonimizat] 26
Capitolul 4 27
[anonimizat]-o secvență video 27
4.1 [anonimizat] 27
4.2 [anonimizat] 29
4.3 Extragerea contururilor dintr-o imagine binarizată 30
4.3 Urmărirea contururilor în vederea cuantificării autovehiculelor și a calcului vitezei de deplasare 32
Capitolul 5 35
Aplicarea conceptelor teoretice în dezvoltarea aplicației de monitorizare a traficului 35
5.1 Scurtă descriere a aplicației 35
5.2 Usecase general al aplicației 36
5.3 [anonimizat] 37
5.3.1 Usercase-ul general 37
5.3.3 [anonimizat] 39
5.3.4 Extragere background 40
5.3.4 Extragere foreground 41
5.3.5 Tracking 45
5.3.6 Stocare date 51
5.4 Pasii algoritmului 53
5.5 Schema bloc a algoritmului 57
5.6 Istorie în dezvoltare aplicației de monitorizare a traficului 58
5.7 Probleme întâmpinate și soluții de rezolvare 59
5.8 Cazuri excepționale 61
Capitolul 6 62
Rezultate și concluzii 62
6.1 Testarea aplicației pe un drum cu sens unic 62
6.2 Testarea aplicației pe drum cu dublu sens 63
6.3 Validarea rezultatelor obținute în urma procesării secvenței video 69
6.4 Concluzii 72
Bibliografie 74
Introducere
Majoritatea persoanelor cu vârsta de peste 18 ani au permis de conducere. [anonimizat], au si un autovehicul cu care se deplasează. Nu de puține ori s-au întâmplat accidente din diverse cauze : neatenție, [anonimizat] a stupefiantelor, etc.
Un studiu al Comisiei Europene arată că în ţara noastră viteza ucide 91 [anonimizat]. [anonimizat] a fost implementat un sistem prin care traficul era monitorizat cu ajutorul camerelor video amplasate in anumite locuri fixe cu scopul de a sancționa șoferii grăbiți sau pe cei care nu respecta legea in general.
S-a introdus un sistem omologat de BRML(Biroul Roman de Metrologie Legala), care folosește așa numitele bucle inductive. Principiul de funcționare al buclelor inductive, conform specificațiilor producătorului cu care colaborează Politia Romana, este următorul: in fata unei camere video sunt implantate in asfalt, pe fiecare banda de mers si la o anumita distanta unul de celalalt, cate doua perechi de conductori electrici ce acționează ca niște senzori. Aceștia sunt poziționați aproximativ la 5-7 metri de camera pe banda unu, la 1-2 metri pe banda doi si la încă 1-2 metri pe banda trei. De fiecare data când prin zona trece un autovehicul, fiecare senzor ii creează o semnătură magnetica unica, iar daca semnătura corespunde la ambii conductori, se măsoară defazarea in timp si astfel se stabilește viteza. Daca aceasta depășește limita legala, un semnal este transmis la camera video, care fotografiază imediat numărul din spate al mașinii in cauza. Sistemul este omologat de Biroul Roman de Metrologie Legala, conform certificatelor de omologare ce au fost puse la dispoziție. [1i]
„Radarele fixe nu mai funcţionează. Poliţia nu mai are bani să le întreţină” [2i]
Această sintagma spune multe despre managementul resurselor financiare alocate siguranței cetățenilor, dar scopul nostru nu este de a arunca vina pe cineva, ci sa încercăm să descoperim problemele cu care ne confruntam cu toții in fiecare zi, probleme pe care cu siguranță le dorim a fi cat mai departe de noi și de apropiații noștri, dar cu siguranță probleme care exista si cu greu le putem face fața fără un ajutor corespunzător venit din partea autorităților, iar la ce mă refer aici este strict legat de siguranța noastră ca cetățeni, atât din perspectiva de pietoni cat și din cea de șoferi.
Cu toții ne dorim sa fim in siguranță, deși mulți dintre noi efectuăm mici ilegalități prin depășirea vitezei legale, depășirea pe linie continua, trecerea pe culoarea galbena a semaforului chiar daca am fi putut frâna din timp, etc.; iar toate aceste lucruri le facem de cele mai multe ori instinctiv. Acesta a fost și unul dintre motivele finanțării proiectelor legate de implementarea unor sisteme fixe de monitorizare a traficului rutier.
Aceste proiecte au fost costisitoare încă de la bun început. Pe lângă sistemul software în sine și suportul hardware, de asemenea, vine cu o importanță deosebita și implantarea unor senzori în asfalt, necesari identificării prezentei autovehiculului și calculul vitezei de deplasare a acestuia. De acord, aceste sisteme de monitorizare a traficului sunt utile din punctul de vedere al nostru ca cetățeni pentru ca șoferii, știind că sunt „văzuți” de cineva, cu siguranță sunt mai disciplinați, dar politia trebuie sa suporte niște costuri in acest sens, iar pentru aceasta au nevoie de susținere financiara. După cum am spus, pe lângă cele 2 componente importante : hardware si software, vine si partea de implementare a acestui sistem in trafic si nevoia de oprire temporara a circulației autovehiculelor pentru a putea implanta acei senzori în asfalt, apoi alte costuri pentru a acoperi găurile rezultate si tot așa pana la finalizarea implementării întregului sistem. Ce rezulta de aici ? Mult timp pierdut, sunt necesare fonduri consistente, iar pe lângă faptul că se oprește circulația temporar, vor apărea alte costuri legate de acoperirea zonelor sparte din asfalt, discuțiile cu administratorul drumului, avize si alte lucruri necesare efectuării acestei implementări. Aceste lucruri duc la întârzieri, după cum spune un reprezentant la Politiei Romane: „Între obiectivele Poliţiei Rutiere se află şi punerea în funcţiune a astfel de sisteme de monitorizare, dar nu se poate anticipa dacă acest lucru va fi posibil până la sfârşitul anului 2016”. Daca sunt greu de pus in funcțiune și costisitoare, întrebarea fireasca este următoarea: De ce le mai folosiți ?, iar răspunsul vine pe măsură: Pentru ca este nevoie de aceste sisteme pentru siguranța cetățenilor.
Pentru aceasta m-am gândit cum aș putea face un sistem de monitorizare simplu, eficient, ieftin și ușor de instalat pe orice tronson de drum ? De aici a venit ideea mea de a implementa un sistem de monitorizare a traficului rutier, pe anumite tronsoane de drum, cu ajutorul unei simple camere fixe, legate la o rețea; camera mult mai puțin costisitoare decât sistemul anterior, iar modul de instalare se realizează simplu, prin calibrarea camerei in zona fixa de monitorizare, după care tot ceea ce trebuie făcut este sa o conectezi la o sursa de tensiune pentru a funcționa si atât. Aplicația dezvoltata de mine este orientata mai mult pe fluidizarea traficului rutier, nicidecum pe sancționarea șoferilor grăbiți sau neatenți. Bineînțeles că aplicația poate fi dezvoltata in diverse zone de interes, dar pentru a putea realiza ceva practic si in timp util am pus la punct bazele unei aplicații simple, necostisitoare și ușor de implementat in orice zona rutiera dorita.
Acum, fiind „era dronelor”, orice organ abilitat poate manevra o dronă care are alipită o cameră și cu care poate monitoriza traficul prin fixarea dronei asupra unui tronson de drum dorit, deci, am pus bazele unui sistem cu ajutorul căruia putem genera informații legate de cate autovehicule trec prin zona noastră de interes, cu ce viteza medie trec se deplasează și în ce intervale orare circulația pe anumite tronsoane de drum necesita intervenția autorităților sau organelor abilitate.
Sistemul propus are o rată de detecție corectă a autovehiculelor de 90% și poate detecta cazuri excepționale precum accidente, blocaje in trafic,etc.
Lucrarea este structurată astfel: în primul capitol sunt prezentate spațiile de culoare utile algoritmului implementat, în Capitolul 2 sunt prezentate la nivel teoretic metodele de segmentare utilizate, în Capitolul 3 detaliem modul în care putem capta o secvența video în vederea procesării acesteia în timp real. Capitolul 4 va detalia etapele de procesare a frame-urilor din secvența video, iar ultimul capitol, Capitolul 5, reprezintă partea practică a lucrării, cuprinzând algoritmii de prelucrare a imaginilor ce au fost proiectaţi utilizând ca tehnologii limbajul C++ împreună cu librăria OpenCV 3.0.
Până la momentul de față au fost dezvoltate câteva softuri similare cu cel propus de mine și anume :
Video-based vehicle tracking for smart traffic analysis, dezvoltat de grupul Augmented Vision la compania DFKI GmbH (Soluții inteligente pentru societatea cunoașterii), care etichetează autovehiculele care intra într-un sens giratoriu, utilizând metode de tracking pe contururi. [19i],[20i]
Traffic counting based OpenCV, dezvoltat de un utilizator al site-ului YouTube.com, excellentSK, care utilizează o bară de-a latul părții carosabile pentru cuantificarea autovehiculelor pe categorii de gabarit. [21i]
Vehicle Detection, Tracking and Counting, unde Andrews Sobral, Ph.D. Candidate at ULR on Computer Vision and Machine Learning. Université de La Rochelle (ULR), aduce mai multe exemple de detecție a autovehiculelor, tracking și numărare a acestora. [22i]
Niciunul dintre softurile enumerate nu aduce noutăți precum calculul vitezei de deplasare și cuantificarea autovehiculelor utilizând camera o fixă, orientată perpendicular pe suprafața carosabilă și stocarea informațiilor în vederea procesării ulterioare a acestora cu scopul fluidizării traficului rutier, în principal. De aici vine autenticitatea aplicației de monitorizare a traficului rutier. De altfel, metodele utilizate de acești dezvoltatori nu pot fi găsite în anumite articole, de aceea singurele detalii(foarte puține) sunt cele din videoclipurile din referințe.
Capitolul 1
Spații de culoare în procesarea imaginilor
Ce este culoarea ?
Culoarea reprezintă calitatea percepției determinată de compoziția spectrală a luminii (radiației electromagnetice) primite de ochi.
Lumina vizibila e compusă dintr-o banda relativ îngustă a spectrului electromagnetic.
Spectrul vizibil este în domeniul lungimilor de undă: 360nm-830nm.
Formatul ochiului uman:
/
Fig. 1 – Structura ochiului uman [23i]
Imaginea se formează în ochiul uman pe baza luminii focalizate pe retină de lentila oculară. Senzația de culoare este dată de conuri.
Conurile sunt senzori din retina responsabili pentru senzația de culoare; conțin pigmenți fotosensibili cu absorbții spectrale diferite.
Exista trei tipuri de conuri, sensibile la lungimi de unda mici, medii și lungi :
– aproximativ 65% din conuri sunt sensibile la lumina roșie
– aproximativ 33% din conuri sunt sensibile la lumina verde
– aproximativ 2% din conuri sunt sensibile la lumina albastra [23i]
Spațiul RGB
Datorita caracteristicilor conurilor din ochiul uman, culorile sunt văzute ca diferite combinații ale culorilor primare: roșu, verde și albastru. [23i]
Culoarea fiecărui pixel se obține prin combinația a 3 culori: ROSU (R – Red) , Verde (G – green), Albastru(B – blue).
/
Fig. 1.1 – Reprezentarea combinării aditive a culorilor.
Acolo unde culorile primare (RGB) se suprapun se observă apariția culorilor secundare(CMY). Acolo unde toate trei culorile se suprapun se observa apariția culorii albe.[3i]
Imaginea color se obține prin combinarea la nivel de pixel a celor trei culori primare după cum este și relatat în Figura 1.2, deci prin combinarea celor 3 canale – Roșu, Verde și Albastru.
Fig. 1.2 – Obținerea imaginii color
Fiecare pixel din imagine este caracterizat prin cate o valoare pentru fiecare din cele 3 componente de culoare primare. Culoarea reprezintă un punct in spațiul 3D al modelului de culoare RGB (fig. 1.3) In acest cub al culorilor, originea axelor R, G, B corespunde culorii negre (0,0,0). Vârful opus cubului corespunde culorii albe (255, 255, 255). Diagonala cubului, între negru și alb, corespunde nuanțelor de gri (grayscale), caz în care R=G=B. Trei dintre vârfuri corespund culorilor primare roșu, verde si albastru. Celelalte 3 vârfuri corespund culorilor complementare: turcoaz, mov si galben (Cyan, Magenta, Yellow). Daca translatam originea sistemului de coordinate in punctual “alb” si redenumim cele 3 axe de coordinate ale sistemului C, M, Y obținem spațiul de culoare complementar CMY.
/
Fig. 1.3 – Modelul de culoare RGB mapat pe un cub [3i]
În acest exemplu (fig.1.3) fiecare culoare este reprezentata pe câte 8 biți (256 de niveluri. Numărul total de culori este
𝟐
𝟖
𝐱
𝟐
𝟖
𝐱
𝟐
𝟖
=
𝟐
𝟐𝟒
=𝟏𝟔.𝟕𝟕𝟕.𝟐𝟏𝟔 ≅𝟏𝟔.𝟎𝟎𝟎.𝟎𝟎𝟎 [3i]
Conversia unei imagini color într-o imagine grayscale
Pentru a converti o imagine color într-o imagine grayscale, cele 3 componente ale culorii fiecărui pixel trebuie egalizate. Cea mai des folosita metoda este medierea celor 3 componente [3i]:
𝑹𝒅𝒔𝒕 = 𝑮𝒅𝒔𝒕 = 𝑩𝒅𝒔𝒕 =
𝑹𝒔𝒓𝒄 + 𝑮𝒔𝒓𝒄 + 𝑩𝒔𝒓𝒄
𝟑
Ec. 1.1
Practic se face media RGB a fiecărui pixel, iar valoarea rezultată se va asigna fiecărui canal al fiecărui pixel din imaginea destinație.
Chiar dacă de multe ori se folosește medierea, nu aceasta este formula clasică utilizată în majoritatea mediilor de dezvoltare. Formula utilizata de OpenCV și în majoritatea framework-urilor este:
𝑹𝒅𝒔𝒕 = 𝑮𝒅𝒔𝒕 = 𝑩𝒅𝒔𝒕 = 𝟎.𝟐𝟗𝟗∗𝑹+𝟎.𝟓𝟖𝟕∗𝑮+𝟎.𝟏𝟏𝟒∗𝑩 [4i]
Ec. 1.2
(Vezi figura 2.3)
Spațiul HSV [5i]
Formatul de culoare RGB poate reprezenta orice culoare standard sau luminozitate folosind o combinație de componente roșu, verde și albastru. Pentru eficiență, acest lucru este stocat în mod obișnuit ca un număr de 24 de biți, folosind 8-biți pentru fiecare componentă de culoare (0 la 255), astfel încât, de exemplu, alb este format din R = 255, G = 255 și B = 255. Acest format se afla prezent aproape în toate ecranele de calculator, folosit timp de zeci de ani, și de aceea este formatul de culoare standard utilizat în software-ul de calculator. Din păcate, atunci când este vorba de vedere artificială (Computer Vision), valorile RGB vor varia foarte mult în funcție de condițiile de iluminare puternică sau slaba și umbre, etc. În comparație, HSV stă mult mai bine la manipularea diferențele de iluminat, și oferă o valoare de culoare ușor de utilizat.
HSV vine de la Hue-Saturation-Value, unde Hue este culoarea. Și, din moment ce culoare nu este un lucru ușor de separat sau comparat, Hue este adesea reprezentat ca un unghi circular (între 0.0 la 1.0 atunci când este depozitat ca flotant). Fiind o valoare circulară înseamnă că 1.0 este aceeași ca și 0.0. De exemplu, o nuanță de 0.0 este de culoare roșie, o nuanță de 0,25 ar fi verde, o culoare de 0,5 este de culoare albastră, o nuanță de 0,75 este roz, și o nuanță de 1,0 ar fi la fel ca și o nuanță de 0.0, care este de culoare roșie ( din nou). Saturația este cenușiul, astfel încât o valoare de saturație aproape de 0 înseamnă că este monoton sau gri, în timp ce o valoare a saturației de 0,8 ar putea fi o culoare foarte puternică (de exemplu: roșu dacă Hue este 0). Valoarea este luminozitatea pixelilor, deci 0.1 este negru și 0,9 este de culoare albă. Din păcate, există modalități diferite de a reprezenta culorile HSV, precum luminozitatea V,de 1.0, ar trebui să fie de culoare albă strălucitoare sau o culoare strălucitoare. Cele mai multe software-uri aleg luminozitatea V maxima care înseamnă alb, în timp ce OpenCV alege strălucirea maximă V pentru a înțelege o culoare strălucitoare.
/
Fig. 1.4. Cilindrul HSV [24i]
Capitolul 2
Segmentarea imaginilor, extragerea contururilor și operații morfologice
În acest capitol vor fi analizate metodele de segmentare utilizate în aplicația propusă de monitorizare a traficului (algoritmul de thresholding și segmentarea cu prag adaptiv dezvoltată după metoda propusă de Otsu), metoda de extragere a contururilor dintr-o imagine binară folosind operatorul Prewitt și operații morfologice aplicate imaginilor binare (erodare, dilatare, închidere și deschidere).
2.1 Metode de segmentare
Segmentarea presupune împărțirea unei imagini în mai multe zone de interes, în funcție de anumite criterii definite. Zonele care intră în componența unei imagini se numesc segmente. Algoritmii de segmentarea a imaginilor au la bază două criterii majore: discontinuitate și similaritate [1]: în prima categorie se dorește segmentarea imaginii pornind de la schimbările de intensitate din imagine, cum ar fi contururile; în a doua categorie se dorește împărțirea imaginii în regiuni similare, în funcție de un set predefinit de parametri, cum ar fi culoarea, luminozitatea etc. În acest subcapitol vor fi analizați doi algoritmi de segmentare care pornesc de la premisa că valorile intensităților diferă în funcție de regiune iar în cadrul fiecărei regiuni, care reprezintă obiectul corespunzător într-o scenă, valorile intensităților sunt similare
Cele două metode de segmentare analizate sunt: algorimul de segmentare cu prăguire (en. Thresholding) și segmentarea cu prag adaptiv (metoda Otsu). Pentru a putea aplica algoritmul de prăguire, avem nevoie să construim mai întăi histograma imaginii.
Histograma unei imagini
Histograma unei imagini redă distribuția nivelurilor de gri din imagine. Este funcția care asociază fiecărui nivel de gri frecvența de apariție în imagine. Dacă se consideră o imagine inițială cu o rezoluție de 8 biți/pixel, pe axa abscisei graficului histogramei se regăsesc cele 256 niveluri de gri posibile, iar pe axa ordonatei sunt redate frecvențele de apariție ale fiecărui nivel de gri de pe axa abscisei. Practic, în urma realizării histogramei se obține un vector h cu 256 de poziții (h(1) reprezintă numărul de pixeli care au valoarea intensității egală cu 0, h(2) reprezintă numărul de pixeli care au valoarea intensității egală cu 1, …, h(256) reprezintă numărul de pixeli care au valoarea intensității egală cu 255). Suma elementelor din h reprezintă numărul de pixeli din imagine. [2]
/
a
b
/
c
Fig. 2.1. Histograma unei imagini. © Imagine [3]
Imagine originală; b. Imagine grayscale; c.histograma
2.1.1 Thresholding sau determinarea pragurilor de segmentare (Prăguire) [6i]
Thresholding-ul este folosit cu scopul de a extrage obiectele din background prin atribuirea unei valori de intensitate fiecărui pixel, astfel încât fiecare pixel este clasificat ca fiind un punct dintr-un obiect sau un punct din background.
Separarea modurilor histogramei, și deci identificarea obiectelor din imagine, se face prin alegerea unor niveluri de gri, numite praguri de segmentare. De obicei aceste praguri se aleg ca fiind corespunzătoare minimelor locale ale histogramei.
Cazul ideal îl reprezintă o histogramă bimodală (care conține două moduri dominante), situație în care alegerea pragului se realizează simplu: punctul de minim dintre cele două maxime, ce reprezintă obiectul și fundalul.
De cele mai multe ori, histograma nu este bimodală și este nevoie de alte tehnici pentru a rezolva problema segmentării prin fixarea pragurilor de binarizare.
/
Fig. 2.2 – Histograma: (a) bimodală; (b) cu trei moduri dominante
Binarizarea prin fixarea pragului
Alegerea corectă a pragului este crucială pentru segmentarea cu succes a imaginilor. Binarizarea prin fixarea pragului este o operație puțin costisitoare din punct de vedere al calculelor, ea fiind una dintre cele mai vechi metode de segmentare și încă pe larg utilizată. Binarizarea imaginii este operația de transformare a unei imagini de intrare “f” într-o imagine de ieșire binară “g” (segmentată) după cum urmează:
g(i, j) =
1, 𝑝𝑒𝑛𝑡𝑟𝑢 𝑓(𝑖,𝑗)≥𝑇
0, pentru f(i,j)<𝑇
, unde T = prag, T 𝜖 [0…255]
(2.1)
Cu alte cuvinte:
g(i, j) = 1 ( pentru elementele imaginii ce aparțin obiectelor
g(i, j) = 0 ( pentru elementele ce aparțin fundalului (sau invers)
/
a
b
c
Fig.2.3. Binarizarea unei imagini
Imagine originala; b. Imagine grayscale; c.imaginea binarizată cu T = 75
Binarizarea are mai multe derivații. O posibilitate este aceea de a segmenta o imagine astfel încât toți pixelii ce au nivelurile de gri într-un interval dat D, să fie considerați ca făcând parte din regiune.
g(i, j) =
1, pentru 𝑓
𝑖,𝑗
𝜖 D, unde D⊆[0…255]
0, altfel
(2.2)
/
a
b
/c
Fig.2.4. Binarizarea unei imagini
Imagine originala; b. Imagine grayscale; c.imaginea binarizată cu D = [70, 150]
2.1.2 Metoda de segmentare Otsu
În Computer Vision și în Procesarea de imagini, metoda de segmentare Otsu, numită după Nobuyuki Otsu [4i], este folosită pentru segmentarea cu prag adaptiv a imaginii. Algoritmul presupune că imaginea conține două clase (histogramă bimodală); pixelii din primplan – foreground și pixeli de fundal – background. Ideea de bază a algoritmului este de a calcula pragul optim care separă cele doua clase, astfel încât varianța intra-clasă este minimă iar varianța dintre-clase este maximă.
Definirea problemei
1. Există două grupuri de pixeli, care se întind pe domenii de intensități diferite (ex: obiecte şi fundal). Problema selecției unui prag este complicată de faptul că aceste domenii de intensitate uneori se suprapun parțial. Se doreşte minimizarea erorilor de clasificare a unui pixel obiect ca fundal, şi vice-versa.
2. Pentru realizarea acestui deziderat, încercăm să minimizăm aria de sub histograma unei regiuni. Vom considera aceste două regiuni ca două grupuri.
3. Pragul va fi ales astfel încât cele două grupuri să fie cât mai “strânse”, minimizând astfel suprapunerea.
4. O măsură a omogenității grupului este varianța. Un grup cu omogenitate mare are o varianță mică, un grup cu omogenitate mică are varianță mare.
/
Fig. 2.5 – Alegerea pragului optim [7i]
Scopul metodei Otsu este de a găsi un prag de segmentare T care să minimizeze varianța ponderată intra-clasă [7i].
Varianța ponderată intra-clasă pentru cele două clase (foreground și background) se calculează conform relației:
𝝈
𝑾
𝟐
𝑻
=
𝑾
𝒃
𝑻
∙
𝝈
𝒃
𝟐
𝑻
+
𝑾
𝒇
𝑻
∙
𝝈
𝒇
𝟐
𝑻
(2.3)
Unde:
Wb(T) reprezintă probabilitatea ca pentru pragul de segmentare T, pixelii să facă parte din clasa background
𝑾
𝒃
𝑇
=
𝑛𝑢𝑚ă𝑟𝑢𝑙 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑖𝑥𝑒𝑙𝑖 𝑑𝑖𝑛 𝑐𝑙𝑎𝑠𝑎 𝑏𝑎𝑐𝑘𝑔𝑟𝑜𝑢𝑛𝑑
𝑛𝑢𝑚ă𝑟𝑢𝑙 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑖𝑥𝑒𝑙𝑖 𝑑𝑖𝑛 𝑖𝑚𝑎𝑔𝑖𝑛𝑒
(2.4)
Wf(T) reprezintă probabilitatea ca pentru pragul de segmentare T, pixelii să facă parte din clasa foreground
𝑾
𝒇
𝑇
=
𝑛𝑢𝑚ă𝑟𝑢𝑙 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑖𝑥𝑒𝑙𝑖 𝑑𝑖𝑛 𝑐𝑙𝑎𝑠𝑎 𝑓𝑜𝑟𝑒𝑔𝑟𝑜𝑢𝑛𝑑
𝑛𝑢𝑚ă𝑟𝑢𝑙 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑖𝑥𝑒𝑙𝑖 𝑑𝑖𝑛 𝑖𝑚𝑎𝑔𝑖𝑛𝑒
(2.5)
𝜎
𝑏
2
𝑇
reprezintă dispersia punctelor din clasa background
𝜎
𝑏
2
𝑇
=
𝑖=1
𝑁
(
𝑥
𝑖
−
𝜇
𝑏
)
2
𝑁
(2.6)
Unde N reprezintă numărul de pixeli din background, xi este intensitatea pixelului din clasa background iar
𝜇
𝑏
reprezintă media pixelilor din clasa background.
𝜎
𝑓
2
𝑇
reprezintă dispersia punctelor din clasa foreground
𝜎
𝑓
2
𝑇
=
𝑖=1
𝑀
(
𝑦
𝑖
−
𝜇
𝑓
)
2
𝑀
(2.7)
Unde M reprezintă numărul de pixeli din foreground, yi este intensitatea pixelului din clasa foreground iar
𝜇
𝑓
reprezintă media pixelilor din clasa foreground.
Observații:
Indiferent de pragul ales T, M + N = numărul pixelilor din imagine
Indiferent de pragul ales T,
𝐖
𝐛
T
+
𝐖
𝐟
T
=1
În acest moment sunt disponibile toate ecuațiile necesare pentru a măsura varianța ponderată intra-clasă.
Pentru fiecare prag potențial T:
Se separă pixelii în două clase, pe baza pragului T
Se calculează media celor două clase
Se calculează varianța dintre clase, conform ecuației Ec. 2.3
Se reține pragul T care minimizează această varianță.
Exemplu de funcționare a algoritmului Otsu
Algoritmul va fi demonstrat și explicat folosind o imagine grayscale de dimensiune 6×6 pixeli (Figura 2.6) [15i]. Pentru a simplifica explicația, sunt utilizate doar 6 niveluri de gri.
/
Fig. 2.6. Imagine folosită pentru a exemplifica modul de funcționare al metodei Otsu
Histograma imaginii din Figura 2.6 este reprezentată în Figura 2.7.
/
Fig. 2.7. Histograma imaginii din Figura 2.6
Calculele pentru găsirea varianțelor foreground-ului si background-ului (măsura de răspândire) pentru un singur prag sunt cele ce urmează.
/
8 pixeli 7 pixeli 2 pixeli
Fig. 2.8. Histogramă background
Pondere: Wb =
8+7+2
36
=0.4722
Centru: 𝜇b =
0 𝑥 8
+
1 𝑥 7
+ (2 𝑥 2)
17
=0.6471
Varianța:
𝜎
2
b =
(
0−0.6471
2
𝑥 8) +
(
1−0.6471
2
𝑥 7)+
(
2−0.6471
2
𝑥 2)
17
=0.4637
/
6 pixeli 9 pixeli 4 pixeli
Fig. 2.9. Histogramă foreground
Pondere : Wf =
6+9+4
36
=0.5278
Centru : 𝜇f =
3 𝑥 6
+
4 𝑥 9
+ (5 𝑥 4)
19
=3.8947
Varianța:
𝜎
2
f =
(
3−3.8947
2
𝑥 6) +
(
4−3.8947
2
𝑥 9)+
(
5−3.8947
2
𝑥 4)
19
=0.5152
Următorul pas este acela de a calcula varianța "intra-clasă". Acest lucru este pur și simplu suma celor două varianțe înmulțită cu ponderile asociate acestora.
Varianța "intra-clasă":
𝜎
2
w=Wb
𝜎
2
b + Wf
𝜎
2
f = 0.4722 𝑥 0.4637+0.5278 𝑥 0.5152=0.4909
Această valoare finală este "suma varianțelor ponderate" pentru valoarea de prag 3. Același calcul trebuie să fie efectuat pentru toate posibilele valori de prag de la 1 la 5. În urma calculelor (Tabel 2.1) a rezultat că pentru pragul T = 3, după cum a fost utilizat și în exemplu, se obține cea mai mică sumă a varianțelor ponderate. Prin urmare, acesta este pragul final selectat. Toți pixelii cu un nivel mai mic de 3 sunt pixeli de background, toți cei cu un nivel egal sau mai mare de 3 sunt pixeli de foreground. După cum arată imaginile din tabel, acest prag funcționează bine.
/
Fig. 2.10. Rezultatul segmentării folosind metoda Otsu [15i]
Această abordare pentru calcularea adaptivă a pragului este utilă pentru a explica conceptual modul de aplicare a algoritmului, dar necesită foarte mult timp de calcul. O variantă mai rapidă de implementare constă în calcularea varianței ”dintre-clase”, care este mult mai rapid de calculat. De această dată se va alege pragul pentru care se obține maximul varianței ”dintre-clase”. Din fericire, pragul pentru care se obține maximul varianței ”dintre- clase” coincide cu pragul pentru care se obține minimul varianței ”intra-clasă”.
Varianța "dintre-clase" este definită ca varianța totală a intensităților pixelilor din imagine minus varianța "intra-clasă":
𝜎
2
B =
𝜎
2
–
𝜎
2
W
Deoarece varianța totală este constantă, problema minimizării varianței intra-clasă este astfel echivalentă cu problema maximizării varianței dintre clase.
Tabel 2.1. Dependența dintre varianța “intra-clasa”, varianța “dintre-clase” și prag [15i]
Prag
T=0
T=1
T=2
T = 3
T=4
T=5
Varianța
"intra-clasă"
𝜎
2
W
σ2W = 3.1196
σ2W = 1.5268
σ2W = 0.5561
σ2W = 0.4909
σ2W = 0.9779
σ2W = 2.2491
Varianța
"dintre-clase"
𝜎
2
B
σ2B =
0
σ2B = 1.5928
σ2B = 2.5635
σ2B = 2.6287
σ2B = 2.1417
σ2B = 0.8705
În continuare este prezentat rezultatul obținut în urma segmentării folosind metoda Otsu, pentru o imagine te test.
a
/
b
c
Fig.2.11. Binarizarea unei imagini folosind metoda Otsu
Imagine grayscale; b) histograma; c) imaginea binarizată; prag găsit: T = 89
2.2. Extragerea contururilor
Pentru aplicația propusă se folosește ca input pentru extragerea contururilor imaginea deja binarizată, ceea ce simplifică puțin problema extragerii contururilor, putând utiliza o metodă simplă prin folosirea operatorului Prewitt.
Operatorul Prewitt folosește 2 matrice (măști de convoluție) pentru identificarea muchiilor pe orizontală, respectiv pe verticală. Mai exact, acesta intensifică (evidențiază) valorile pixelilor care reprezintă contururi.
Masca utilizată la identificarea muchiilor pe orizontală este :
/
Masca utilizată la identificarea muchiilor pe verticală este :
/
Pentru a identifica toate muchiile se utilizează următoarea formulă:
/
(2. 8)
În urma convoluției fiecăreia dintre cele 2 măști și imagine, rezultă câte o nouă imagine. Utilizând cele 2 imagini rezultate (după convoluția cu P și Q), se aplică formula (2.8) pentru obținerea imaginii finale în care au fost detectate toate contururile.
/
/
Imagine originală (binară)
Determinarea contururilor
Figura 2.12. Extragerea contururilor
2.3 Operații morfologice
Cuvântul morfologie provine din latină unde morphos înseamnă formă, iar logos știință. Așadar, morfologia este o știință a formelor, adică o abordare a prelucrării imaginilor bazată pe noțiunea de formă. Din punct de vedere matematic, domeniul morfologiei presupune operarea cu mulțimi de puncte cu rolul de a caracteriza forma obiectelor de interes. În general, operațiile morfologice au doi factori: primul corespunde mulțimii de transformat, iar al doilea factor corespunde mulțimii cu ajutorul și în funcție de care va fi transformată prima mulțime.
În cazul abordării bazate pe morfologie matematică, ideea de bază este în a considera imaginea ca un ansamblu. Asupra acestui ansamblu se aplică transformări prin comparația cu mulțimi mai simple, numite elemente structurante. Scopul acestor transformări este de a obține forme mai simple rezultate din formele inițiale ale imaginii [2]
Elementul structurant constă într-o mulțime geometrică, arbitrară, cunoscută și impusă. Forma și dimensiunea elementului structurant determină proprietățile testate asupra formei obiectului pe care dorim să îl modificăm.
Elementul structurant este definit de trei elemente caracteristice:
dimensiunea matricei: care specifică dimensiunea elementului structurant;
șablonul format din elementele 1 sau 0: care redă forma elementului structurant;
originea: care poate fi în interiorul elementului structurant sau în afara acestuia
/
Fig.2.13. Exemple de elemente structurante
Prelucrarea morfologică a imaginii binare va consta astfel în modificarea formelor obiectelor (valorilor de 1) din mulțimea imagine.Ca o abordare abstractă: prelucrarea morfologică este similară procesului de sculptare al unei figuri de lut, unde seturile de unelte sunt diversele elemente structurante [11i].
Tipuri de operații morfologice:
operații de bază: erodare, dilatare
operații compuse: hit or miss, deschidere, închidere, skeleton, gradient morfologic, etc…
2.3.1 Erodarea
Erodarea morfologica (simbol Θ) a mulțimii A prin elementul structurant B se defineşte ca fiind mulțimea punctelor din imagine în care elementul structurant translatat este inclus în mulțimea A. Transformarea de erodare este dată de relația:
AΘB = {x | Bx ⊂ A}, unde
2.9
A este mulțimea imagine (pixelii obiect)
B este mulțimea elementului structurant,
x reprezintă un punct/vector oarecare
Bx reprezintă mulțimea elementului structurant translatată cu originea în x
Exemplu didactic de realizare a erodării unei imagini binare
V4
/ V8
imagine originală
element structurant
imaginea rezultată în urma erodării
Fig.2.14. Exemplu de erodare
În continuare sunt prezentate rezultatele erodării cu diverse elemente structurante.
Imagine originală
Imagine binară
Imagine erodată cu elementul structurant /
Imagine erodată cu elementul structurant
Fig. 2.15. Exemplu de erodare
Observații referitoare la erodarea morfologică
Frontierele obiectelor sunt oarecum netezite de mici fluctuații
Obiectele sunt micșorate
Obiectele mici sunt eliminate
Golurile se măresc
Forma elementului structurant influențează rezultatele
2.3.2 Dilatarea
Dilatarea morfologica (simbol ⊕) a mulțimii A prin elementul structurant B se defineşte ca fiind mulțimea punctelor din imagine în care elementul structurant translatat are cel puțin un punct comun cu mulțimea A.
Transformarea de dilatare este descrisă de relația:
A⊕ B = {x | Bx ∩ A ≠ ∅}
2.10
Unde:
A este mulțimea imagine (pixelii obiect),
B este mulțimea elementului structurant,
x reprezintă un punct/vector oarecare
Bx reprezintă mulțimea elementului structurant translatată cu originea în x
Exemplu didactic de realizare a dilatării unei imagini binare
V4
/
V8
imagine originală
element structurant
imaginea rezultată în urma dilatării
Fig.2.16. Exemplu de dilatare
În continuare sunt prezentate rezultatele deschiderii cu diverse elemente structurante.
Imagine originală
Imagine binară
Imagine dilatată cu elementul structurant /
Imagine dilatată cu elementul structurant
Fig. 2.17. Exemplu de dilatare
Observații referitoare la dilatarea morfologică:
Obiectele sunt mărite
Obiectele mici sunt accentuate
Golurile mici sunt umplute
Forma elementului structurant influențează direcția de dilatare
2.3.3 Deschiderea imaginilor
Deschiderea morfologică a mulțimii A prin elementul structurant B, se defineşte ca fiind operația de erodare a lui A cu elementul structurant B urmată de o dilatare cu elementul structurant simetric
𝐁
𝐒
.
Transformarea de deschidere morfologică:
A°B =
AΘB
⊕
B
S
2.11
A este mulțimea imagine (pixelii obiect)
B este mulțimea elementului structurant,
Θ este operația de erodare,
⊕ este operația de dilatare
B
S
reprezintă mulțimea elementului structurant simetrizată
B
S
= { −b| b ∈ B}
Exemplu didactic de realizare a deschiderii unei imagini binare
V4
/
V8
imagine originală
element structurant
imaginea rezultată în urma deschiderii
Fig.2.18. Exemplu de deschidere
În continuare sunt prezentate rezultatele deschiderii cu diverse elemente structurante.
Imagine originală
Imagine binară
Imagine deschisă cu elementul structurant /
Imagine deschisă cu elementul structurant
Fig.2.19. Exemplu de deschidere morfologică
Observații referitoare la deschiderea morfologică:
Componentele conexe ale mulțimii A mai mici decât elementul structurant sunt eliminate.
Convexitățile foarte accentuate ale contururilor sunt teșite si „istmurile” sunt îndepărtate
Efect de netezire al frontierelor
2.3.4 Închiderea imaginilor
Închiderea morfologică a mulțimii A prin elementul structurant B se defineşte ca fiind operația de dilatare a lui A cu elementul structurant B urmată de o erodare cu elementul structurant simetrizat
𝐁
𝐒
. Transformarea de închidere morfologică:
A• B =
A⊕ B
Θ
B
S
2.12
Unde:
A este mulțimea imagine (pixelii obiect)
B este mulțimea elementului structurant
Θ este operația de erodare,
⊕ este operația de dilatare
B
S
reprezintă mulțimea elementului structurant simetrizată
B
S
= { −b| b ∈ B}
Exemplu didactic de realizare a închiderii unei imagini binare
V4
/
V8
imagine originală
element structurant
imaginea rezultată în urma închiderii
Fig.2.20. Exemplu de închidere
În continuare sunt prezentate rezultatele închiderii cu diverse elemente structurante.
Imagine originală
Imagine binară
Imagine închisă cu elementul structurant /
Imagine închisă cu elementul structurant
Fig.2.21. Exemplu de închidere morfologică
Observații referitoare la închiderea morfologică:
Golurile din obiecte, mai mici decât elementul structurant sunt umplute
Concavitățile accentuate ale contururilor sunt umplute si obiectele apropiate sunt unite
Efect de netezire al frontierelor
Capitolul 3
Captarea unei secvențe video
Captarea unei secvențe video este primul și cel mai important pas în dezvoltarea unei aplicații de procesare video de timp real. Pentru a fi mai ușor de înțeles, se va discuta despre procesare video din perspectiva bine-cunoscutei librării, OpenCV.
Elementele esențiale în dezvoltarea aplicațiilor de prelucrare video de timp real sunt următoarele:
Conectarea la cameră
Extragerea și prelucrarea frame-urilor
Vizualizarea sau salvarea frame-urilor prelucrate
Conectarea la cameră
Conectarea la cameră în OpenCV se realizează simplu utilizând următoarele linii de cod:
VideoCapture cap(0); // deschide camera implicită
if(!cap.isOpened()) // verifică dacă s-a reușit conectarea
return -1;
Crearea unui obiect de tipul VideoCapture care are ca parametru pe constructor tipul de cameră folosită. Daca i se dă parametrul 0 va deschide camera setată implicit pe sistemul de calcul pe care se rulează aplicația (de ex. la laptop va deschide camera încorporată). Parametrul de intrare pentru obiectul VideoCapture poate fi și un string, o cale către un fișier video din stocarea internă a sistemului de calcul. Acest mod de lucru este foarte util în dezvoltare pentru a putea face depanare și pentru a putea testa aplicația înainte de a o pune în producție.
Se verifică daca s-a reușit conexiunea. Dacă da, se merge mai departe. Dacă nu, se va ieși din program.
/
Fig. 3.1. Schema logică pentru conectarea la o cameră video fixă
Extragerea și prelucrarea frame-urilor
Următorul pas în dezvoltare, după conectarea la o camera fixă, constă în extragerea frame-urile în vederea prelucrării lor.
Acest lucru îl putem face utilizând următoarea secvență de program:
while(1){
Mat frame;
cap >> frame;
// Aici va fi adaugat codul de procesare a frame-ului
switch(waitKey(10)) {
case 27: return 0;//’ESC’ key pressed, exit program.
}
}
Secvența anterioară poate fi descrisă astfel:
Crearea unei bucle infinite
Declararea unui frame la fiecare iterație
Citirea informației de la camera și stocarea ei în variabila definită/declarată anterior.
Daca este apăsată tasta „ESC” se va ieși din program
/
Fig. 3.2. Schema logică pentru extragerea și prelucrarea frame-urilor
Vizualizarea și salvarea frame-urilor
Această etapă are o utilitate semnificativă în vederea afișării rezultatelor bazate pe prelucrări precedente.
Vizualizarea și salvarea frame-urilor poate fi realizată folosind:
imshow("nume_fereastra", frame); // crearea si afisarea unei ferestre
imwrite( "../../images/myImage.jpg", frame ); // stocarea unui frame
/
Fig. 3.3. – Crearea unei ferestre și afișarea frame-ului dorit
Capitolul 4
Prelucrarea frame-urilor dintr-o secvență video
Aplicația propusă spre dezvoltare presupune prelucrarea frame-urilor dintr-o secvență video. Pentru dezvoltarea acestei aplicații, trebuie urmați câțiva pași esențiali în vederea obținerii rezultatelor așteptate.
Pașii de urmat sunt:
Extragere background
Extragere foreground
Extragerea contururilor
Tracking (util pentru identificarea unică a autovehiculelor, în acest caz)
Logare informații(stocarea datelor relevante în loguri, care vor fi mai apoi folosite în vederea stocării informațiilor într-o baza de date)
4.1 Extragerea background-ului
Există mai multe soluții de extragere a background-ului (Preluarea primului cadru, Preluarea primului cadru în momentul în care nu se mai identifică mișcare, Adaptarea background-ului la fiecare n cadre cu una din metodele anterioare, metoda cu logica majoritară pe baza histogramei).
Metoda de extragere a background-ului utilizează mai multe metode pentru o mai bună funcționare a algoritmului. Astfel că, în primul rând extrage background-ul din primele 60 de frame-uri (urmează explicațiile metodei bazată pe logica majoritară), după care actualizează background-ul în momentul în care nu identifică mișcare semnificativă in secvența video.
Funcționalitatea metodei bazate pe logica majoritară:
Se ia o secvența de 60 de frame-uri (se poate lua un număr mai mare sau mai mic de frame-uri)
Se face cate o histograma pentru fiecare pixel de la coordonatele (x,y) din toate cele 60 de frame-uri.
Cu logica majoritară, se alege intensitatea pixelului cu valoarea cea mai mare si se setează în imaginea de background (inițial goală) la coordonatele corespunzătoare.
Pentru a exemplifica acești pași am ales sa folosesc o succesiune de 3 cadre de 3×3 pixeli:
Cadrul 1
Cadrul 2
Cadrul 3
10
12
11
8
6
7
15
14
3
10
8
11
5
4
7
11
15
3
9
12
15
8
6
2
15
14
3
Histogramele pe pixel, de la fiecare din coordonate, pentru cele 3 cadre sunt următoarele:
/ /
/ /
/ /
/ /
/
Aplicând logica majoritară pe fiecare din histogramele de mai sus =>
10
12
11
8
6
7
15
14
3
În momentul acesta avem background-ul, care este o imagine statică și pe care îl vom folosi în cele ce urmează în identificarea obiectelor aflate în mișcare.
Această metodă de extragere a background-ului nu este deloc eficientă și cu siguranță nu va funcționa într-o procesare de timp real, de aceea se apelează la această metodă doar atunci când există flux continuu de mișcare pentru actualizarea background-ului, după care se revine la metoda de bază, aceea în care background-ul se actualizează în momentul în care nu există mișcare sau mișcarea nu este semnificativă. În aplicație, pentru procesarea în timp real, am folosit o metoda adaptivă de extragere a background-ului și anume: BackgroundSubtractor, care are o implementare foarte eficientă în librăria OpenCV. Această metodă va fi explicată ulterior în capitolul 5.
4.2 Extragerea foreground-ului
Extragerea foreground-ului este o etapa simplă, după ce am reușit extragerea background-ului. Acest lucru se poate realiza, după cum se poate vedea in Figura 4.1, prin simpla scădere dintre frame-ul curent și background(pixel cu pixel). Desigur, dacă dorim să segmentăm imaginea, aplicăm și un threshold(prag) pentru a putea identifica ulterior obiectele (contururile) din imagine.
/
Fig. 4.1. Extragerea foreground-ului
Segmentarea foreground-ului poate fi realizată utilizând metoda adaptivă de binarizare a imaginii, numita metoda OTSU, prezentata în secțiunea 2.1.2.
Pragul pentru segmentare îl putem stabili noi, de altfel, în urma testelor statistice pe parcursul rulării programului, dar am ales să folosesc o metoda adaptiva din simplul motivul că pe parcursul unei zile, iluminarea unui tronson de drum diferă în funcție de intervalul orar, iar acest lucru poate duce la erori de identificare a autovehiculelor aflate în mișcare, necesitând contribuția administratorului pentru reconfigurarea pragului din când în când. Astfel, folosind metoda OTSU am eliminat aceasta probabilitate de eroare și am automatizat tot procesul, nemaifiind nevoie de intervenția omului.
Aplicarea acestei metode de extragere a foreground-ului și de segmentare a lui, utilizând librăria OpenCV, va fi prezentată pe îndelete în cele ce urmează în capitolul 5.
4.3 Extragerea contururilor dintr-o imagine binarizată
Având imaginea deja binarizată, extragerea contururilor nu va fi un proces anevoios, ci din contră, este relativ simplă realizarea acestui lucru având în vedere că pixelii de culoare albă reprezintă contururi:
Se creează o structura de date :
class Contour {
tl : Point;
tr: Point;
bl: Point;
br: Point;
centroid: Point
}
class Point {
x: int;
y: int;
}
Se parcurge imaginea pixel cu pixel de la stânga la dreapta și de sus în jos.
Când se identifică un pixel de culoare albă se stochează valoarea lui în tl (stânga sus)
Se parcurge de la tl imaginea spre dreapta pe linie până se dă de un pixel negru
Se stochează coordonatele ultimului pixel alb din parcurgerea de la punctul 4 în tr (dreapta sus)
Apoi de la tl se parcurge imaginea în jos până se dă de un pixel negru.
Se stochează coordonatele ultimului pixel alb după parcurgerea anterioara în bl
Se parcurge imaginea de la bl la dreapta până se dă de unde pixel negru.
Se stochează coordonatele ultimului pixel alb după parcurgerea de mai sus, în br.
Se observă că am identificat toate cele 4 colțuri ale unui posibil contur și anume : stânga sus, dreapta sus, stânga jos, dreapta jos.
Cunoscând aceste coordonate, este relativ simplu să calculăm centroidul conturului.
Pentru a face acest lucru este nevoie să încadrăm conturul într-un boundingRect în funcție de punctele găsite de noi, rezultându-ne o structura care conține coordonatele box-ului (x si y) plus lungimea și lățimea box-ului. Avem următoarele formule de calcul pentru coordonatele centroidului:
x = roi.x + roi.width / 2;
y = roi.y + roi.height / 2,
unde roi este obiectul rezultat în urma aplicării metodei bondingRect din librăria OpenCV.
Rect roi = boundingRect(contours[i]);
int x = roi.x + roi.width / 2;
int y = roi.y + roi.height / 2;
Inițial avem un array ce conține elemente de tipul Contour, iar fiecare contur identificat este stocat în acel array.
Exemplu concret de identificare a contururilor și de aplicare boundingRect:
Fig. 4.2 – Identificarea și încadrarea contururilor
Imaginea de input; b. Rezultatul identificării contururilor
Se poate observa că obiectele sunt perfect încadrate într-un pătrat, iar centroidul poate fi sesizat ca un punct negru în mijlocul fiecărui contur încadrat.
4.3 Urmărirea contururilor în vederea cuantificării autovehiculelor și a calcului vitezei de deplasare
Când spunem tracking cu toții ne gândim la un singur lucru : urmărire, după cum poate fi tradus și acest cuvânt.
Tracking nu înseamnă numai atât. Prin tracking trebuie înteles că este nevoie de identificarea unică a unui anumit contur într-o secvența video unde este prezentă mișcarea, nu doar încadrarea acelor contururi, dând iluzia de tracking.
Pentru ce avem nevoie de tracking ?
În special, tracking-ul este folosit pentru a identifica faptul că un contur este același cu cel din frame-ul anterior, iar pe baza acestor detalii să se poată calcula câte autovehicule trec pe un sens de circulație într-o anumită direcție, cât și calculul vitezei medii de deplasare a autovehiculelor într-o unitate de timp.
Pentru cuantificarea numărului de autovehicule se trasează o bara verticală de-a lungul benzii/benzilor de circulație pe fiecare sens de mers și se contorizează fiecare contur care trece peste bara respectivă
Pentru calculul vitezei se folosește aceeași bară verticală și se calculează viteza de deplasare a autovehiculului de când atinge bara până când a trecut de aceasta.
Problemele ce pot apărea aici țin de tronsonul de drum monitorizat și anume, atunci când există mai multe benzi pe sens. Exemplul următor relatează situațiile posibile pe un tronson de drum cu 2 benzi pe sensul de circulație:
Doua autovehicule trec în același timp peste bara verticală
/
Fig.4.3. Atingerea barei verticale de către 2 autovehicule(contururile albe)
/
Fig.4.4. Trecerea peste bara verticala a 2 autovehicule
Doua autovehicule ating în același timp bara verticala, dar unul dintre ele trece mai repede peste bară
/
Fig.4.5. Atingerea barei verticale de către 2 autovehicule(contururile albe)
/
Fig.4.6. Trecerea unui autovehicul mai rapid peste bara verticala decât altul
Detaliere probleme:
Daca doua autovehicule de mărimi diferite trec în același timp peste bara verticală, problema ce poate apărea este de confuzie a contururilor și deci este foarte probabil ca de la un frame la altul sa identificăm contururile într-o alta ordine.
Rezolvarea acestei probleme vine din faptul că atunci când se extrag contururile acestea se extrag ținând cont de poziționarea spațială a acestora în frame, frame-ul fiind parsat de sus în jos și de la stânga la dreapta. Astfel, tot timpul, indiferent ca avem 2 autovehicule unul lângă celălalt și amândouă trec în același timp peste bara verticală, ordinea contururilor extrase este aceeași, putând identifica unic fiecare dintre cele 2 contururi. Informațiile legate de numărul de autovehicule și de viteza de deplasare, sunt extrase pentru fiecare contur în parte.
Daca doua autovehicule ating în acelașii timp bara verticală, dar unul dintre ele trece mai repede peste bară, atunci poate apărea confuzia ca cel care a trecut mai repede sa fie considerat ca este cel care trece mai greu.
Rezolvarea acestei probleme vine la fel ca si cea anterioară, din extragerea contururilor ținând cont de organizarea spațială a acestora în frame.
Pentru a întări ideea de tracking și deci, pentru a înlătura orice posibilă confuzie între contururi sau ordinea acestora, o metodă simplă ar fi:
asignarea fiecărui contur unei clase
calculul distantei dintre centrul fiecarui contur din frame-ul curent și toate celelalte centre ale contururilor din frame-ul anterior
asignarea conturului curent la clasa din care face parte conturul din frame-ul anterior, cel mai apropiat de acesta.
Clasa asignată poate fi spre exemplu un flag sau o culoare a contururilor sau orice altceva prin care să se poată identifica în mod unic un contur.
Detaliile de implementare vor fi prezentate în capitolul ce urmează, capitolul 5.
Capitolul 5
Aplicarea conceptelor teoretice în dezvoltarea aplicației de monitorizare a traficului
Pentru a vedea cum putem aplica tot ceea ce am învățat în capitolele anterioare, în cele ce urmează se ilustrează pașii practici pentru fiecare concept în parte și modul cum s-au aplicat anumite concepte în anumite situații.
5.1 Scurtă descriere a aplicației
Aplicația, după cum sugerează și numele, este orientata pe extragerea anumitor informații de pe anumite tronsoane de drum, în anumite intervale orare, cu scopul de a aduce un ajutor autorităților competente în vederea îmbunătățirii circulației rutiere pe acele tronsoane de drum, prin monitorizarea traficului cu ajutorul unei camere fixe.
Informațiile furnizate de soft se refera la:
Cuantificarea numărului de autovehicule pe fiecare sens de circulație (indiferent de numărul benzilor pe fiecare sens)
Calculul vitezei medii de deplasare (implicit, calculul vitezei de deplasare a fiecărui autovehicul)
Aplicația are un comportament automat, nu are nevoie de intervenția omului, decât în faza de instalare, iar informațiile furnizate se stochează în memoria interna a dispozitivului (sistemului de calcul) care comunică direct cu camera, informații care ulterior vor fi stocate și prelucrate de organele competente (de exemplu, Politia Rutieră).
Fig. 5.1. Sistemul general al aplicației
5.2 Usecase general al aplicației
Schema următoare ilustrează o schema generala de proiectare a aplicației
într-un mod ușor de înțeles prin imagini. Scopul acestei scheme este acela de a înțelege ușor și rapid funcționalitatea aplicației, precum si a fiecărui modul in parte.
Fig. 5.2. Schemă usecase general
Pentru o mai buna înțelegere a schemei am făcut următoarea legenda pentru fiecare element important:
/ – reprezintă sistemul de calcul pe care rulează softul;
/ – reprezintă camera fixa care preia informația de pe teren
/ – reprezintă organele competente care folosesc informațiile furnizate de aplicație (exemplu: Politia Rutiera)
/ – reprezintă ieșirea din aplicație
/ – reprezintă un usecase. Acestea vor fi detaliate fiecare în parte.
5.3 Descriere detaliată usecase-uri
5.3.1 Usercase-ul general
Usecase: Calcul viteză deplasare obiecte
Overview: Un utilizator folosește o aplicație pentru monitorizarea deplasării unui obiect intr-un plan. Acest lucru este posibil utilizând o camera fixa.
Actori: Sistem, Camera, Utilizator
Precondiții: 1. Camera trebuie sa aibă un frame rate de minim 30 frame-uri/s
2. Camera trebuie sa fie fixa.
3. Dimensiunile planului trebuie inițializate.
Scenariul principal:
1. Introducere setări pentru planul de vizualizare
2. Setările planului se vizualizare se pot adăuga direct de către utilizator sau pot fi obținute dintr-un fișier de configurare
3. Calibrează camera pe baza setărilor planului
4. Pornește camera
4.1 Verifica daca s-a putut realiza conexiunea la camera
4.2 Daca se realizează conexiunea cu succes
5. Camera începe sa preia frame cu frame (minim 30 frame/s)
6. Se extrage background-ul
7. Se face diferența între background și frame-ul curent
8. Se pune rezultatul într-o imagine
9. Se segmentează această imagine
10. Se identifică obiectul aflat în mișcare
11. Încadrează obiectul într-un rectangle (pătrat)
12. Afișează obiectul încadrat pe ecran
13. Se cuantifică autovehiculele care trec peste barele ce delimitează cele 2 sensuri de mers
14. Afișează numărul de autovehicule pe ecran
15. Se calculează viteza de deplasare a fiecărui autovehicul pe baza diferenței dintre frame-uri atunci când atinge bara și când trece de aceasta.
16. Afișează viteza de deplasare a fiecărui autovehicul.
17. Logează informațiile în memoria principală a sistemului de calcul pe care rulează aplicația. Stocarea informațiilor se face într-un fișier cu extensia .mtr.
Postcondiții:
Utilizarea numărului de autovehicule și a vitezei de deplasare medii, obținute într-o perioada de timp, în scopul dorit (de exemplu pentru determinarea anumitor statistici în scopul limitării vitezei auto într-o anumită zonă într-un interval orar sau statistici legate de blocaje în trafic, statistici legate de cât de aglomerate sunt anumite tronsoane de drumuri în anumite intervale orare, etc.)
Formatul fișierului cu extensia .mtr este următoarea:
(timestamp, nr_autovehicule_la_stânga, viteza_medie_autovehicule_la_stânga, nr_autovehicule_la_dreapta, viteza_medie_autovehicule_la_dreapta)
Se va adăuga cate un astfel de token la fiecare interval de timp, presetat.
4.3: @4. Daca nu se realizează conexiunea la cameră cu succes afișează un mesaj și se dă abord(abandonare) procesului.
5.3.2 Conectarea la o camera fixa
Usecase: Conectarea la o camera fixa
Overview: Realizarea conexiunii cu o camera fixa in vederea extragerii informației de pe teren
Actori: Sistem, Camera
Precondiții: Camera utilizata trebuie sa poată capta minim 30 frame/s.
Scenariul principal:
1. Instalare camera într-un punct fix
2. Orientare camera în plan vertical, poziția acesteia fiind în partea de sus a planului.
3. Calibrare cameră pentru a capta întregul plan dorit
4. Realizarea conexiunii dintre sistemul de calcul și camera
5. Conectarea softului la hardware-ul camerei în vederea extragerii informației din planul dorit (preluarea frame cu frame spre procesare)
6. Ieșirea din aplicație daca nu se reușește conectarea camerei la softul care rulează pe sistemul de calcul.
Postconditii:
Ieșire din aplicație dacă nu se reușește conectarea camerei la softul care rulează pe sistemul de calcul.
Frame-urile captate cu ajutorul camerei sunt transmise sistemului pentru a putea fi prelucrare în vederea extragerii informației necesare din acestea.
Frame-urile vor fi procesare 1 cate 1, exact în ordinea în care sunt preluate de camera video.
Fig. 5.3. Schema de conectare la o cameră fixă
5.3.3 Captarea frame-urilor
Usecase: Extragere frame-uri
Overview: Extragerea frame-urilor captate de camera video în urma instalării si calibrării corespunzătoare a acesteia.
Actori: Sistem, Camera
Precondiții: 1. Camera trebuie instalată ți calibrată.
Camera trebuie să capteze frame-urile pe plan vertical.
Trebuie realizată conexiunea între softul care rulează pe sistemul de calcul și hardware-ul camerei propriu-zise
Scenariul principal:
1. Se realizează conexiunea la camera
2. Extragerea frame cu frame
3. Stocarea fiecărui frame într-o structura de date corespunzătoare
Postcondiții:
Fig. 5.4. Schema de captare a frame-urilor
Fiecare frame va fi procesat imediat după ce a fost captat și stocat într-o structură de date corespunzătoare.
5.3.4 Extragere background
Usecase: Extragere background
Overview: Extragerea background-ului cu scopul de a identifica contururile autovehiculelor (obiectele aflate in mișcare)
Actori: Sistem, Camera
Precondiții: Captarea primului frame și considerarea lui ca fiind background
Scenariul principal:
1. Se captează primul frame și se consideră a fi background
2. Se captează restul frame-urilor, frame cu frame
3. Se face diferența între frame-ul curent și background
4. Daca nu se identifica mișcare prin diferența se adaptează background-ul vechi cu frame-ul curent și îl consideră pe acesta ca fiind noul background.
Postcondiții:
Se păstrează background-ul într-o structura de date corespunzătoare cu scopul utilizării lui ulterioare în extragerea contururilor și detecția mișcării din cadrul video
Fig. 5.5 – Schema de extragere a background-ului
5.3.4 Extragere foreground
Usecase: Extragere foreground
Overview: Extragerea foreground-ului cu scopul de a identifica obiectele aflate în mișcare
Actori: Sistem, Camera
Preconditii: Captare frame cu frame
Scenariul principal:
1. Se captează frame cu frame (maxim n frame-uri/sec, în funcție de cameră)
2. Se elimină pixelii irelevanți, care reprezintă umbra obiectelor, în cazul in care exista:
a) Pentru eliminarea umbrelor trebuie sa efectuam câțiva pași esențiali:
I. Se trece frame-ul curent in spatiul HSV
II. Se trece background in HSV
Mai departe se folosește doar componenta V.
III. Pentru fiecare pixel din cele doua imagini, calculez raportul I = Vimagine/Vbackground, deci I este imaginea rezultată care conține valorile raportului anterior evidențiat.
IV. Se segmentează imaginea I folosind Otsu; ce este mai mic decât pragul scos cu Otsu este umbra
V. Pe imaginea binară se aplică apoi o deschidere
b) Se utilizează în continuare imaginea rezultată fără umbre
3. Se face diferența între frame-ul curent(fără umbre) și background și rezultă o imagine care conține doar foreground-ul
Postcondiții:
Se păstrează imaginea rezultată într-o structură de date corespunzătoare cu scopul utilizării ei ulterioare în extragerea contururilor și detecția mișcării din cadrul video prin tehnici de segmentare
– Se segmentează foreground-ul cu metoda de segmentare OTSU
– Se realizează extragerea contururilor din imaginea binarizată
Fig. 5.6 – Schema de extragere a foreground-ului
Exemplu care evidențiază detecția umbrei într-un frame în vederea eliminării ulterioare a acesteia:
/
Fig. 5.6.1. Background
/
Fig. 5.6.2. Frame-ul curent
/
Fig. 5.6.3. Detecție umbră
/
Fig. 5.6.4. Încadrarea foreground-ului
Zona hașurată cu roșu va fi eliminata din frame-ul curent pentru o mai bună segmentare a acestuia și pentru a extrage cat mai corect contururile.
5.3.5 Tracking
Usecase: Tracking
Overview: Cuantificarea și calculul vitezei de deplasare a autovehiculelor
Actori: Sistem, Camera
Precondiții: Eliminare umbre, segmentare imagine, extragerea corecta a contururilor
Scenariul principal:
1. Definirea a 2 bare verticale de-a latul părții carosabile pentru fiecare sens de mers
2. Încadrarea fiecărui contur într-un pătrat
3. Identificarea atingerii unei bare de către conturul încadrat
4. Identificarea trecerii de bara, a conturului încadrat
5. Cuantificarea numărului de autovehicule
6. Calculul vitezei de deplasare a autovehiculelor pe baza vitezei de trecere peste bara verticală.
Postcondiții:
Se stochează local aceste date esențiale în vederea punerii loc sub forma necesara stocării în fișierul cu extensia .mtr
Fig. 5.7. Continuare schemă. Tracking
Exemplu concret de cuantificare a numărului de autovehicule și de calcul a vitezei de deplasare:
/
Fig. 5.7.1. Autovehicul care trece peste bara verticală
/
Fig. 5.7.2. Autovehicul care trece peste bara verticală – imagine binară
/
Fig. 5.7.3. Autovehicul care trece de bara verticală
/
Fig. 5.7.4. Autovehicul trece de bara verticală – imagine binară
Se observa că în momentul trecerii autovehiculului de bara verticala, numai atunci se incrementează numărul de autovehicule care au trecut peste acea bară și numai atunci se poate realiza și calculul vitezei de deplasare.
Pentru cuantificarea autovehiculelor, în procesarea în timp real, am utilizat următoarea tehnica de calcul:
Definirea a 4 variabile în afara buclei infinite de captare a frame-urilor. 2 dintre acestea stochează numărul de autovehicule, iar 2 păstrează ultimul nr de intersecții al conturului cu bara, deoarece la fiecare frame, conturul trece pixel cu pixel peste bara verticală și va fi nevoie de un hack pentru a putea cuantifica corect numărul de autovehicule.
// Stocheaza numarul total de autovehicule
int noOfCarsToLeft = 0;
int noOfCarsToRight = 0;
// Stocheaza ultimele valori ale intersectiilor dintre
// contur si bara
int lastRightIntersections = 0;
int lastLeftIntersections = 0;
Definirea a 2 variabile locale în blocul buclei infinite de captare a frame-urilor, care se reinițializează cu 0 la fiecare iterație:
int rightIntersections = 0;
int leftIntersections = 0;
Calculul efectiv al numărului de autovehicule:
noOfCarsToLeft += leftIntersections < lastLeftIntersections ? abs(leftIntersections – lastLeftIntersections) : 0;
lastLeftIntersections = leftIntersections;
noOfCarsToRight += rightIntersections < lastRightIntersections ? abs(rightIntersections – lastRightIntersections) : 0;
lastRightIntersections = rightIntersections;
Pentru calculul vitezei de deplasare s-a utilizat aproximativ același hack, cu specificația că prelucrarea și furnizarea anumitor informații a fost realizată cu scopul de a pregăti datele necesare formulei de calcul a vitezei:
𝒗=
𝒅
𝒕
, unde v reprezintă viteza de deplasare, d reprezintă distanța parcursă, iar t reprezintă unitatea de timp
Deci viteza (v) reprezintă distanța (d) parcursă de autovehicul în unitatea de timp (t).
Pentru a putea explica metoda dezvoltată pentru a calcula viteza de deplasare au fost alese câteva valori concrete pentru pregătirea datelor în vederea obținerii rezultatului dorit.
Camera captează 60 de frame/s
Dimensiunea frame-ului : 800×600 (800 pixeli pe lățime și 600 pixeli pe lungime)
Distanța orizontală(lățimea) planului real : 50m
Lățimea unui autovehicul în pixeli : 60px;
Numărul de frame-uri care trec de când autovehiculul atinge bara până când acesta trece de bară : 15frame-uri
În primul rând este nevoie să se știe cât reprezintă 1 m în pixeli. Pentru aceasta se poate calcula simplu cu regula de 3 simplă :
800px ……………………………… 50m
X px ……………………………….. 1m
De aici rezultă că : 𝐱 =
𝟖𝟎𝟎𝐩𝐱 ∗ 𝟏𝐦
𝟓𝟎𝒎
, de unde poate fi dedus că:
1m = 16px
Ec. 5.1
Dacă lățimea unui autovehicul în pixeli = 60 pixeli și conform Ec. 5.3.5 – 1 , rezultă că distanța în metri a autovehiculului este:
𝒅 =
𝟔𝟎
𝟏𝟔
= 𝟑.𝟕𝟓m
Ec. 5.2
În acest moment avem distanța autovehiculului, distanța care va fi folosită în formulă deoarece, după cum este explicat mai sus, ne interesează distanța pe care o parcurge autovehiculul din momentul când atinge bara până în momentul când a trecut de ea și deci aceasta distanță este exact lungimea autovehiculului.
Pentru calculul timpului poate fi aplicată din nou regula de 3 simplă, astfel:
60frame-uri …………………….. 1 sec
15 frame-uri …………………….. x sec
De aici se poate deduce ușor că timpul pe care îl parcurge autovehiculul de la momentul în care atinge bara și până în momentul în care trece de aceasta este :
𝒕 =
𝟏𝟓𝒄𝒂𝒅𝒓𝒆∗ 𝟏𝒔𝒆𝒄
𝟔𝟎𝒄𝒂𝒅𝒓𝒆
= 𝟎.𝟐𝟓𝐬
Ec. 5.3
În acest moment sunt disponibile toate datele pregătite pentru a putea aplica formula vitezei și anume se dispune de distanța (d) și timpul (t). Astfel aplicând formula vitezei, rezultă:
𝒗 =
𝒅
𝒕
=
𝟒.𝟓
𝟎.𝟐𝟓
=𝟏𝟖 𝒎/𝒔
Ec. 5.4
Daca se dorește vizualizarea vitezei sub altă formă, de exemplu în km/h, atunci se pot face conversiile de rigoare (înmulțind valoarea din metri / sec cu valoarea 3.6), astfel rezultând :
𝑣 =
𝑑
𝑡
=
4.5
0.25
=18
𝑚
𝑠
=64.8
𝑘𝑚
ℎ
Ec. 5.5
Bineînțeles că pentru a obține niște valori cat mai aproape de adevăr și cât mai corecte trebuie ca partea de segmentare și de extragere a contururilor să fie cât mai corectă și exactă. Partea aceea este cea mai importanta deoarece erori în calculele de mai sus nu există, singura problemă pentru ca aceste calcule să greșească sau sa furnizeze rezultate eronate, este să nu primească niște valori de input corecte, valori primite în urma segmentării și implicit ale extragerii contururilor.
Un exemplu care poate duce la erori de calcul a vitezei este acela de a nu elimina umbrele înainte de segmentare. Problema aici apare datorită faptului că este foarte probabil ca 2 sau mai multe autovehicule să fie foarte apropiate, iar umbra să unească contururile acestora. Atunci cu siguranță vor apărea erori de calcul a vitezei din cauza faptului că cele 3 autovehicule vor fi văzute ca un singur contur, dimensiunea acestuia în pixeli fiind mult mai mare decât a unui autovehicul normal și implicit Ec. 5.2 si Ec. 5.3 vor furniza valori eronate.
Pentru a evidenția acest exemplu se poate apela la ilustrarea unui exemplu concret din aplicație, un exemplu care a fost o problemă într-una din etapele de dezvoltare.
Alte exemple vor fi evidențiate mai târziu când va veni discuția despre probleme ce pot apărea la partea de segmentare deoarece pot scăpa foarte simplu detalii care pot afecta funcționalitatea aplicației și implicit să furnizeze informații eronate.
De aceea focusul principal a fost pe furnizarea unor date corecte din toate punctele de vedere, in timp real, si mai puțin pe diverse funcționalități care pot fi aduse ca îmbunătățiri ulterioare.
În exemplul următor veți vedea încadrarea contururilor aflate într-un pătrat cu verde și încadrarea efectiva a contururilor, păstrând forma acestora, cu roșu. Zonele încadrate evidențiază problema adusă de umbre și anume că unește doua contururi diferite, rezultând unul singur.
Stocare date
Usecase: Stocare date
Overview: Stocarea informațiilor relevante legate de numărul de autovehicule și viteza medie de deplasare a acestora într-un interval orar, pe un anumit tronson de drum
Actori: Sistem, Camera
Precondiții: Furnizarea numărului de autovehicule, a vitezei medii de deplasare si id-ul camerei.
Scenariul principal:
Aducerea datelor esențiale(id-ul camerei, numărul de autovehicule, viteza medie de deplasare) la o formă ușor de folosit pentru stocare
Crearea unui fișier cu numele care respecta următorul pattern: [idCamera_data:LL.ZZ.AAAA_ora:HH.MM.SS]
Creare unui token ce conține datele esențiale. Token-ul trebuie sa respecte următorul pattern :
(timestamp, nr_autovehicule_la_stanga, viteza_medie_autovehicule_la_stanga, nr_autovehicule_la_dreapta, viteza_medie_autovehicule_la_dreapta)
Utilizarea unui timer pentru a stabili când se realizează stocarea
Stocarea acestui token în fișier
Postcondiții: Crearea unui fișier de stocare tokeni la începutul fiecărei zile.
Exemplu fișier:
/
Fig. 5.8. Numele fișierului cu extensia .mtr
/
Fig. 5.9. Conținut fișierului cu extensia .mtr
Etapa de stocare a datelor, printre altele, este o etapă importantă mai ales din perspectiva informațiilor pe care le furnizează, cât și din perspectiva faptului că fără această etapă, aplicația rămâne, de fapt, fără utilitate.
Stocarea datelor se realizează prin logarea acestora într-un fișier text cu extensia .mtr, format propriu pentru această aplicație, format care oferă posibilitatea stocării informațiilor într-un mod unic, util, eficient și ușor din perspectiva parsării lui în vederea extragerii informațiilor și stocării acestora în alte medii precum baze de date, etc.
Formatul este bazat pe salvarea de token-uri ce respecta următorul pattern:
(timestamp, nr_autovehicule_la_stanga, viteza_medie_autovehicule_la_stanga, nr_autovehicule_la_dreapta, viteza_medie_autovehicule_la_dreapta)
Fiecare token, în momentul când este stocat, este unic și se salvează pe un rând diferit din fișier. Unicitatea lui vine din utilizarea timestamp-ului care este perioada de timp din momentul stocării.
Acest timestamp nu poate fi duplicat, la fiecare 24 de ore generându-se un alt fișier cu extensia .mtr unde se stochează datele pe ziua corespunzătoare.
Fig. 5.10. Continuare schemă. Stocare date
După cum se poate observa, aceasta este și ultima etapă a aplicației, schema fiind identică cu cea inițială, schema usecase-ului general.
S-a descris fiecare etapa pentru a vedea pas cu pas cum se poate construi o aplicație de la 0 în scopul dorit. La fiecare pas s-au evidențiat subetapele de dezvoltare astfel încât, într-un final să se obțină un produs finit care să satisfacă nevoile utilizatorilor sau beneficiarilor, direct sau indirect; în acest caz, obținerea anumitor informații utile autorităților în vederea fluidizării traficului rutier și a îmbunătățirii condițiilor de circulație într-un mod eficient.
Pasii algoritmului
Pentru a înțelege mult mai bine usecase-urile detaliate, se prezintă în cele ce urmează, pașii algoritmului de monitorizare a traficului, bazat explicit pe usecase-urile deja definite.
Pașii următori sunt bazați pe utilizarea librariei OpenCV în dezvoltarea algoritmului:
Crearea unui obiect VideoCapture cap(0); // default camera care primește ca parametru id-ul camerei la care se conectează;
Verificare dacă s-a realizat cu succes conexiunea
if(!cap.isOpened()) // check if we succeeded
return -1;
Crearea unei bucle infinite cu posibilitatea ieșirii din ea la apăsarea tastei ESC;
while(1)
{
//algoritm
if(waitKey(10) == 27)
return 0;
}
Citirea cadru cu cadru din obiectul capture care a realizat conexiunea la cameră;
while(1)
{
Mat frame;
cap >> frame;
//prelucrare frame-uri
imshow("frames", frame);
if(waitKey(10) == 27)
return 0;
}
Definirea unor bare verticale, de-a latul părții carosabile, pentru fiecare sens de circulație din imaginea captată;
line(frame, Point(p1->x, p1->y), Point(p2->x, p2->y), Scalar(0, 255, 255), 5, 8);
unde p1 reprezintă primul punct pentru bara de pe primul sens de circulație, iar p2 reprezintă capătul celalalt al segmentului care creează bara. Prin unirea celor 2 puncte rezulta o linie(bară) de-a latul sensului de circulație. La fel se face și pentru celălalt sens.
Afișarea pe ecran a vitezei inițiale (0km/h) pentru fiecare sens de mers;
putText(frame, "Speed = " + intToString(LeftSpeed) + " km/h", Point(p1LeftLine->x – 40, p1LeftLine->y – 10), FONT_HERSHEY_PLAIN, 1.2, Scalar(255, 255, 255), 1, 8);
unde LeftSpeed reprezintă viteza de deplasare a autovehiculelor care se deplasează pe sensul de mers orientat la stânga în funcție de planul de captare a camerei, iar p1LeftLine reprezintă punctul de sub bara corespunzătoare sensului de mers.
Crearea unui obiect de tipul BackgroundSubtractorMOG2 care poate avea anumite setări pentru detecția umbrelor și asignarea unui prag de segmentare implicit.
Ptr<BackgroundSubtractorMOG2> = createBackgroundSubtractorMOG2(500, 50, true);
bg->setDetectShadows(true);
bg->setShadowValue(0);
bg->setShadowThreshold(0);
Extragerea background-ului
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
Mat1b fmask;
// Background subtraction
bg->apply(frame, fmask, -1);
// Get background
Mat background = getBackground(bg);
// Clean foreground from noise
morphologyEx(fmask, fmask, MORPH_OPEN, kernel);
Obiectul background este folosit de metoda apply pentru a realiza următorii subpași:
Diferența dintre background și frame-ul curent din care rezultă o imagine (Matrice)
Segmentarea acestei imagini utilizează pragul setat la pasul 7. Implicit pragul este 0. Daca pragul setat este 0, atunci segmentarea realizata de metoda apply va folosi cea mai buna metoda de segmentare, printre care si OTSU, pentru a scoate ca output o imagine segmentata corect, o imagine binară, care conține contururile corect despărțite.
Imaginii rezultate i se va aplica o metodă de curățare a zgomotului, acest lucru realizându-l metoda morphologyEx care aplica o deschidere a imaginii cu elementul structurant de tip pătrat de dimensiune 5×5 pixeli, creat în variabila kernel.
Dilatarea imaginii rezultate în urma extragerii background-ului
// Image enclosing
Mat dilateElement = getStructuringElement(MORPH_RECT, Size(10, 10));
dilate(fmask, fmask, dilateElement);
Aplicarea dilatării, cu elementul structurant de tip pătrat cu dimensiunea de 10×10 pixeli,după metoda de deschidere a imagini se realizează cu scopul de a uni eventualele regiuni foarte apropiate care fac parte din același contur în vederea încadrării cât mai corecte a contururilor într-un boundingRectangle (pătrat).
Găsirea contururilor
Capitolul 4.3 definește metoda de extragere a contururilor. Această metodă este utilizată în OpenCV prin intermediul unei funcții denumite findContours.
vector<vector<Point>> contours;
findContours(fmask.clone(), contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
În acest moment, structura de date contours conține, în fiecare element din vector, câte un contur care nu este altceva decât un vector de puncte din imagine.
Încadrarea contururilor într-un boundingRect (pătrat)
for (size_t i = 0; i < contours.size(); i++){
Rect roi = boundingRect(contours[i]);
rectangle(frame, roi, colors[i]);
}
Se parcurge vectorul de contururi, după care se încadrează fiecare contur într-un boundingRect și apoi se desenează pe ecran pătratul.
Identificarea centroidului pentru fiecare contur:
for (size_t i = 0; i < contours.size(); i++){
Rect roi = boundingRect(contours[i]);
rectangle(frame, roi, colors[i]);
// Coordonatele centroidului
int x = roi.x + roi.width / 2;
int y = roi.y + roi.height / 2;
}
Definirea funcțiilor de intersecție a contururilor cu barele anterior definite:
bool isLeftBarIntersected(Rect roi, Point* p1, Point* p2) {
return ((p1->x >= roi.tl().x) && (p2->x <= roi.br().x)) && ((roi.y >= p1->y) && (roi.y <= p2->y));
}
bool isRightBarIntersected(Rect roi, Point* q1, Point* q2) {
return ((roi.tl().x <= q1->x) && (q1->x <= roi.br().x)) && ((roi.y >= q1->y) && (roi.y <= q2->y)); }
Metoda isLeftBarIntersected este definită pentru a identifica dacă un contur a trecut peste bara din stânga. Această metoda ajută la calculul numărului de autovehicule care trec peste bara din stânga și calculul vitezei lor de deplasare.
Metoda isRightBarIntersected este definită pentru a identifica dacă un contur a trecut peste bara din dreapta. Această metoda ajută la calculul numărului de autovehicule care trec peste bara din dreapta și calculul vitezei lor de deplasare.
Cuantificarea numărului de autovehicule și calculul vitezei de deplasare
for (size_t i = 0; i < contours.size(); i++){
// …
// Identificarea numarului de autovehicule la stanga
if (isLeftBarIntersected(roi,p1LeftLine, p2LeftLine)){
leftIntersections++;
// calcul viteza de deplasare -> vezi anexa
}
// Identificarea numarului de autovehicule la dreapta
if (isRightBarIntersected(roi, p1RightLine, p2RightLine)) {
rigthIntersections++;
// calcul viteza de deplasare -> vezi anexa
}
}
Acest exemplu este folosit doar pentru a relata cum se poate calcula numărul de autovehicule care circulă într-un anumit sens și viteza de deplasare a acestora. Pentru a folosi această metodă, care, în realitate are nevoie de anumite hack-uri pentru a funcționa și este mult mai stufoasă, poate fi consultată anexa în secțiunea ce cuprinde codul sursă, iar pentru informații teoretice legat de acest subiect poate fi consultat capitolul 4.4 – Tracking
Stocare date sau logarea informațiilor
În această etapă se creează un fișier cu extensia .mtr la începutul fiecărei zile, unde se stochează datele esențiale (vezi capitolul 4.5)
Schema bloc a algoritmului
/
Istorie în dezvoltare aplicației de monitorizare a traficului
Ca orice altă idee de dezvoltare a unei aplicații, ideea aplicației de monitorizare a traficului rutier a trecut prin mai multe faze încă de la început, până s-a ajuns la o idee stabilă, la o forma închegată, un produs finit, cu tot ceea ce are nevoie pentru a satisface nevoile principale ale utilizatorilor/beneficiarilor și anume, fluidizarea traficului rutier.
Fazele de dezvoltare, cele mai importante, prin care a trecut aplicația sunt:
Identificarea autovehiculelor în mișcare folosind o secvență de 2 frame-uri consecutive
Identificarea autovehiculelor în mișcare într-o secvența video
Tracking
Cuantificarea numărului de autovehicule
Calculul vitezei medii de deplasare
Faza 1:
Pentru a putea identifica un contur în mișcare într-o secvență de mai multe frame-uri, foarte utilă a fost prelucrarea a 2 frame-uri consecutive care conțin o secvența de mișcare a unui obiect și obținerea informațiilor dorite de aici.
Inițial prelucrarea a constat în identificarea contururilor din cele 2 frame-uri prin segmentare și calculul distantei euclediene dintre centrele celor 2 contururi. Dacă distanța era mai mare decât 0, atunci cu siguranță obiectul respectiv se află în mișcare.
Un alt element esențial a fost filtrarea contururilor pentru eliminarea celor neesențiale, adică a contururilor cu o suprafață mai mica decât un prag stabilit.
Faza 2:
Odată realizată faza 1, a fost necesară testarea algoritmului pe o secvență video pentru a valida corectitudinea rezultatelor.
În această fază, problemele apărute au fost de natură costisitoare din punct de vedere al timpului de execuție. Aici a fost necesar aplicarea anumitor tehnici de extragere a background-ului, extragere a foreground-ului, segmentare (în acest caz OTSU) și de extragere a contururilor, metode explicate anterior în capitolul 5.5 dar și în capitolul 4 din punct de vedere teoretic.
Îmbunătățirea acestor metode au adus o contribuție semnificativă asupra timpului de execuție a programului și implicit în procesarea în timp real a unei secvențe video.
Faza 3:
Primele 2 faze au avut ca scop pregătirea cadrelor în vederea extragerii informațiilor din acestea și implicit stocarea lor(logarea informațiilor) spre a fi procesate ulterior de autoritățile competente, pentru a aduce un semnificativ ajutor în fluidizarea traficului rutier.
Tracking-ul a fost necesar pentru a identifica unic un contur (autovehicul) de la un cadru la altul cu scopul de a calcula cât mai precis numărul de autovehicule care trec într-un anumit sens, implicit și viteza lor de deplasare, într-un anumit interval orar prestabilit.
Odată extrase aceste informații, un sigur pas a mai fost de făcut și anume: stocarea acestora.
Probleme întâmpinate și soluții de rezolvare
Probleme:
Identificarea unui prag optim de segmentare
Unirea contururilor prin umbre
Cuantificarea autovehiculelor și calculul vitezei de deplasare când există mai mult de 1 banda pe sens și trec 2 sau mai multe autovehicule în același timp peste bara marcata de-a latul părții carosabile.
Soluții:
Utilizarea metodei de segmentare OTSU (vezi secțiunea 2.1.2)
Eliminarea umbrelor utilizând spațiul culorilor HSV (vezi capitolul 1 – Transformări RGB-HSV și capitolul 5.3.4)
Tracking pentru identificarea unică a autovehiculelor. În momentul în care un contur trece peste bara definită la stânga sau la dreapta, atunci se realizează cuantificarea autovehiculului respectiv și calculul vitezei lui de deplasare, indiferent de câte autovehicule trec în același timp peste bară, acestea fiind contururi distincte. (vezi capitolul 4.4 si capitolul 5.3.5)
Exemplu care poate furniza probleme în cazul în care nu eliminăm umbrele:
/
Fig. 5.11. Contururi diferite alipite de umbră
/
Fig. 5.12. Contururi diferite alipite de umbră – imaginea binară
5.8 Cazuri excepționale
De-a lungul perioadei de dezvoltare a aplicației de monitorizare a traficului rutier au fost întâmpinate anumite dificultăți, pe lângă cele prezentate anterior la punctual 5.7, precum dificultatea identificării autovehiculelor care au o culoare a caroseriei foarte apropiată de cea a asfaltului.
În etapa de segmentare este foarte dificil de identificat obiectele cu aceeași culoare sau cu culoarea apropiată de cea a background-ului. În acest sens s-a încercat realizarea unei amplificări a fiecărui cadru (nu și a background-ului) cu o anumita valoare presetata pentru a crește intensitatea de culoare și astfel să poată fi o diferență de culoare semnificativă între background și cadru. Acest lucru poate fi util doar în anumite cazuri în care se observa o mica diferență de culoare între cele 2 imagini, dar în cazul în care intensitățile sunt foarte apropiate, chiar identice, atunci nu se poate face nimic în acest sens, iar acel contur nu este identificat după segmentare și deci este ignorat.
Capitolul 6
Rezultate și concluzii
Pentru realizarea acestei aplicații s-a utilizat o baza de date cu 5 filmulețe : 3 utilizând o cameră fixă pe un tronson de drum cu 2 sensuri și cu 2 benzi pe sensul de circulație, orientată perpendicular pe drum și la o distanță relativ mare, de aproximativ 20m, iar celelalte 2 filmulețe, utilizând o cameră fixă pe un tronson de drum cu sens unic și cu 2 benzi pe sensul de circulație, camera fiind fixată la o distanță de aproximativ 4m de asfalt.
Filmulețele au fost făcute în 2 zone diferite și la intervale orare diferite.
Testarea aplicației pe un drum cu sens unic
Pentru testarea aplicației pe drumul cu sens unic, s-a utilizat filmulețul corespunzător, deci cel care conține o secvență video de pe un tronson de drum cu sens unic, la care captarea cadrelor s-a realizat cu o camera fixă mai apropiată de asfalt, ca în următorul exemplu:
/
Fig. 6.1. Autoturismul atinge bara de cuantificare și calcul a vitezei de deplasare
/
Fig. 6.2. Autoturismul trece peste bara de cuantificare și calcul a vitezei de deplasare
Testarea aplicației pe drum cu dublu sens
În urma procesării secvențelor video utilizate pentru testare, s-a obținut următorul rezultat, bazat pe pașii principali ai algoritmului implementat. Cazurile, mai greu de identificat, prezentate în secțiunea 5.8 au fost întâmpinate pe parcursul testării aplicației pe un drum cu dublu sens de circulație.
Conectarea la camera fixa se realizează conform secțiunii 5.3.2.
Inițializare background (Extragerea background-ului dintr-o secvență de 60 de cadre)
/
Fig. 6.3. Backgroundul inițial
Captarea frame-urilor(se realizează captarea frame cu frame cu viteza de captare corespunzătoare camerei: 30fps, 60fps, etc…)
/
Fig. 6.4. Captarea frame-urilor consecutive
Actualizarea background-ului (Extragerea unui nou background când nu se detectează mișcare semnificativă în secvența video)
Eliminarea umbrelor din frame-ul curent (Vezi secțiunea 5.3.4)
/
Fig. 6.5. Frame-ul curent
/
Fig. 6.6. Detecția umbrelor în frame-ul curent
/
Fig. 6.7. Eliminarea umbrei din frame-ul curent
Extragerea foreground-ului
Realizarea diferenței absolute dintre frame-ul curent și background
/
Fig. 6.8. Frameul curent
/
Fig. 6.9 – Background-ul
/
Fig. 6.10 – Diferența absolută dintre background și frame-ul curent
Segmentarea rezultatului obținut în urma diferenței absolute
Segmentarea se realizează în urma pasului anterior, utilizând metoda OTSU pentru a identifica pragul optim de segmentare. Astfel, utilizând pragul returnat de metoda OTSU, se obține următorul rezultat:
/
Fig. 6.11. Conturul rezultat în urma segmentării
Extragerea contururilor autovehiculelor aflate în mișcare
/
Fig. 6.12. Încadrarea autovehiculului(conturului) înaintea eliminării umbrei
/
Fig. 6.13. Încadrarea autovehiculului(conturului) după eliminarea umbrei
Cuantificarea și calculul vitezei de deplasare a autovehiculelor
/
Fig. 6.14. Autoturismul atinge bara, moment în care se începe procedura de cuantificare și de calcul a vitezei de deplasare
/
Fig. 6.15. Autoturismul trece de bară, moment în care se incrementează numărul de autovehicule și se afișează viteza de deplasare
Calculul vitezei medii de deplasare pentru fiecare sens de circulație și salvarea token-ului corespunzător într-un fișier cu extensia .mtr.
6.3 Validarea rezultatelor obținute în urma procesării secvenței video
Pentru interpretarea rezultatelor furnizate de aplicație, s-a realizat un experiment în vederea identificării frecventei de apariție a autovehiculelor.
Experimentul a fost realizat cu ajutorul a 5 filmulețe, relevante, prin înregistrări ale traficului rutier în diferite intervale orare, iar unele chiar în zone diferite.
Nr.Crt.
Nume video
Durata video
Sens
circulație
Autovehicule realitate
Autovehicule identificate
Scor de identificare corectă (%)
1
V1_test
1min
Dublu
10
9
90%
2
V2_test
1min
Dublu
13
11
84.6%
3
V3_test
1min
Unic
4
4
100%
4
V4_test
1min
Unic
6
6
100%
5
V5_test
1min
Dublu
34
28
82.35%
Total
67
58
86.56%
Tabel 6.1. Table informativ – cuantificare autovehicule
/
Grafic 6.1. Grafic care ilustrează diferențele dintre autovehiculele prezente în video și cele identificate corect de către soft
Din acest experiment reiese un scor de identificare corecta de 86.56%, ceea ce este destul de bine având în vedere cazuri excepționale prezentate, și de altfel foarte greu de depistat. De menționat faptul că în niciunul dintre filmulețe nu se detectează fals-pozitive (adică nu se detectează mașini atunci când nu este cazul), care să ducă le eronarea numărului de mașini sau al vitezei medii.
Pentru a valida și rezultatele legate de viteza de deplasare a autovehiculelor și astfel, să obținem gradul de încredere al softului, s-a realizat un experiment practic, care constă în realizarea unei secvențe video care să cuprindă printre cadrele ei și o persoană ce conduce un autoturism pe un tronson de drum. Autoturismul este condus cu o viteză cunoscută.
Experimentul constă în filmarea bordului autoturismului, atașat lângă acesta și un smartphone ce rulează o aplicație de calcul a vitezei reale de deplasare, pe lângă filmarea autoturismului cu o camera fixă, poziționată vertical.
După cum bine se știe, bordul autoturismelor nu indică foarte precis viteza de deplasare.
Majoritatea vitezometrelor au o eroare tolerată de 10%. Aici intră uzura pneurilor, temperatura ambientală, încărcarea automobilului. Există, de asemenea, acorduri internaţionale care au stabilit că viteza indicată de vitezometru nu trebuie să fie niciodată mai mică decât viteza actuală. În acelaşi timp, aceleaşi acorduri spun că viteza indicată nu trebuie să fie mai mare decât 110% plus 4 km/h. De exemplu, la 80 km/h reali, viteza indicată nu trebuie să depăşească 92 km/h.
Regulile Uniunii Europene impun fabricanţilor de vitezometre teste efectuate la 40, 80 şi 120 km/h. Pentru alte categorii de vehiculele, regulile sunt ceva mai relaxate. Camioanele şi autobuzele trebuie să aibă vitezometre ce indică 110% plus 6 km/h, iar scuterele sau alte vehicule pe două sau trei roţi ce au o viteză maximă de 50 km/h trebuie să indice 110% plus 8 km/h. [17i]
Acesta este motivul pentru care s-a ales folosirea unei soluții paralele de calcul a vitezei de deplasare.
Aplicația utilizată este o aplicație free(fără costuri financiare), descărcată de pe magazinul oficial al celor de la Google, Play Store, și se numește GPS Test. Se știe foarte clar ca rezultatele legate de viteza de deplasare, calculate cu ajutorul GPS-ului nu sunt 100% reale, ele fiind aproximate.
Vitezometrul măsoară viteza prin aproximare. Adică, el știe că roata se învârte de 500 de ori pe minut. O anvelopă de 205/55/16 are circumferința (16*2.54+2*55)*3.14 = 162.14 cm. Asta înseamnă, că mașina parcurge 500*1.62 = 810m într-un minut, adică 48.6 km într-o oră. Principala problemă e că circumferința roții nu e niciodată aceea fiindcă anvelopa este totuși elastică. iar circumferința depinde de presiune, temperatura de afară, umiditate, etc. GPS-ul funcționează altfel. El măsoară cu ajutorul satelitului, distanta parcursa de mașină. Chiar daca precizia lui e de 5-10m (pentru modelele comerciale) aceasta reprezintă precizia pentru coordonatele geografice. Distanțele le măsoară mult mai precis (cu precizii de cm). În cazul de sus, mașina parcurge 13.5m într-o secundă. O eroare de 5 cm în plus înseamnă 48.78 km/h față de 48.6km/h. În cazul roții, o dilatare de 1cm se traduce într-o viteză reală de 49.58km/h (cea indicată fiind 48.6km/h). [18i]
Următorul pas al experimentului constă în utilizarea filmulețului, rezultat în urma înregistrării cu camera fixă, ca input la soft-ul realizat, procesarea acestuia și extragerea informației legate de viteza de deplasare a autovehiculelor din cadrele lui.
Ultimul pas se referă la realizarea unui studiu comparativ între viteza de deplasare citită de pe bordul autovehiculului, viteza de deplasare citită de pe aplicația GPS Test și viteza de deplasare calculată de soft-ul de monitorizare a traficului rutier, la același moment de timp. Deși, după cum s-a înțeles că ar exista erori de calcul în fiecare dintre aceste variante, viteza de deplasare ar trebui totuși să conțină valori destul de apropiate.
/
Fig. 6.16. Afișarea vitezei de la bordul autovehiculului și viteza calculată cu aplicația de android
/
Fig. 6.17. Afișarea vitezei calculate de aplicația curentă, Monitorizarea traficului rutier
Următorul grafic evidențiază diferențele dintre cele 3 surse de calcul a vitezei de deplasare a autovehiculelor:
/
Grafic 6.2. Viteza autovehiculelor, calculată cu ajutorul a 3 medii de calcul diferite
Pe baza graficului 6.2 se poate observa că aplicația de monitorizare a traficului rutier care o abatere de -2,56% față de viteza autovehiculului(pe baza informațiilor citite din bord),
iar față de viteza indicată de aplicația android cu GPS, are o abatere de 7,69%.
Concluzii
Pe baza testelor realizate, rezultatele softului de monitorizare a traficului variază în cea mai mare măsură din cauze generate de mediu, luminozitate, distanța de captare a secvenței video, elemente ce pot furniza erori în efectuarea unei segmentări cât mai bune. Rezultatele calculului vitezei de deplasare și de cuantificare a numărului de autovehicule sunt influențate de elementele precizate mai sus, dar aducând anumite îmbunătățiri segmentării și implicit, eliminarea problemelor apărute la segmentare din cauza acestor elemente, pot aduce un aport important în furnizarea unor rezultate cât mai corecte.
Variația rezultatelor legate de cuantificarea numărului de autovehicule, după cum a fost explicată și în subcapitolul 5.9, poate produce ușoare rezultate eronate, precizia acesteia fiind de aproximativ 90%(86.56% mai exact) în cazurile cele mai defavorabile(fixarea camerei la o distanța foarte mare, iluminare slaba sau abundentă, etc.). În cazurile cele mai favorabile (camera fixă foarte aproape de autovehicule), identificarea autovehiculelor are o rată de succes de 100%.
Variația rezultatelor legate de calculul vitezei de deplasare a autovehiculelor, după cum a fost explicată și în subcapitolul 5.9, furnizează deseori rezultate variabile, rezultate care variază până la o eroare de 10% , față de rezultatele furnizate de celelalte două medii de calcul și anume, vitezometrul de la bordul autovehiculului și aplicația de android numită GPS Test.
În cazul prezentat în graficul 5.2 se observă foarte ușor că diferențele furnizate de cele 3 medii sunt destul de apropiate, dar acolo este prezentat doar un caz. Experimentul a fost realizat pe baza unei secvențe video ce conține mai multe dintre variațiile vitezei calculate de către soft față de cele calculate de vitezometrul de la bordul autovehiculului și de aplicația de pe android(smartphone). Oricum, scopul aplicației este să furnizeze informații legate de viteza medie și deci, viteza medie urmează a fi stocată în vederea prelucrării ulterioare a acesteia; așa că prin calculul mediei se vor compensa valorile vitezei prea ridicate cu cele prea scăzute. Astfel, în urma testelor, se poate afirma că rezultatele sunt satisfăcătoare în acest context.
Se poate concluziona, deci, că aceste rezultate furnizate de aplicație ar putea fi utilizate cu succes de către autoritățile competente în vederea fluidizării traficului rutier, oferind o soluție ieftină, sigură, cu grad ridicat de încredere în rezultatele furnizate, care să ofere autorităților informațiile necesare luării unor decizii rapide și eficiente pentru fluidizarea traficului rutier, rezolvând astfel, atât problemele noastre ca cetățeni care utilizăm mijloacele de transport în comun, cât și problema șoferilor sau a conducătorilor auto, de a nu mai pierde timp util la cozi interminabile sau în blocaje nedorite. De altfel, se pot aduce noi îmbunătățiri sau noi caracteristici de dezvoltat în vederea rezolvării și a altor probleme, pe lângă cele prezentate, aplicația fiind dezvoltată astfel încât să permită acest lucru.
Bibliografie
Rafael C. Gonzalez, Richard E. Woods, “Digital Image Processing”, 2002 by Prentice-Hall, ISBN 0-201-18075-8
C. Neghină, A. Sultana, M. Neghină, “MATLAB. Un prim pas spre cercetare”, Editura Universității “Lucian Blaga”, ISBN: ISBN 978-606-12-1213-2, Sibiu, 2016
http://depositphotos.com/stock-footage/car.html
N. Otsu, “A Threshold Selection Method from Gray-Level Histograms”, IEEE Transactions on Systems, Man, and Cybernetics, Vol. 9, No. 1, pp. 62-66, 1979
M. Ivanovici, „Prelucrarea Imaginilor", notite de curs, 2000-2001.
C-tin. Vertan, „Prelucrarea si Analiza Imaginilor", slide-uri curs, 2007-2008.
M. Ivanovici, „Prelucrarea Imaginilor", slide-uri curs, 2008-2009.
C-tin. Vertan, „Prelucrarea si Analiza Imaginilor", 1999.
Internet :
http://www.livetraffic.ro/utile/amplasare-radare-camere-dn1.php
Când vor funcţiona radarele fixe de pe DN 1? Răspunsul Poliţiei Române
R.Brehar, ”Procesarea imaginilor – Laborator 2”, http://users.utcluj.ro/~raluca/ip_2014/PI-L2r.pdf
Gellert, R. Brad, ” Procesarea Imaginilor – Aplicaţii”, http://webspace.ulbsibiu.ro/arpad.gellert/html/PI.pdf
http://www.shervinemami.info/colorConversion.html
http://www.miv.ro/ro/documentatie/pi/PIlab10.pdf [5],[6],[7],[8]
http://www.math.tau.ac.il/~turkel/notes/otsu.pdf
R. Gabriel Danescu, ”Procesarea imaginilor – Curs 6: Procesarea imaginilor de intensitate.Prelucrări bazate pe histogramă”, http://users.utcluj.ro/~rdanescu/pi_c06.pdf
http://alpha.imag.pub.ro/ro/cursuri/archive/ai_curs7.pdf
http://alpha.imag.pub.ro/~bionescu/index_files/TAPAI_BIonescu_M7.pdf
http://docs.opencv.org/3.0-beta/modules/videoio/doc/reading_and_writing_video.html
http://docs.opencv.org/master/db/d64/tutorial_load_save_image.html#gsc.tab=0
http://docs.opencv.org/3.1.0/d1/dc5/tutorial_background_subtraction.html#gsc.tab=0
http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html
http://andrei.clubcisco.ro/cursuri/f/f-sym/5master/analiza-extragerea-continutului/6_Algoritmi%20generali%20de%20binarizare.%20P-tile%20thresholding.%20Optimal%20thresholding.pdf
http://www.automarket.ro/stiri/feature-de-ce-te-pacaleste-vitezometrul-40791.html
https://www.dfki.de/web
C. VERTAN, „Laboratorul de analiza și prelucrarea imaginilor” – http://imag.pub.ro/ro/cursuri/archive/color.pdf
https://en.wikipedia.org/wiki/HSL_and_HSV
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: V14 Proiect De Diploma Draghici Ciprian [305782] (ID: 305782)
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.
