Tabla Interactiva
LUCRARE DE DIPLOMĂ
Cv Board – Tablă interactivă
Cuprins
Capitolul 1 – Introducere
1.1 Analiza studiului actual al temei
1.2 Structura documentului
Capitolul 2 – Fundamentare teoretică
2.1 Viziunea artificială și Prelucrarea Imaginilor
2.1.1 Structura unui sistem de prelucrarea și analiza imaginilor
2.1.2 Imaginile digitale
2.1.3 Eșantionarea și cuantizarea imaginilor
2.1.4 Zgomotul în imagini
2.2 Operații de prelucrare și analiză asupra imaginilor
2.2.1 Introducere
2.2.2 Tipuri de operații de prelucrare și analiză asupra imaginilor
2.2.3 Binarizarea imaginilor
2.3 Imaginile color
2.3.1 Modele de culoare
2.3.2 Modelul RGB
2.3.4 Modelul HSV
2.3.4 Conversia culorii din modelul RGB în modelul HSV
2.3.5 Conversia imaginii din modelul HSV în modelul RGB
2.4 Librăria OpenCV. Arhitectura și facilitățile oferite de aceasta
Capitolul 3 – Proiectarea sistemului
3.1 Cerințe
3.2 Arhitectura sistemului
3.2.1 Modelarea statică a sistemului
3.2.2 Modelarea dinamică a sistemului
Capitolul 4 – Implementarea sistemului
4.1 Implementarea părții hardware a sistemului
4.2 Instalarea bibliotecii OpenCV și configurarea proiectului software
4.3 Implementarea părții software a sistemului
4.4 Implementarea interfeței aplicației
4.5 Determinarea parametrilor HSV ai pointerului
4.6 Analiza și performanța aplicației software
Capitolul 5 – Rezultate și concluzii
5.1 Posibilități de dezvoltare
Bibliografie
Capitolul 1 – Introducere
Lucrarea de față își propune, pe baza tehnologiilor existente la ora actuală, să facă un studiu asupra implementării unui sistem didactic de predare, este vorba despre o tablă didactică interactivă, care pentru a fi realizată are nevoie de următoarele elemente: o cameră web, un videoproiector convențional, un spot led și un sistem de calcul în care este instalat ca IDE Visual Studio si librăria OpenCV. Asupra acestor elemente, a detaliilor de proiectare și implementare se va detalia în capitolele următoare.
Premisa de la care a pornit această idee este aceea de a veni in sprijinul studenților cât și a cadrelor didactice de a trece la o tehnologie de învățare modernă, una mult mai intuitivă și mult mai atractivă decât tehnologiile clasice de învățare.
Spre deosebire de celelalte produse asemănătoare de pe piață, acest sistem este unul mai puțin costisitor, unul mai flexibil și mai ușor de implementat, se poate personaliza și are un grad de portabilitate ridicat, deoarece nu are nevoie efectiv de suportul fizic pentru scris.
Principalul dezavantaj al acestui sistem este acela că se comportă diferit in funcție de condițiile de luminozitate din încăperea în care se află, deoarece sistemul a fost proiectat pentru detectarea gradului de luminozitate a spotului led de pe porțiunea unde se proiectează (tablă), iar o fluctuație a luminozității din încăpere ar putea perturba întregul proces de detecție a acestuia.
De asemenea, lucrarea va aborda și aspectele teoretice care să vină in sprijinul acestei idei, se vor trata parți teoretice din domeniul Viziunii Artificiale și a Prelucrării Imaginilor, se va face o scurta prezentare a librăriei OpenCV cât și a etapelor implementării efective a acestui produs.
Analiza studiului actual al temei
Dacă în urmă cu ceva timp noțiunea de Viziune Artificială (Computer Vision) era o ramură mai exotică a Informaticii și a Științei Calculatoarelor (Computer Science), astăzi acest domeniu are o gamă largă de răspândire și aplicabilitate în diferite domenii. O serie de aplicații ce au la bază noțiuni și aspecte derivate din domeniul Prelucrării Imaginilor și a Viziunii Artificiale își au implementarea în viața cotidiană.
Astfel, vedem în ultima vreme o adevărată “revoluție” a celor două domenii amintite anterior prin prisma dezvoltării a numeroase dispozitive și echipamente ce folosesc aceste tehnologii. Numeroase exemple pot fi întâlnite mai ales la dispozitivele mobile (smartphone-uri) care au început să implementeze aplicații de recunoaștere faciala, în industria jocurilor video, unde odată cu lansarea dispozitivului Kinect a celor de la Microsoft pentru seria de console Xbox, experiența utilizatorului a trecut la un alt nivel [1].
Fig. 1 – Senzorul Kinect al consolei de jocuri video Xbox 720 [18]
În industria aero-spațială observăm o importanță deosebită a aplicațiilor de acest gen în sistemul de ghidare, poziționare și navigare a numeroșilor roboți trimiși la milioane de kilometrii depărtare [2]. Un alt domeniu în care se folosește astfel de tehnologii este cel militar, aici vedem numeroase sisteme ce înglobează o serie de aplicații sofisticate, de la sisteme de detectare de soldați inamici până la sisteme de ghidare a rachetelor și a sateliților militari [3].În medicina, posibilitatea de a explora noi modalități de imagistică, vor duce la noi descoperiri anatomice sau funcționale precum și la depistarea și combaterea unor boli existente precum cancerul [4].Astfel de exemple pot continua însă nu fac parte din obiectul studiului pe care această lucrare și-o propune.
Fig. 2 – Roverul “Rocky 8”, un rover de cercetare, dotat cu un sistem special de ghidare [2]
În contextul în care in această perioadă se pune accentul pe așa zisul concept de “digitalizare” a instituțiilor de învățământ din România prin implementarea la nivel național al manualelor digitale și prin lansarea altor programe pilot de acest gen [5], lucrarea de față abordează un astfel de subiect din aceasta sferă, cel al implementării unui sistem de predare didactic care sa fie ușor de instalat și cu costuri puține.
În momentul de față, în domeniul dezvoltării și proiectării tablelor didactice interactive, piața este dominată de compania Smarttech, cu produsul lor SMART Board, un produs de care și Universitatea “Petru Maior” din Târgu Mureș beneficiază. Tabla oferă o serie de facilități precum multitouch, touch gesture, utilizarea stylus pen, tehnologie cu LED-uri infraroșu, consum redus de energie prin alimentarea prin USB precum și compatibilitate cu diferite sisteme de operare [6].
Fig. 3 – Tabla interactivă SMART Board a celor de la Smarttech [19]
Pe lângă compania Smarttech, mai exista o serie de competitori cu produse și soluții asemănătoare, însă deocamdată aceștia nu au reușit să ajungă la nivelul primilor. În ultima vreme se observă o nouă tendință în dezvoltarea acestor dispozitive prin folosirea unor tehnologii mai puțin costisitoare care să reducă prețul final al produsului finit. Se pune accentul pe utilizarea unor biblioteci software ca OpenCV și a unor tipuri de senzori precum senzorul „Kinect” dezvoltat de Microsoft sau „Nintendo Wii Remote” dezvoltat de cei de la Nintendo.
Au apărut o serie de astfel de încercări, unele mai reușite, altele mai puțin, însă un lucru e cert, acela că pe parcursul timpului o să apară tot mai multe astfel de proiecte.
Fig. 4 – Monitor LCD convențional transformat in dispozitiv touchscreen folosind tehnologia OpenCV și senzorul Nintendo Wii Remote(sursa: youtube.com)
Structura documentului
Primul capitol prezintă câteva noțiuni introductive referitoare la problema dată, scopul lucrării cât și analiza stadiului actual al temei.
Capitolul 2 prezintă fundamentarea teoretică a problemei prin expunerea catorva noțiuni fundamentale ce țin de Viziunea Artificiala și Prelucrarea Imaginilor. Se continuă cu descrierea unui sistem de prelucrare și analiză a imaginilor, prezentarea imaginilor digitale, a operațiilor ce se pot efectua asupra acestora, binarizarea imaginilor, imaginile color (RGB și HSV) precum și trecerea din sistemul RGB in HSV si invers. De asemenea se va trata și câteva aspecte referitor la librăria OpenCV si facilitațiile oferite de aceasta.
Capitolul 3 este dedicat proiectării sistemului și începe cu formularea cerințelor și prezentarea arhitecturii generale a sistemului. Se identifică componentele sistemului și se prezintă rolul acestora. Urmează prezentarea functionalitatii sistemului, a fluxului de date ale sistemului precum și metodologia de proiectare a acestuia.
In Capitolul 4 sunt tratate aspecte ale implementarii efective a sistemului, se vor prezenta tehnologiile folosite, etape de implementare, structura codului sursa, a funcțiilor folosite si altele.
Capitolul 5 se axează pe partea experimentală a proiectului, se vor descrie principalele rezultate obținute, se vor preciza problemele întâmpinate in implementarea sistemului si rezolvarea lor dacă s-a reusit acolo unde a fost cazul.
În finalul documentului vor fi prezentate concluziile acestuia proiect cât și referințele bibliografice.
Capitolul 2 – Fundamentare teoretică
2.1 Viziunea artificială și Prelucrarea Imaginilor
În literatura de specialitate, termenul de Viziune Artificială (Computer Vision) se referă la un domeniu complex care include numeroase tehnici și metode pentru achiziția, prelucrarea și analiza imaginilor sau a cadrelor video din mediul exterior. Scopul acestuia este acela de a reda cât mai fidel efectul vizual uman de a percepe și înțelege de către sistemul de calcul a imaginii pe cale electronică și numerică, de fapt preia date de la un aparat foto sau video și le transformă într-o decizie sau o nouă reprezentare.
Există o serie de alte discipline înrudite cu Viziunea Artificială sau care au puncte comune de studiu cu aceasta, precum Inteligența Artificiala(Artificial intelligence), Recunoașterea Formelor(Pattern recognițion), Prelucrarea Semnalelor, Senzorii, Optica ș.a.m.d. însă cele mai apropiate de acest domeniu sunt Prelucrarea Imaginilor și Viziunea Calculatoarelor(Machine Vision).
„Prelucrarea și analiza imaginilor (numită adeseori prescurtat doar Prelucrarea Imaginilor) s-a născut datorită ideii și necesității de a înlocui observatorul uman printr-o mașină. Este important de precizat că analiza imaginilor a mers mai departe decât simpla înlocuire a observatorului uman, deoarece au apărut soluții inovatoare pentru probleme cu care acesta nu mai fusese confruntat – ca în cazul imaginilor non-vizibile (imagini acustice, ultrasonore, radar)”[7].
Există trei tipuri de procese computerizate de prelucrare în domeniul Prelucrării Imaginilor: procese de nivel jos, mediu și înalt. Procesele de nivel jos implică operații primitive cum ar fi cele pentru: reducerea zgomotelor, îmbunătățirea contrastului și accentuarea contururilor dintr-o imagine. Un proces de nivel jos este caracterizat de faptul că atât intrarea cât și ieșirea sunt imagini. Un proces de nivel mediu implică operații ca segmentarea (partiționarea unei imagini în regiuni sau obiecte), descrierea obiectelor dintr-o imagine. Un proces de nivel înalt poate fi descris de “generarea sensului”, efectuarea funcțiilor cognitive [9].
2.1.1 Structura unui sistem de prelucrarea și analiza imaginilor
Un sistem de prelucrarea și analiza imaginilor este de obicei structurat din punct de vedere al funcționalității dintr-un număr relativ redus de blocuri. Sistemul de formare a imaginii în general este format din sistemul de lentile al camerelor de luat vederi și are rolul de a strânge radiația electromagnetică a obiectului studiat pentru a forma imaginea trăsăturilor de interes. Împreună cu convertorul de radiație formează senzorul, acesta având rolul de a realiza o proiecție plană (bidimensională) a scenei reale (este de obicei una tridimensională) [9].
Fig. 5 – Schema generală a unui sistem de prelucrare și analiză a imaginilor [7]
Sistemul de achiziție(echivalent unui frame-grabber sau video-blaster) convertește semnalul electric al senzorului într-o imagine digitală, pe care o stocheză, acesta nu este altceva decât un dispozitiv de eșantionare (discretizare a suportului imaginii) și cuantizare (discretizare a domeniului de valori a imaginii). Sistemul de prelucrare este în mod tipic un calculator, fie nivel jos implică operații primitive cum ar fi cele pentru: reducerea zgomotelor, îmbunătățirea contrastului și accentuarea contururilor dintr-o imagine. Un proces de nivel jos este caracterizat de faptul că atât intrarea cât și ieșirea sunt imagini. Un proces de nivel mediu implică operații ca segmentarea (partiționarea unei imagini în regiuni sau obiecte), descrierea obiectelor dintr-o imagine. Un proces de nivel înalt poate fi descris de “generarea sensului”, efectuarea funcțiilor cognitive [9].
2.1.1 Structura unui sistem de prelucrarea și analiza imaginilor
Un sistem de prelucrarea și analiza imaginilor este de obicei structurat din punct de vedere al funcționalității dintr-un număr relativ redus de blocuri. Sistemul de formare a imaginii în general este format din sistemul de lentile al camerelor de luat vederi și are rolul de a strânge radiația electromagnetică a obiectului studiat pentru a forma imaginea trăsăturilor de interes. Împreună cu convertorul de radiație formează senzorul, acesta având rolul de a realiza o proiecție plană (bidimensională) a scenei reale (este de obicei una tridimensională) [9].
Fig. 5 – Schema generală a unui sistem de prelucrare și analiză a imaginilor [7]
Sistemul de achiziție(echivalent unui frame-grabber sau video-blaster) convertește semnalul electric al senzorului într-o imagine digitală, pe care o stocheză, acesta nu este altceva decât un dispozitiv de eșantionare (discretizare a suportului imaginii) și cuantizare (discretizare a domeniului de valori a imaginii). Sistemul de prelucrare este în mod tipic un calculator, fie el PC sau stație de lucru. În această categorie se încadrează însă și unele mașini specializate de calcul, calculatoarele de proces, etc. Software-ul specializat implementează algoritmii de prelucrare și analiză [7].
2.1.2 Imaginile digitale
Întru-un sistem de prelucrare si analiză a imaginilor ca cel descris anterior, sistemul de calcul sau computerul primește de la aparatul de fotografiat sau video o grilă de numere, deseori sub formă bidimensională de matrice, ca în figura de mai jos.
Fig. 6 – Pentru un sistem de calcul, oglinda laterală a mașinii nu reprezintă decât o grilă de numere [15]
Deseori, o imagine se poate defini ca fiind o funcție de tip bi-dimensională f(x,y), unde x și y nu sunt altceva decât coordonatele spațiale iar f – amplitudinea, aceasta mai fiind numită și intensitate sau nivel de gri în acel punct. Când valorile x, y și f sunt finite și discrete, imaginea este numită imagine digitală. Fiecare element de imagine poartă numele de pixel (cuvânt preluat din limba engleză, provine de la picture element) [8].
Funcția de mai sus descrie modelul matematic discret al imaginii, cel utilizat in practică unde funcția f ia valori discrete, fiind definită pe un domeniu de valori discrete.
Trecerea de la domeniul continuu la domeniul discret se face prin eșantionare și cuantizare.
După tipul datelor din aceasta structură bidimensională, imaginile prelucrate pot fi împărțite in mai multe categorii:
Imagini scalare, în care fiecare componentă este un scalar(un număr unic), ca exemple de astfel de imagini se pot da imaginile monocrome în care punctele au doar două valori posibile ce corespund unui conținut binar al imaginii, în general alb-negru cât și imaginile cu nivele de gri de tipul imaginii de luminanță de pe ecranele televizoarelor alb-negru.
Imagini vectoriale, în care fiecare componentă este un vector de numere, un exemplu particular este cel al imaginilor color, în care vectorul are trei elemente ce corespund celor trei constituente de bază ale oricărei culori. Tot în categoria imaginilor vectoriale intră și imaginile stereo, o pereche de imagini ale aceleiași scene, luate din unghiuri diferite cât și secvențele de imagini.
După natura lor, imaginile pot fi clasificate ca imagini abstracte, imagini non-vizibile și imagini vizibile. Imaginile abstracte sau modelele sunt de fapt funcții (matematice), continue sau discrete, de două variabile. Imaginile non-vizibile, care, evident, nu pot fi percepute în mod direct de ochiul uman, sunt de fapt achiziții ale unor câmpuri bidimensionale de parametri fizici (presiune, temperatură, presiune, densitate, …). În fine, imaginile ce pot fi percepute în mod direct de către ochiul uman (deci imaginile vizibile) sunt la rândul lor imagini optice, generate ca distribuții de intensitate luminoasă (așa ca hologramele, imaginile de interferență și difracție) sau imagini propriu-zise (de luminanță – în sensul curent al termenului, ce se referă la fotografii, desene, picturi, schițe, scheme și altele din aceeași categorie) [9].
2.1.3 Eșantionarea și cuantizarea imaginilor
Pentru a putea prelucra cu ajutorul unui dispozitiv de calcul o imagine de tipul f(x,y), aceasta trebuie discretizată spațial și în amplitudine. Discretizarea coordonatelor spațiale (x,y) poartă numele de eșantionare.
Eșantionarea reprezintă astfel acel proces de aproximare a unei imagini continue f(x,y) cu o matrice de dimensiune m x n de tipul:
Cuantizarea este procesul de discretizare a valorilor funcției f(x,y). Aceasta se realizează de obicei cu ajutorul unei funcții de tip scara, de forma celei din Figura 7. Astfel, tuturor valorilor lui x dintr-un interval li se atribuite valori discrete k. Cuantizarea este un proces însoțit de zgomot, cunoscut sub numele de eroare de cuantizare. Cea mai utilizată metodă de cuantizare este cea uniformă, ceea ce înseamnă că intervalele funcției de cuantizare sunt egale[10].
Fig. 7 – Exemplu de funcție de cuantizare [10]
2.1.4 Zgomotul în imagini
Zgomotul este un semnal aleator, care afectează informația utilă conținută într-o imagine. El poate apare de-a lungul unui lanț de transmisiune, sau prin codarea și decodarea imaginii și reprezintă un element perturbator nedorit. De obicei se încearcă eliminarea lui prin diverse metode de filtrare.
Zgomotul se poate suprapune informației utile în două moduri:
Aditiv, În acest caz, zgomotul se numește zgomot aditiv și matematic se poate scrie:
Multiplicativ. În acest caz zgomotul se numește zgomot multiplicativ, iar fenomenul de suprapunere al acestuia peste informația utilă se scrie matematic astfel:
unde f(x,y), n(x,y) ¸si g(x,y) au aceleași semnificații ca mai sus.
Cantitativ, se poate aprecia măsura în care zgomotul a afectat informația utilă, calculând raportul semnal-zgomot(SNR = (engl.) Signal Noise Ratio):
Fig. 8 – Modelul aditiv de degradare
2.2 Operații de prelucrare și analiză asupra imaginilor
2.2.1 Introducere
Sistemul software al unității de calcul este responsabil cu realizarea efectivă a unei sarcini concrete, acesta poate fi descompus în mai multe module, nu neapărat bine separate sau prezente împreună. Astfel distingem tehnici de îmbunătățire a imaginilor, de restaurare a acestora, de compresie și de segmentare.
Îmbunătățirea imaginilor are ca scop accentuarea anumitor trăsături(ale obiectelor conținute in imagine) pentru ușurarea unor sarcini ulterioare de analiză automată sau interpretare prin afișare. Asemenea metode pot fi utile la extragerea trăsăturilor caracteristice ale obiectelor, eliminarea zgomotelor suprapuse imaginii, mărirea confortului vizual. Acești algoritmi nu măresc conținutul informațional al imaginii și sunt în general interactivi și puternic dependenți de aplicație.
Restaurarea imaginilor se referă la eliminarea sau minimizarea efectelor unor perturbații¸ si a unor degradări. Perturbațiile reprezintă în general zgomotele (modelate ca procese aleatoare) ce se suprapun în cursul achiziției imaginii (din cauza senzorului și a lanțului de transmisiune și captare); degradările sunt cauzate de imperfecțiunile și limitările deterministe ale senzorului (efecte de apertură, timp de expunere, deficiențe geometrice ale sistemului de lentile, etc.).
Compresia imaginilor se referă la reducerea volumului de date (numărului de biți) cu care este reprezentată imaginea, printr-o transformare reversibilă – imaginea trebuie să poată să fie recuperată integral (sau cu diferențe foarte mici, controlabile) din versiunea sa comprimată.
Segmentarea este procesul de descompunere a unei imagini (sau scene) în elementele (obiectele) sale constituente. Adeseori, segmentarea este strâns legată de algoritmii de analiză, al căror scop este de a realiza măsurători cantitative sau evaluări calitative asupra unor anumite categorii de obiecte, prezente în imaginea dată.
Imaginile digitale pot fi stocate în memoria sau pe discul unui sistem de procesare și analiză a imaginilor, în vederea vizualizării sau prelucrării ulterioare. Pe disc imaginile sunt stocate sub forma unor fișiere. Fișierele pot fi de mai multe feluri, în funcție de formatul în care păstrează datele ce reprezintă imagini: BMP, JPEG, GIF, TIFF, etc. Cel mai simplu format de fișier imagine este Windows Bitmap (BMP) al celor de la Microsoft. Acesta este formatul în care o imagine digitală este stocată practic fără nici un fel de codare sau pierdere de informație, cu excepția reprezentării binare [7].
2.2.2 Tipuri de operații de prelucrare și analiză asupra imaginilor
Pentru realizarea sistemului propus este nevoie de implementarea unor operații de binarizare sau prăguire a imaginii(thresholding). Acestea fac parte din categoria operațiilor de îmbunătățire a imaginilor. Metodele de îmbunătățire a imaginilor în general se împart în doua categorii mari [9]:
Metode de îmbunătățire în domeniul spațial;
Metode de îmbunătățire în domeniul frecvență.
Domeniul spațial se referă la totalitatea pixelilor ce compun o imagine, iar metodele în domeniul spațial sunt proceduri ce operează direct pe acești pixeli.
Metodele de prelucrare în domeniul frecvență se bazează pe modificarea transformatei Fourier a imaginii.
Funcțiile de prelucrare a imaginii în domeniul spațial se pot exprima prin relația:
În formula de fața, f(x,y) este imaginea de intrare; g(x,y) este imaginea prelucrata și T este o funcție de transformare (operator de transformare) definită pe o vecinătate a punctului de coordonate (x,y) din imaginea de intrare.
În funcție de dimensiunea vecinătății vom avea următoarele tipuri de operații (funcții de transformare):
– punctuale – noua valoarea a pixelului curent (valoarea de ieșire a funcției de transformare pentru pixelul de coordonate (x,y)) depinde doar de vechea valoare a pixelului curent;
– locale – noua valoare a pixelului curent este calculată folosind valorile vechi ale pixelului curent și ale pixelilor din vecinătatea lui;
– globale – noua valoare a pixelului curent este dependentă de valorile tuturor pixelilor din imaginea de intrare (imaginea inițială).
Fig. 9 – Tipuri de operații: a) punctuală; b) locală; c) globală [9]
2.2.3 Binarizarea imaginilor
Operațiile punctuale de modificare a contrastului (numite și transformări ale nivelului de gri) sunt asocieri (mapping, în engleză) ce leagă nivelul de gri original (notat cu r) de noua sa valoare (notată cu s). O asemenea asociere nu este altceva decât o funcție:
În (2.8) se stabilesc ca necesare condițiile ca transformarea T să păstreze gama admisibilă de valori ale imaginii (dacă nivelele de gri au fost reprezentate pe L nivele de cuantizare, atunci ,transformarea T să fie monotonă (crescătoare sau descrescătoare) pentru a păstra ordinea între nivelele de gri. În cazul imaginilor cu nivele de gri reprezentate pe un octet valoarea lui L = 256, astfel nivelul minim de gri (negru) are valoare 0 (zero) iar nivelul maxim de gri (alb) are valoare 255 (L-1).
Cea mai des folosită tehnică de modificare liniară a contrastului este o transformare liniară pe porțiuni, dată de:
În formula anterioară, parametrii de control sunt r1, r2, s1 și s2; aceștia sunt grupați câte doi, definind punctele (r1, s1) și (r2, s2). Aceste două puncte de control, împreună cu punctele fixe (0, 0) și (L − 1, L − 1) vor defini cele trei segmente de dreaptă ce apar în formula (2.9).
Fig. 10 – Modificarea lineară a contrastului [9]
Rezultatul aplicării unei asemenea operații punctuale se obține modificând valoarea (nivelul de gri) fiecărui pixel al imaginii inițiale, r, conform (2.9), obținând noul nivel de gri s. Transformarea poate fi făcută în două moduri: fie se repetă calculele de la (2.9) pentru fiecare pixel, baleiind imaginea, fie noile valori ale contrastului se calculează de la început pentru toate nivelele de gri posibile (între 0 și L−1) și apoi aceste modificări se aplică imaginii. În funcție de alegerea celor patru parametri, se pot obține câteva cazuri particulare de interes ce poartă denumiri specifice.
Fig. 11 – Binarizarea (Thresholding) [9]
Dacă r1 = r2, s1 = s2 și s2 = L − 1, se obține binarizarea (“thresholding”). În imaginea rezultată prin aplicarea acestei operații, nu există decât alb și negru, toate nivelele de gri inițiale a căror valoare era mai mică decât r1 fiind negre și toate nivelele de gri inițiale mai mari ca r1 devenind albe.
Fig. 12 – Întinderea contrastului (contrast stretching) [9]
Dacă s1 = 0 și s2 = L − 1 se obține operația de întindere maximă a contrastului (“contrast streching”) pentru intervalul [r1, r2]. Nivelele de gri care se găsesc în afara acestui interval vor fi înlocuite fie cu alb, fie cu negru.
Principalul dezavantaj al tehnicii liniare pe porțiuni prezentate este faptul că modificarea contrastului este aceeași pe un întreg interval de nivele de gri, și nu este posibilă o modificare neuniformă a contrastului pe întregul interval de nivele de gri sau în jurul unui anume nivel de gri.
Fig. 13 – În cadrul aplicației, in fereastra din dreapta se vede efectul de thresholding, atunci când camera web detectează pointerul de culoare roșie
2.3 Imaginile color
Culoarea este senzația vizuală care implică o sursă de lumină, obiecte colorate și ochii observatorului uman. Aceste elemente interacționează unul cu celălalt și produc senzația de culoare.
Ochiul uman simte acest spectru de lumină folosind o combinație de celule de tip conuri și bastonașe. Celulele de tip conuri sunt mai bune pentru vedere în condiții de lumină slabă, dar ele pot simți doar intensitatea luminoasă, pe când bastonașele pot discerne și culorile. Ele funcționează cel mai bine în lumină puternică. Ochiul uman conține 3 tipuri de bastonașe, fiecare dintre ele fiind mai sensibil la lumina cu lungimi de undă diferite; scurt (S), mediu (M) sau lung (L). Setul total de semnale posibile la toate cele trei tipuri de bastonașe, descriu cât de mare este gama de culori pe care le putem percepe.
Culoarea percepută este rezultatul interacțiunii dintre lumină, obiect și observator. Fiecare dintre cele trei componente influențează într-un mod sau altul culoarea. Din punct de vedere fizic spectrul vizual este compus din unde între UV (ultra violet) și IR (infraroșu) adică undeva între 400 și 700 nm [11].
Fig. 14 – Spectrul vizual al culorilor, lungimile de undă a acestora [11]
Utilizarea culorii în domeniul prelucrării imaginilor este motivată de următorii factori principali:
Culoarea este un descriptor puternic care adesea simplifică identificarea și extragerea obiectelor din cadrul unei scene, omul este capabil să deosebească mii de nuanțe și intensități de culoare comparativ cu aproximativ două duzini de nuanțe de gri. Al doilea factor este important în analiza manuală (realizată de specialistul uman) a imaginilor.
Datorită caracteristicilor de absorție ale ochiului uman, culorile sunt percepute ca și combinații variabile ale așa numitelor culori primare: roșu (R, eng. red), verde (G, eng. green) și albastru (B, eng. blue). Prin combinarea culorilor primare se obțin culorile secundare ale luminii: magenta (M = R + G), cyan (C = G + B) și galben (eng. yellow, Y = R + G). Combinarea celor trei culori primare ale luminii sau a unei culori secundare a luminii cu culoarea sa primară opusă se produce culoarea albă (Figura 15a).
Fig. 15-Culorile primare și secundare ale luminii (a) și ale pigmenților pe o hârtie albă (b) [20]
Diferențierea dintre culorile primare ale luminii și culorile primare ale pigmenților sau coloranților este importantă. O culoare primară din ultima categorie este definită ca una ce absoarbe o culoare primară a luminii și reflectă celelalte două culori primare ale luminii. Astfel, culorile primare ale pigmenților sunt magenta, cyan și yellow iar culorile secundare ale pigmenților sunt roșu, verde și albastru. Combinarea celor trei culori primare ale pigmenților sau a unei culori secundare a pigmenților cu culoarea sa primară opusă se produce culoarea neagră (Figura 15b).
Culorile primare ale luminii mai sunt numite și culori primare aditive iar, culorile primare ale pigmenților mai sunt numite culori primare substractive [12].
Culoarea are următoarele atribute importante: nuanță, saturație și strălucire. Toate trei trebuie să fie controlate pentru a reproduce culoarea, ținând cont de definirea lor. Astfel:
Nuanța (Hue) descrie "culoarea" culorii, dacă este roșie, verde, albastră, cyan, magenta, galbenă, etc. Nuanța rezultă din lungimea de undă dominantă a luminii.
Saturația (Saturațion) descrie intensitatea culorii și depărtarea față de gri, putând sa varieze de la tare la slab. Un exemplu pentru schimbarea saturației este adăugarea de pigment în vopsea. Cu cât se adaugă mai mult pigment cu atât crește saturația, neschimbându-se nuanța.
Strălucirea (Brightness) descrie iluminarea culorii putând fi mai închisă sau mai deschisă. De exemplu, un roșu foarte saturat poate fi închis (un vin roșu) sau strălucitor (o floare ex. mușcata).
2.3.1 Modele de culoare
Scopul unui model de culoare (denumit și spațiu de culoare sau sistem de culoare) este de a ușura specificarea culorilor în anumite standarde. În esență, un model de culoare este o specificare a unui sistem de coordonate și a unui subspațiu în care fiecare culoare este reprezentată de un singur punct. Multe din modelele de culoare utilizate în prezent sunt orientate fie, spre hardware (cum sunt culorile monitoarelor și a imprimantelor) fie spre aplicații în care manipularea culorii este un scop (ex. crearea culorilor grafice pentru animații). Deși în prezent sunt utilizate numeroase modele de culoare, în practică, cele mai utilizate modele orientate spre hardware sunt:
– modelul RGB (red, green, blue) pentru monitoarele color și pentru o gamă largă de camere video;
– modelele CMY (cyan = azuriu, magenta = purpuriu (roșu închis spre violet), yellow = galben) și CMYK (cyan, magenta, yellow, black) pentru imprimantele color;
– modelul HSI (hue, saturation, intensity), este modelul care este foarte apropiat de modul uman de descriere și interpretarea a culorii [13].
În realizarea aplicației propuse, pentru ușurință se vor utiliza modelele RGB și HSV pentru captarea și prelucrarea imaginilor video provenite de la camera web.
2.3.2 Modelul RGB
În acest model, fiecare culoare este o combinație de roșu (Red), verde (Green) și albastru (Blue). Acest model se bazează pe sistemul cartezian de coordonate. Subspațiul de culori este un cub, ca in Figura 14. Nuanțele de gri se situează pe diagonala cubului, de la punctul Black (0,0,0) la punctul White (1,1,1), iar culorile sunt puncte pe și in interiorul cubului. Valorile R, G și B au fost normalizate, astfel încât cubul RGB este cubul unitate.
Imaginile color reprezentate RGB sunt alcătuite din trei plane de imagine independente, câte unul pentru fiecare culoare primară. Acest model este folosit în special la monitoare și la camere digitale, acolo unde culorile sunt produse prin emisia simultană a trei surse de lumină: roșie, verde și albastră.
Fig. 16 – Cubul RGB[8]
În cazul Figurii 16 se consideră că valorile celor trei componente RGB sunt normalizate în domeniul [0,1]. Imaginile reprezentate în modelul de culoare RGB constau din trei imagini componente, câte una pentru fiecare culoare primară. Numărul de biți utilizați pentru reprezentarea fiecărui pixel în spațiul RGB poartă numele de adâncimea pixelului. Se consideră o imagine RGB, în care fiecare imagine componentă (în roșu, verde și albastru) este o imagine pe 8 biți (fiecare punct dintr-o astfel de imagine este o valoare pe 8 biți). În acest context, fiecare pixel de culoare RGB (este un triplet de valori (R,G,B)) v-a avea o adâncime de 24 de biți. Termenul de imagine total-color (full-color) este utilizat de obicei pentru a indica o imagine color RGB pe 24 de biți. Numărul total de culori într-o imagine RGB pe 24 de biți este de (28)3 = 16.777.216. În acest caz cubul de culori RGB este cel reprezentat în Figura 17.
Fig. 17 – Cubul RGB PE 24 biți [8]
2.3.4 Modelul HSV
Modelul de față este oarecum derivat din modelul RGB, fiind un model mai aproape de percepția ochiului uman.
Modelul HSV își propune să reprezinte culorile astfel:
Hue (nuanța) se referă la diferitele culori din spectrul vizibil
Saturațion (saturație) se referă la intensitatea unei culori sau, altfel spus, cât de nuanțată este culoarea respectivă.
Value (luminozitatea) se referă la luminozitatea unui culori; altfel spus, discutăm despre cât alb și cât negru se găsește într-o culoare [14].
Modelul HSV a fost formal descris în 1978 de către Alvy Ray Smith, deși noțiunea de a descrie culorile în trei dimensiuni datează din secolul 18.
Modelul HSV este des întâlnit și sub numele de HSB, și HSI, deși între noțiunea de strălucire și intensitate este o diferență.
Modelul HSV este frecvent utilizat în aplicații grafice. În diferite contexte de aplicare, un utilizator trebuie să aleagă o culoare pentru a fi aplicată la un anumit element grafic. Atunci când este utilizată în acest fel, roata de culoare HSV este adesea folosită. În aceasta, nuanța culorii este reprezentată printr-o regiune circulară; separat, o regiune triunghiulară poate fi utilizată pentru a reprezenta saturația și valoarea. În mod obișnuit, axa verticală a triunghiului indică saturația, în timp ce axa orizontală corespunde valorii. În acest fel, o culoare poate fi aleasă culegând prima dată nuanța de culoare de pe regiunea circulară, apoi selectând saturația și valoarea dorită de pe regiunea triunghiulară.
Fig. 18 – Reprezentarea modelului HSV sub forma unui con[21]
O altă metodă de vizualizare a modelului HSV este conul (Figura 18). În această reprezentare, nuanța de culoare este înfățișată ca un complet conic tridimensional al roții de culoare.
Nuanțele sunt reprezentate de unghiul fiecărei culori în con relativ la linia 0°, care este tradițional atribuită la culoarea roșie.
Saturația este reprezentată de distanța de la centrul unei secțiuni circulare transversale a conului, iar valoarea este distanța de la sfârșitul ascuțit, punctual al conului. Culorile foarte saturate sunt pe marginea exterioară a conului, iar cele în tonuri de gri (care nu au nici o saturație) sunt înspre centru.
Valoarea reprezintă luminozitatea culorii și variază cu saturația. Aceasta variază de la 0 la 1, acestea fiind valori normalizate. În cazul în care valoarea este "0" spațiul de culoare va fi complet negru. Odată cu creșterea valorii crește și luminozitatea spațiului de culoare și arată culori diferite. Valoarea „1” nu va arăta culoare albă, ci va arăta cea mai luminoasă culoare posibilă.
2.3.4 Conversia culorii din modelul RGB în modelul HSV
Având o imagine în formatul RGB, componenta V pentru fiecare pixel se obține utilizând relația:
Fie:
Saturația este dată de:
Nuanța se calculează folosind relația:
În cazul relațiilor (2.10÷2.13) s-a considerat că valorile RGB sunt normalizate în intervalul [0,1]. Valorile nuanței pot fi normalizate la intervalul [0,1] prin împărțirea tuturor valorilor obținute cu relația (2.9) la 360º. Celelalte două componente ale modelului HSV au valori în intervalul [0,1].
2.3.5 Conversia imaginii din modelul HSV în modelul RGB
Având valorile componentelor H, S, V, valori normalizate în domeniul [0,1], pentru a obține valori R, G, B folosim următorii pași:
În funcție de I vom avea mai multe cazuri:
Floor(x) reprezintă întregul mai mic sau egal cu x. Doar un singur caz va fi executat în funcție de valoarea lui I, iar expresia (R, G, B) = (X, Y, Z) este echivalentă cu R=X, G=Y, B=Z.
2.4 Librăria OpenCV. Arhitectura și facilitățile oferite de aceasta
În cadrul implementarii produsului (scrierii codului sursă), s-au apelat numeroase funcții ale librăriei OpenCV. OpenCV este o librărie de tip open-source (computer vision
library) scrisă in limbajele de programare C și C++ și care rulează pe platforme ca Linux, Windows și Mac OS X. De asemenea, există o dezvoltare rapida și pe alte platforme și limbaje de programare cum ar fi Python, Ruby, Matlab sau altele.
Fig. 19 – Logo-ul oficial al librăriei OpenCV (http://opencv.org)
OpenCV a fost proiectat pentru a eficientiza puterea computațională a sistemelor de calcul cât și pentru dezvoltarea aplicațiilor în timp real. Unul dintre obiectivele librăriei OpenCV este de a oferi o infrastructură software simplă a viziunii artificiale care să îi ajute pe oameni să construiască aplicații de acest tip destul de sofisticate și cu o implementare rapidă.
La ora actuală, biblioteca conține peste 500 de funcții care se întind pe mai multe zone de interes din viziunea artificială precum imagistică medicală, securitate, interfețe de utilizator, calibrarea camerei, viziune stereo, robotică și altele.
Pentru că viziunea artificială și inteligența artificială sunt ramuri cu multe aspecte comune, OpenCV conține de asemenea o librărie specializată de acest gen (Machine Learning Library sau MLL) [15].
OpenCV are o structură modulară, ceea ce înseamnă că pachetul include mai multe biblioteci partajate sau statice. Cele mai importante module sunt:
core – un modul compact care definește structuri de date de bază, inclusiv matricea multidimensională Mat și funcțiile de bază utilizate de toate celelalte module.
imgproc – un modul de procesare a imaginii, care include filtre liniare și non-liniare, transformări de imagini geometrice(redimensionări, deformări de perspectivă), conversie de spațiu de culori, histograme și altele.
video – un modul de analiză video care include estimări de mișcare și algoritmi de urmărire a obiectelor.
calib3d – include algoritmi de bază pentru vizualizare geometrică, calibrare unică și stereo a camerei, algoritmi de estimare a poziției obiectelor precum și elemente de reconstrucție 3D.
features2d – include caracteristici de detecție, precum și numeroși descriptori.
objdetect – se ocupă de detectarea obiectelor și are o mulțime de clase predefinite(detectarea feței, a ochilor, a mașinilor din trafic, etc.)
highgui – o interfață ușor de utilizat pentru captura video și de imagine.
gpu – algoritmi pentru partea de GPU [16].
Asupra instalării și configurării librăriei OpenCV precum și a utilizării anumitor funcții din aceste module utilizate în cadrul proiectului se vor detalia mai multe în capitolele în care se va aborda proiectarea și implementarea sistemului.
Capitolul 3 – Proiectarea sistemului
3.1 Cerințe
Se consideră un sistem de calcul (partea centrală a sistemului propus) la care se conectează două periferice, o camera web și un videoproiector convențional.. Comunicarea cu aceste dispozitive se va face în timp real, astfel odată lansată aplicația, camera web va capta pointerul de culoare roșie de pe suprafața de pe care se proiectează (de regulă un perete alb) iar videoproiectorul va suprapune peste aceeași suprafața o fereastră care reprezintă tabla virtuală. Mișcarea pointerului pe această suprafață în interiorul ferestrei (tablei virtuale), în urma procesării de către aplicație a datelor provenite de la camera web, va face sa creeze “o dâră” asemănătoare celei lăsate de o cretă sau oricărui alt instrument de scris.
Fig. 20 – Componentele sistemului și principiul de funcționare a acestuia. Obiectele numerotate pe figură reprezintă, în ordinea următoare: 1)Sistemul de calcul;
2) Camera web; 3) Videoproiectorul; 4) Tabla fizică (peretele);
Camera web va capta tot ceea ce se găsește pe suprafața tablei. Dacă aceasta este complet albă atunci nu va capta decât punctul roșu făcut de pointerul led. Imaginea astfel captată va fi transmisă unității de calcul și implicit aplicației. Aceasta, în urma operației de prăguire (thresholding) va elimina pixelii diferiți de culoarea roșie. Va rezulta o imagine binarizată, care va fi suport pentru crearea imaginii în care va fi desenată „dâra” (traiectoria) acelui punct de pe imaginea binarizată.
3.2 Arhitectura sistemului
3.2.1 Modelarea statică a sistemului
Sistemul dezvoltat este realizat prin folosirea unor periferice în care se individualizează ca și componentă centrală unitatea de calcul. În acest model, în componenta centrală se găsește aplicația care va iniția toate comunicațiile iar perifericul va comunica cu aceasta numai dacă a fost inițiată o comunicare pentru această entitate. Avem deci o componentă centrală reprezentată de sistemul de calcul (calculator) și două componente auxiliare sau periferice (camera web și videoproiectorul). Comunicarea între periferice și sistemul de calcul este una bidirecțională, după cum se vede în Figura 21.
Fig. 21 – Modelul de comunicare între componentele sistemului curent
Pentru a exemplifica și mai bine cele enunțate mai in sus, schema din Figura 21 se poate modela după un model de diagramă UML de tip Deployment. Utilizatorul (actorul) intră in contact cu aplicația prin intermediul executabilului acesteia, proiect_licenta.exe. Aplicația interacționează cu mai multe entități printre care cu blocul OpenCV prin intermediul a trei funcții(librării dinamice) a acestuia (opencv_core249.dll, opencv_highgui249.dll, opencv_imgproc249.dll). De asemenea, blocul aplicației va comunica cu perifericele(camera web și videoproiectorul) și va scrie pe hard-disk (va salva) sub forma unui fișier de tip jpg o captură a “tablei virtuale”.
Fig. 22 – Diagrama UML de tip deployment a sistemului
În cadrul componentei centrale a sistemului (aplicația software sau executabilul),codul sursă este format prin invocarea unor metode sau funcții din librăria OpenCV cât și a unora din cadrul platformei Visual Studio. Pe lângă acestea, executabilul mai conține și alte fișiere precum fișiere de tip obiect, manifest sau de linkeditare. În Figura 23 este evidențiată structura aplicației software propuse sau a codului sursă prin folosirea instrumentului de Code Map din cadrul platformei Visual Studio 2013. Astfel în cadrul executabilului (proiect_licenta.exe) care e marcat aici de culoarea verde deschis, se evidențiază spațiul de nume (namespace std) de culoare albastră, în interiorul căruia se găsesc doua metode(funcții). Funcția ImagineBinarizata are rolul de a face conversia din imaginea de tip RGB provenită de la camera web în una de tip HSV și de a stabili pragurile de detectare a spotului de culoare roșie iar în cadrul funcției main se realizează interfața aplicației, inițializarea capturii, inițializarea ferestrelor aplicației, bucla infinită pentru rularea continua a capturii video. Mai multe aspecte despre realizarea efectivă a implementării structurii și conținutului codului sursă se vor regăsi în Capitolul 4.
Fig. 23 – Structura aplicației (codului sursă), nucleul componentei centrale a sistemului
Din punct de vedere funcțional, aplicația conține următoarele funcții prin care utilizatorul (actorul extern) interacționează cu aceasta, funcțiile fiind accesibile prin intermediul unui meniu.
Acest lucru se redă de obicei prin intermediul unei diagrame de utilizare care prezintă actorii externi și cazurile de utilizare identificate, numai din punctul de vedere al actorilor (care este comportamentul sistemului, așa cum este el perceput de utilizatorii lui) nu și din interior, precum și conexiunile identificate între actori și cazurile de utilizare[17].
Radieră – funcționalitate ce permite ștergerea conținutului din anumite porțiuni de pe fereastra ce afișează tabla virtuală;
Ștergere(Clear) – funcționalitate ce permite ștergerea întregului conținut al tablei virtuale;
Salvare(Captură) – funcționalitate ce permite o captura a întregului conținut a tablei virtuale și salvarea acestuia pe disc sub forma unui fișier de tip jpg;
Roșu, Verde, Albastru – funcționalități ce permit schimbarea culorii lăsate de “dâra” spotului led pe tabla virtuală;
Trackbar – funcționalitate implementată printr-o interfață ce permite reglarea parametrilor HSV a spotului led (pointerului roșu) pentru adaptarea la diferite condiții de lumină;
Exit – prin intermediul acestei funcționalități se iese din bucla continuă și implicit din aplicație.
Fig. 24 – Structura aplicației software bazată pe funcționalitățile acesteia – diagrama use- case
Funcționalitățile descrise mai sus, cu excepția componentei Trackbar, se regăsesc în cadrul meniului din fereastra Cv Board (tabla virtuala) iar toate acestea împreună compun interfața cu utilizatorul (GUI).
3.2.2 Modelarea dinamică a sistemului
Pentru modelarea dinamică a sistemului se folosește de obicei diagrame UML de tip stare(statechart diagram). Acestea sunt utile pentru a descrie fluxul de control de la o stare la alta și a descrie diferite stări ale unui obiect în timpul duratei sale de viață.
Sistemul propus spre implementare se comporta pana la urma ca orice automat, în Figura 25 este exemplificat acest lucru cu ajutorul diagramei UML de stare.
Fig. 25 – Diagrama de stare(activitate) a sistemului propus
După cum se observă, la început aplicația verifică dacă detectează camera web, dacă aceasta nu există sau nu se poate inițializa captura de la ea, atunci se va returna un mesaj de eroare iar aplicația se va închide. Dacă se reușește să se inițializeze captura de la dispozitiv, atunci algoritmul implementat va inițializa ferestrele in care se vor crea mai departe imaginile și frame-urile pentru prelucrare și procesare. De asemenea, tot în această stare se vor inițializa și crea “imaginile” pentru a scrie/desena urma(traiectoria) pointerului, acestea sunt nule inițial.
Din această stare se va trece în starea în care se pregătește frame-ului capturat de la camera web. Aici, cu o metodă specială se citește fișiere video și se captează date decodate iar apoi se returnează un frame. Cu frame-ul realizat in starea precedentă se va intra într-o buclă infinită pentru a rula continuu conținut video (frame-uri) de la camera web spre a fi prelucrate și procesate. Printre cele mai importante metode de prelucrare și procesare aflate în această stare ar fi conversia din sistemul RGB în HSV, prăguirea (thresholding), calcularea momentelor pentru a stabili traiectoria pointerului precum și desenarea efectivă a acestei traiectorii. La începutul intrării in această buclă de tip while , dacă frame-ul nu se poate realiza, atunci se iasă din buclă și implicit din program.
Din starea ce rulează conținut video continuu (bucla while) se mai poate ieși fie prin apăsarea unei taste de la tastatura, fie prin poziționarea pointerului in zona de meniu în care se stabilește ieșirea automata din aplicație.
O altă modalitate de a modela dinamic sistemul este acela de a fi reprezentat printr-o diagrama de secvență, rolul acestor tipuri de diagrame este acela de a modela scenariile posibile și de a prezenta temporal interacțiunile dintre obiecte.
În Figura 26 este reprezentat cât mai minimalist, printr-o astfel de diagramă sistemul curent, cu precizarea că locul obiectelor din conceptul programării orientate-obiect este luat de „obiecte fizice” precum sistemul de calcul, camera web sau videoproiectorul. Acestea se comportă asemănător obiectelor POO întrucât au o durată de viață de funcționare și pot primi mesaje de la celelalte obiecte iar la rândul lor, acestea pot să ofere răspunsuri către celelalte.
Utilizatorul trimite un mesaj prin care solicită sistemului de calcul să pornească aplicația și implicit sistemul să intre în stare de rulare. „Obiectul Sistemul de calcul” este astfel creat și va transmite în succesiunea temporală mesaje către „obiectul camera web”. Cele mai importante mesaje trimise către camera web sunt cvCapture() și cvFlip(). Primul mesaj are rolul de a capta o captura video (frame) de la obiectul camera web iar al doilea mesaj are rolul de a seta modul în care să fie afișat frame-ul pentru a elimina efectul de oglindă pe care îl au majoritatea camerelor web.
„Obiectul camera web” va trimite un mesaj de tip răspuns către obiectul sistem de calcul prin care transmite un frame. Durata de viață a acestui obiect va persista atât timp cât camera web nu va fi deconectată de la sistem sau în cazul în care va apărea o excepție.
Odată primit mesajul de tip răspuns, sistemul de calcul va iniția un mesaj de afișare către un dispozitiv de afișare, care in cazul de față este atât display-ul sistemului de calcul cât și videoproiectorul. Ca și în cazul camerei web, videoproiectorul va funcționa atât timp cât acesta nu va fi decuplat de la sistem și de la alimentarea electrică.
Fig. 26 – Diagrama de secvență a sistemului
Mai trebuie menționat faptul că „obiectul sistemul de calcul” mai trimite un mesaj de tip self message prin care atât timp cat nu se apasă o tastă durata de viață a acestuia nu se va termina.
Un aspect foarte important al modelării dinamice (simulării de funcționare) a sistemului este descrierea acestuia prin intermediul diagramei de tip data flow diagram, aceasta scoțând în evidență fluxul de date care circula prin sistem.
Fig. 27 – Fluxul de date din interiorul sistemului reprezentat printr-o diagrama DFD(Data Flow Diagram)
După cum se observă din figura de mai sus, utilizatorul poate modifica datele parametrilor HSV print intermediul unei mini interfețe (fereastra TrackBar) iar datele modificate de aici vor ajunge la funcția ce se ocupă de binarizarea imaginii (ImagineBinarizata()).
Această funcție returnează o imagine binară ce va fi folosită de funcția IplImage() pentru a crea celelalte tipuri de imagini bazată pe aceasta. Ca și tipuri de imagini create și prelucrate de funcția IplImage() sunt:
ImgDesenare – imagine în care utilizatorul va putea desena prin intermediul pointerului, aceasta va putea fi salvată sub forma unui fișier de tip jpg prin intermediul funcției cvSave(), funcția cvSave() se va activa doar atunci când pointerul se va afla în zona corespunzătoare meniului care activează aceasta funcție;
ImgDesenare_contur – o imagine in care este desenat conturul tablei virtuale, aceasta imagine fiind tot timpul suprapusă peste ImgDesenare.
tablaCurata – o imagine de reinițializare, atunci când utilizatorul dorește sa șteargă tot conținutul, va deplasa pointerul in zona meniului de „Clear sau Ștergere”.
Din funcția cvCreateImage() pe lângă aceste date care au fost enumerate mai sus va ieși imgFrameBinarizata, o imagine in care va fi arătata in urma operației de thresholding poziția pointerului. Toate acestea vor fi trimise mai departe către un dispozitiv de afișare care in cazul nostru este un videoproiector.
Trebuie menționat faptul ca aici entitățile Utilizator, Camera web si Videoproiector au rolul de „External interactor” iar funcțiile amintite nu sunt altceva decât „Data process”. De asemenea entitatea Captura.jpg constituie elementul de „Data store”.
Odată lansată aplicația, după cum se poate vedea în Figura 28 (a), aceasta va rula un singur proces, acesta având mai multe fire de execuție.
Pentru a scoate în evidență acest lucru, cu ajutorul aplicației Process Explorer, care este un utilitar asemănător Task Manager-ului, însă cu mai multe opțiuni de vizualizare a proceselor și firelor de execuție, se poate vedea că de fapt aplicația are nouă fire de execuție asociate procesului aplicației proiect_licenta.exe.
Un alt utilitar de acest gen este utilitarul Process Monitor, acesta oferă pe lângă afișarea detaliată a proceselor și firelor de execuție, detalii referitoare la activitatea proceselor asupra regiștrilor din sistemul de operare Windows, asupra activității fișierelor asociate fiecărui proces, date referitoare la durata de viață a unui proces sau fir de execuție etc. Astfel executabilul proiect_licenta.exe, în utilitarul Process Monitor are asociat id-ul de proces (PID) cu numărul 4288 din care va rezulta nouă fire de execuție. Acestea sunt următoarele, după cum se pot vedea pe Figura 28(b) și Figura 28(c): Thread Id: 7484, 12064, 10772, 6288, 3760, 6316, 8100, 5200, 5400.
Fig. 28 a) – Task-ul proiect_licenta.exe are asociat 9 fire de execuție în utilitarul Process Explorer
Fig. 28 b) – Task-ul proiect_licenta.exe are asociat 9 fire de execuție în utilitarul Process Monitor
Fig. 28 c) – Task-ul proiect_licenta.exe are asociat 9 fire de execuție în utilitarul Process Monitor
Tot cu ajutorul utilitarului Process Monitor se poate vedea la ce fișiere din librăria OpenCV apelează procesul proiect_licentă.exe, acestea sunt opencv_core249.dll, opencv_highgui249.dll și opencv_imgroc249.dll.
Fig. 29 – Fișierele opencv_core249.dll, opencv_highgui249.dll și opencv_imgroc249.dll accesate de executabilul proiect_licenta.exe
Librăria OpenCV este una permisivă atunci când vine vorba de creare de noi fire de execuție, acestea se pot implementa ca oricare fir de execuție scris in limbajul de programare C/C++.
Astfel se poate implementa programarea concurentă prin realizarea unor fire de execuție ce pot rula în paralel, se pot realiza mecanisme de sincronizare între acestea prin diferite modalități (de exemplu semafoare binare sau de tip generalizat) etc.
Capitolul 4 – Implementarea sistemului
Sistemul propus este format din două mari părți, o parte fizică (hardware) în care se evidențiază componentele hardware ca videoproiectorul, camera web, pointerul led și stația de lucru și o parte software (aplicația) în care vor fi descrise componentele software constituente.
Tot în cadrul acestui capitol se vor descrie pașii de configurare a proiectului pentru a putea accesa funcțiile librăriei OpenCV, se va mai descrie interfața cu utilizatorul precum și celelalte funcționalități adiacente.
4.1 Implementarea părții hardware a sistemului
Pentru implementarea părții hardware a sistemului și funcționarea adecvată a acestuia este nevoie de un pointer led, o cameră web, un videoproiector și un sistem de calcul (computer personal, laptop etc.).
În cadrul propriei implementări am utilizat următoarele dispozitive hardware:
Pointerul led – este unul care are o lungime de undă de 650 nm și o putere de 5 mW. Dimensiunea acestuia este de 55 x 9 mm iar alimentarea este una pe bază de baterii (3 – AG3).
Fig. 30 – Pointerul utilizat in realizarea proiectului
Camera web utilizată este “3MP (Interpolated) USB 2.0 Smart Webcam w/3 LEDs” și este o cameră de 3 mega pixeli pentru formatul video și 1.4 mega pixeli pentru format imagine, o rezoluție de 800 x 600 pixeli la 15 fps sau 320 x 240 la 30 fps, raportul semnal zgomot (S/N ratio) < 45 dB De asemenea formatul video este 24-bit RGB și dispune de senzor de imagine de tip CMOS.
Fig. 31 – Camera web “3MP (Interpolated) USB 2.0 Smart Webcam w/3 LEDs”
Videoproiectorul este unul convențional de la BenQ ce dispune de o rezoluție de 800×600 SVGA și o luminozitate de până la 3000 Lumeni. Nivelul de zgomot poate atinge valoarea de 33 dB iar lampa are o putere de 190 W și o durată de viață de până la 6500 de ore in mod ECO.
Fig. 32 – Videoproiectorul BenQ utilizat in cadrul proiectului
Sistemul de calcul reprezintă acea parte care se ocupă cu prelucrarea și procesarea datelor ce vin de la camera web și afișarea datelor procesate prin intermediul videoproiectorului. Cea mai mare parte a dezvoltării aplicației s-a realizat pe calculatoarele din cadrul laboratoarelor de la facultate, un astfel de dispozitiv, în general are următoarea configurație: Procesor – Intel Core i5 (3.0 GHz), Memorie Ram – 4 GB, IDE – Visual Studio Ultimate 2013, OpenCV 2.4.9.
4.2 Instalarea bibliotecii OpenCV și configurarea proiectului software
Pentru realizarea și implementarea aplicației software se va apela la librăria OpenCV deoarece este o librărie de tip open-source specializată pentru dezvoltarea acestor tipuri de proiecte și are gata implementați o grămadă de algoritmi din domeniul computer vision.
Ca și versiune a librăriei, s-a folosit versiunea 2.4.9 accesibilă de pe site-ul oficial http://opencv.org/. Instalarea se face relativ ușor, programul de instalare practic va dezarhiva pachetul in care se găsește librăria OpenCV în calculator. Implicit aceasta va fi dezarhivată în folderul rădăcina al partiției C (C:\opencv).
Înainte de scrierea efectivă a codului trebuie configurat proiectul din mediul de dezvoltare Visual Studio în care se implementează aplicația pentru a putea permite accesare funcțiilor din OpenCV.
Pentru aceasta, din meniul VIEW al mediului de dezvoltare Visual Studio 2013 se va alege opțiunea Other Windows și apoi Property Manager. În partea dreapta va apărea opțiunea de a vizualiza Property Manager ca în imaginea de mai jos.
Fig. 33 – Adăugarea fișierelor de configurare de tip PropretySheet proiectului, atât pentru modul Debug cât și pentru modul Release
Se vor adăuga câte un fișier de tip de configurare (property sheet) atât pentru modul Debug cât și pentru modul Release.
Pentru modul Debug se va adăuga un fișier nou (PropertySheet_Debug.props.) în care se vor face următoarele setări:
VC++Directories →Executable Directories se va completa cu :
C:\opencv\build\x86\vc12\bin
VC++Directories →Library Directories se va completa cu:
C:\opencv\build\x86\vc12\lib
C/C++ →Additional Include Directories se va completa cu:
C:\opencv\build\include
Linker →Additional Library Directories se va completa cu:
C:\opencv\build\x86\vc12\lib
De asemenea la opțiunea Linker → Input → Additional Dependencies se va completa cu următoarele:
Fig. 34 – Adăugarea fișierelor librărie din biblioteca OpenCV la proiect pentru modul Debug
Analog se va proceda și pentru Release, astfel se va adăuga un fișier nou (PropertySheet_Release.props.) în care se vor face următoarele setări.
VC++Directories →Executable Directories se va completa cu :
C:\opencv\build\x86\vc12\bin
VC++Directories →Library Directories se va completa cu:
C:\opencv\build\x86\vc12\lib
C/C++ →Additional Include Directories se va completa cu:
C:\opencv\build\include
Linker →Additional Library Directories se va completa cu:
C:\opencv\build\x86\vc12\lib
De asemenea la opțiunea Linker → Input → Additional Dependencies se va completa cu următoarele:
Fig. 35 – Adăugarea fișierelor librărie din biblioteca OpenCV la proiect pentru modul Release
4.3 Implementarea părții software a sistemului
Camera web detectează imagini în format RGB din lumea exterioară. Acest tip de format se va converti in format HSV pentru ca frame-urile captate să poată fi prelucrate mai departe de aplicație. Pentru aceasta trebuie să creăm o structură de date de tip IplImage numită imgHSV care va fi folosită mai departe pentru procesul de binarizare(thresholding) .
De asemenea se creează și o structură tot de tip IplImage numită imgBinară care va fi folosita ca și precedenta de funcția cvInRangeS pentru a face efectiv procesul de binarizare a imaginii.
Crearea efectivă a acestor imagini (structuri de tip IplImage) se va realiza prin apelarea funcției cvCreateImage declarată ca „IplImage* cvCreateImage(CvSize size, int depth, int channels)” care va crea un header și va aloca memorie datelor din interiorul acestora.
cvInRangeS(imgHSV, cvScalar(h1, s1, v1), cvScalar(h2, s2, v2), imgBinara);
Funcția cvInRangeS declarată generic “void cvInRangeS(const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst)” în fișierul (header-ul) core_c.h verifică dacă elementele unui vector se află între elementele altor doi vectori. Această funcție poate fi declarată mai generic cvInRanges(sursa, lowerb, upperb, destinatie), unde sursa reprezintă imaginea de tip HSV (imgHSV) iar destinația imaginea de tip binarizată sau prăguită (imgBinară). Pentru pointerul roșu, lowerb și upperb reprezintă capetele intervalului de funcționare în domeniul HSV. Acestea două (lowerb, upperb) sunt la rândul lor 2 structuri de tip cvScalar, cvScalar fiind un tip de structură de tip container ce poate fi alcătuită din 1, 2, 3 sau 4 variabile de tip double.
Valorile pentru h1, s1, v1 respectiv h2, s2, v2 s-au stabilit pe cale experimentală până când s-au ajuns la valorile optime de funcționare pentru detectarea pointerului de culoare roșie. Aceste valori nu reprezintă altceva decât valorile minime și maxime ale nuanței(hue), saturației(saturațion) și luminozității (value) între care culoarea roșie poate fi detectată.
int h1 = 60; int s1 = 1; int v1 = 251;
int h2 = 163; int s2 = 9; int v2 = 255;
Astfel, toate acestea pot fi puse într-o funcție care va returna o imagine binară de tip IplImage care poate fi folosită mai departe în interiorul aplicației. De asemenea, imaginea (structura) imgHSV trebuie dealocată la ieșirea din funcție, acest lucru se face prin funcția cvReleaseImage declarată în OpenCV „void cvReleaseImage(IplImage** image)”. Această funcție șterge practic header-ul imaginii și datele din această structură.
IplImage* ImagineBinarizata(IplImage* img)
{
IplImage* imgHSV = cvCreateImage(cvGetSize(img), 8, 3); cvCvtColor(img, imgHSV, CV_BGR2HSV); IplImage* imgBinara = cvCreateImage(cvGetSize(img), 8, 1);
cvInRangeS(imgHSV, cvScalar(h1, s1, v1), cvScalar(h2, s2, v2), imgBinara);
cvReleaseImage(&imgHSV);
return imgBinara;
}
În programul principal (main) se va inițializa o captură de la camera web prin crearea unui tip de date de tip structură „black box” cvCapture numită generic captura. Prin aceasta verificăm dacă se poate inițializa captura de la dispozitivul periferic (camera web). În cazul în care acest lucru nu se poate realiza, se va returna un mesaj de eroare și se va ieși afară din program.
// Inițializare captura imagine in timp real de la camera web
CvCapture* captura = 0;
captura = cvCaptureFromCAM(0);
// Daca nu se găsește dispozitivul sau nu se poate inițializa captura se // returnează o eroare
if (!captura)
{
printf("Nu se poate inițializa captura!…\n");
return -1;
}
Programul principal se continuă cu inițializarea ferestrelor pe care aplicația le va utiliza precum și crearea interfeței de TrackBar prin care utilizatorul poate regla manual parametrii HSV ai pointerului. De asemenea e nevoie de crearea a 3 tipuri de imagini de tip IplImage care vor „umple” conținutul ferestrelor. Aceste 3 imagini sunt numite imgDesenare, imgDesenare_contur și tablaCurata. Prima e imaginea în care utilizatorul practic va interacționa, este tabla virtuală care va conține meniul și alte elemente. A doua imagine este de fapt o imagine “goală” care are desenat un contur pe marginea ei, imgDesenare_contur se va suprapune peste imgDesenare creânduse impresia ca există doar o imagine. Ultima imagine, tablaCurata este o imagine care se va activa doar atunci când utilizatorul va poziționa pointerul în zona meniului Clear(Ștergere) din prima imagine. Practic, la activarea acestei opțiuni, se va copia aceasta imagine cu conținut gol peste prima imagine.
//inițializarea ferestrelor pe care le vom utiliza
cvNamedWindow("Fereastra_video_camera_web");
cvNamedWindow("Tabla – Cv Board");
cvNamedWindow("Fereastra_imagine_binarizata");
cvNamedWindow("Calibrare_pointer", CV_WINDOW_AUTOSIZE);
//Creare interfață TrackBar pentru calibrarea pointerului in domeniul HSV
cvCreateTrackbar("H1", "Calibrare_pointer", &h1, 255, 0);
cvCreateTrackbar("H2", "Calibrare_pointer", &h2, 255, 0);
cvCreateTrackbar("S1", "Calibrare_pointer", &s1, 255, 0);
cvCreateTrackbar("S2", "Calibrare_pointer", &s2, 255, 0);
cvCreateTrackbar("V1", "Calibrare_pointer", &v1, 255, 0);
cvCreateTrackbar("V2", "Calibrare_pointer", &v2, 255, 0);
// pregătire (inițializare "imagini") pentru a scrie/desena urma(traiectoria) pointerului, acestea sunt nule inițial
IplImage* imgDesenare = NULL;
IplImage* imgDesenare_contur = NULL;
IplImage* tablaCurata = NULL;
Programul are nevoie sa prelucreze frame-uri provenite de la camera web în mod continuu, de aceea se va crea o buclă infinită while pentru acest lucru. În interiorul acestei bucle, prin apelarea funcției cvQueryFrame se pot citi fișiere video sau se pot capta datele decodate de la un periferic precum camera web și se va returna un frame.
…
// pregătirea frame-ului capturat de la camera web
IplImage* frame = 0;
frame = cvQueryFrame(captura);//cvQueryFrame – metoda care citește fișiere video //sau captează date decodate și returnează un frame cu ce se captează.
// Daca nu se poate captura frame-ul… quit , ieșire din program
if (!frame)
break;
…
O problemă des întâlnită la camerele web este aceea , ca multe dintre aceste dispozitive captează frame-uri cu acel efect supărător de oglindă (imagine deseori oglindită, alteori răsturnată). Acest efect se poate combate prin apelarea funcției cvFlip. Această funcție este declarată astfel: „void cvFlip(const CvArr* src, CvArr* dst=NULL, int flip_mode=0 )” , unde la noi atât sursa cât și destinația e frame-ul curent iar valoarea 0 reprezintă flip pe axa x cu valori pozitive iar 1 reprezintă flipping pe axa y pentru valori pozitive.
cvFlip(frame,frame,0);
cvFlip(frame,frame,1);
Aceste două linii de cod se pot comenta daca acest efect nu apare la rularea aplicației, acest lucru este posibil deoarece unele camere web au implementate un mecanism de auto corecție a acestui efect.
Tot în interiorul buclei infinite se vor crea imaginile inițializate anterior(acestea au valoarea NULL inițial) precum și imaginea prăguită prin apelarea funcției create la început.
if (imgDesenare == NULL) // daca imaginea de desenare e "goala" se poate desena //si se creează imaginile
{
imgDesenare = cvCreateImage(cvGetSize(frame), 8, 3);
imgDesenare_contur = cvCreateImage(cvGetSize(frame), 8, 3);
tablaCurata = cvCreateImage(cvGetSize(frame), 8, 3);
CvSize dimensiune = cvGetSize(frame); // preia dimensiunea frame-ului
cvRectangle(imgDesenare_contur, cvPoint(0, 0), cvPoint(dimensiune.width, dimensiune.height), cvScalar(0, 255, 0), 5, 8, 0); //conturul tablei //virtuale
}
// pregatirea imaginii binaritate (roșu = alb, restul = negru)
IplImage* imgFrameBinarizata = ImagineBinarizata(frame);
Odată realizate acestea, mai trebuie să se calculeze momentele pentru determinarea poziției pointerului, desenarea traiectoriei acestuia și afișarea in ferestre. Următoarea secvență de cod redă acest lucru.
// calcularea momentelor pentru determinarea poziției pointerului
CvMoments *momente = (CvMoments*)malloc(sizeof(CvMoments));
cvMoments(imgFrameBinarizata, momente, 1);
// valorile momentelor actuale
double moment10 = cvGetSpatialMoment(momente, 1, 0);
double moment01 = cvGetSpatialMoment(momente, 0, 1);
double area = cvGetCentralMoment(momente, 0, 0);
// calcularea pozitiei anterioare si a celei curente a pointerului
static unsigned int posX = 0;
static unsigned int posY = 0;
int lastX = posX;
int lastY = posY;
posX = moment10 / area;
posY = moment01 / area;
// afisare pozitii in mod consola pentru urmarire si depanare
printf("pozitie curenta a pointerului (x,y): (%d,%d)\n", posX, posY);
// pozitie valida – desenare linie
if (lastX>0 && lastY>0 && posX>0 && posY>0)
{
// Deseneaza o linie roșie (inițializata la început) de la un punct //anterior la cel curent
cvLine(imgDesenare, cvPoint(posX, posY), cvPoint(lastX, lastY), culoare, grosime, CV_AA);
}
// afisare continutul celor 3 ferestre (tabla virtuală, frame-ul video si //frame-ul cu imaginea binarizată)
cvAdd(imgDesenare, imgDesenare_contur, imgDesenare); // suprapunerea imaginii cu contur verde peste imaginea simpla
cvShowImage("Tabla – Cv Board", imgDesenare);
cvShowImage("Fereastra_video_camera_web", frame);
cvShowImage("Fereastra_imagine_binarizata", imgFrameBinarizata);
Din bucla infinită se poate ieși prin apăsarea unei taste de la tastatura, ultimul lucru care se mai face atunci când se va ieși din buclă este ca imaginea (structura) imgFrameBinarizata să fie dealocată.
…
// așteaptă apăsarea unei taste pentru ieșire din program
int c = cvWaitKey(10);
if (c != -1)
{
// daca e apăsata, break out of the loop
break;
}
// eliberare imagine binarizată + momente… eliberare memorie
cvReleaseImage(&imgFrameBinarizata);
delete momente;
} // iesire din bucla infinita
De asemenea după ieșirea din bucla infinită se va dealoca și captura (frame-ul) provenit de la camera web.
…
// eliberare captura imagine de la camera web
cvReleaseCapture(&captura);
4.4 Implementarea interfeței aplicației
Interfața aplicației realizate este compusă din următoarele ferestre:
Fereastra în care se afișează captura video provenită de la camera web (frame). Această captura este in format RBG și se comportă asemenea afișajului obișnuit pe care îl vedem atunci când se face video-chat.
Fig. 36 – Fereastra video RGB, în interiorul ferestrei se vede urma lăsată de pointerul de culoare roșie
Fereastra în care este afișată imaginea binarizată (prăguită), această fereastră are rolul de a depista dacă procesul de prăguire (thresholding) se efectuează cu succes. Funcția implementată la începutul aplicației e responsabilă de acest lucru precum și funcțiile de inițializare și afișare a cesteia:
IplImage* imgFrameBinarizata = ImagineBinarizata(frame);
cvShowImage("Fereastra_imagine_binarizata", imgFrameBinarizata);
Fig. 37 – Fereastra imagine_binarizată, în interiorul ferestrei se vede urma lăsată de pointerul de culoare roșie în urma procesului de prăguire (thresholding)
Fereastra Tablă Virtuală Cv Board – dă numele proiectului și este fereastra in jurul căreia aplicația este centrată. Aceasta conține majoritatea funcționalităților și meniul utilizatorului. Despre funcționalitățile meniului, acestea au fost expuse în capitolul 3 (Proiectarea sistemului).
Fig. 38 – Fereastra Cv Board (tabla virtuală), în interiorul ferestrei s-a scris anul „2014”
Fereastra consolă – aceasta a avut rolul mai important la implementarea proiectului în stadiul incipient pentru stabilirea poziției curente a pointerului in coordonate xOy. Stabilirea pozitiei pointerului a fost extrem de importantă în proiectarea și poziționarea(plasarea) meniului în fereastra tabla virtuală. Următoarea linie de cod implementează această fereastră.
// afisare pozitii in mod consola pentru urmarire si depanare
printf("pozitie curenta a pointerului (x,y): (%d,%d)\n", posX, posY);
Fig. 39 – Fereastra consola, aici e afișată poziția pointerului în coordonate x,y
Fereastra TrackBar – este responsabilă de reglarea (ajustarea manuală) a parametrilor HSV a pointerului, un lucru foarte important, deoarece condițiile de luminozitate pot să se schimbe mereu, iar daca acești parametrii , care inițial sunt scriși în codul sursă , nu se pot modifica printr-o metodă flexibilă, aplicația dezvoltată și-ar pierde din valoare.
Fig. 40 – Fereastra de tip TrackBar în care se calibrează parametrii HSV ai pointerului
4.5 Determinarea parametrilor HSV ai pointerului
Determinarea parametrilor HSV ai pointerului a fost una din cele mai importante aspecte în realizarea și implementarea acestui proiect. Aceștia s-au determinat pe cale experimentală, prin încercări repetate. Pentru a detecta valorile HSV a pointerului roșu s-au făcut numeroase capturi cu ajutorul camerei web în diferite condiții de luminozitate (luminozitate medie, luminozitate mare cât și luminozitate puțină). Zona de interes pentru a citi valorile parametrilor HSV a fost zona din jurul punctului proiectat de pointer ca in Figura 41, 42, 43. Cu ajutorul urătorului script Matlab se poate citi valorile parametrilor pentru punct pentru diferite condiții de luminozitate.
I=imread('captura_tabla_normala.bmp');
hsv=rgb2hsv(I);
uint8(180*hsv(:,:,1))
uint8(100*hsv(:,:,2))
uint8(100*hsv(:,:,3))
Scriptul scris în Matlab citește un fișier imagine de tip bmp, face o conversie în formatul HSV și apoi afișează valorile.
Fig. 41 – Captură asupra punctului în condiții de luminozitate normală, în dreapta zona de interes asupra căruia se aplică scriptul Matlab
Fig. 42 – Captură asupra punctului în condiții de luminozitate ridicată, în dreapta zona de interes asupra căruia se aplică scriptul Matlab
Fig. 43 – Captură asupra punctului în condiții de luminozitate redusă, în dreapta zona de interes asupra căruia se aplică scriptul Matlab
Astfel, in urma rulării scriptului Matlab se vor afișa valorile HSV pentru fiecare caz iar apoi se vor lua în mod convenabil cele mai bune valori. Aceste valori, după ce au fost luate se vor hard coda in codul sursă al aplicației, însă aceste valori pot fi ușor modificate prin intermediul interfeței de tip TrackBar.
În Figura 44 (a,b,c) sunt afișate valorile HSV pentru cazul în care avem luminozitate normală. Se poate vedea ca zona în care se află punctul de culoare roșie e zona centrală iar scriptul reușește să mapeze corect valorile respective pentru punctul roșu. Se va proceda la fel și pentru celelalte două cazuri rămase, însă rezultatele sunt concludente și nu mai își au rostul.
Fig. 44 a) – Valorile H(HSV) ai zonei de interes (punctului roșu al pointerului)pentru cazul în care avem luminozitate normală
Fig. 44 b) – Valorile S(HSV) ai zonei de interes (punctului roșu al pointerului)pentru cazul în care avem luminozitate normală
Fig. 44 c) – Valorile V(HSV) ai zonei de interes (punctului roșu al pointerului)pentru cazul în care avem luminozitate normală
4.6 Analiza și performanța aplicației software
Aplicația curentă a fost dezvoltată in mediul de programare Visual Studio 2013, acesta vine cu unele opțiuni interesante precum cea de analiză a performanței și diagnoză a codului sursă. Aceasta opțiune este valabilă direct din meniul principal (ANALIZE, opțiunea Performance and Diagnostics).
Fig. 45 – Raportul de analiză a performanței obținut în urma rulării opțiunii Performance and Diagnostics
În cele 40 de secunde în care aplicația rulează se colectează o serie de date referitoare la performanța funcțiilor, modulelor, procese , fire de execuție etc. În imaginea din Figura 45 se observă ca activitatea CPU stagnează în jurul valorii de 20%, se mai poate vedea care sunt cele mai accesate fișiere (Hot Path) și care funcții au aportul cel mai mare în cadrul soluției(Functions Doing Most Individual Work). Astfel fișierele proiect_licenta.exe și opencv_core249.dll sunt accesate cel mai des iar funcțiile cele mai solicitate din cadrul proiectului sunt opencv_core249.dll(44,25%), opencv_imgproc249.dll(33,76%), gdi32.dll(9,29%), msvcr120.dll(7,82%), opencv_highgui249.dll(3,68%)).
Capitolul 5 – Rezultate și concluzii
Așa cum a fost prezentat încă de la începutul lucrării, acest proiect a fost realizat cu scopul de a oferi o alternativă mai ieftină și mai comodă în a implementa o tablă virtuală în sălile de curs unde se găsește un videoproiector. Desigur că la momentul actual aplicația este una mai simplistă și nu oferă la fel de multe opțiuni ca și cele consacrate deja pe piață, însă perspectiva este una încurajatoare deoarece aplicația permite sa i se adauge funcționalități și module noi și poate fi îmbunătățită.
Totul a plecat de la o idee simplă din domeniul Viziunii Artificiale și al Prelucrării de Imagini, aceea de binarizare a imaginilor (thresholding), posibilitate prin care s-a realizat procesul de detectare a pointerului prin intermediul unei camere web obișnuite. Alte noțiuni precum domeniile de culoare RGB și HSV au facilitat captarea de la camera web a imaginilor(frame-urilor) și posibilitatea de prelucrare a acestora în domeniul HSV.
Un alt aspect important în realizarea proiectului a fost determinarea parametrilor HSV pentru a putea detecta corect pointerul de culoare roșie. Aceștia s-au determinat pe cale experimentală prin numeroase încercări. La început s-a mers pe ideea de a determina doar o componentă a domeniului HSV și anume componenta H(Hue), însă această idee a fost una defectuoasă deoarece componenta H(cea care măsoară culoarea pointerului) depindea foarte mult de condițiile de luminozitate din jurul punctului, astfel o simplă fluctuație a valorilor V din jurul punctului pointerului punea în pericol detecția acestuia.
De asemenea, folosirea unei librării open source ca OpenCV a oferit un avantaj în implementarea aplicației software și a facilitat rezolvarea unor probleme des întâlnite la camerele web precum efectul de oglindire a imaginii (efectul flip). Tot prin folosirea unor funcții speciale ale librăriei OpenCV precum cvInRanges() a permis crearea unui interval al parametrilor HSV in care pointerul Roșu poate fi detectabil.
Sistemul propus a fost proiectat cu ajutorul diferitor diagrame de tip UML. Prin diagramele de deployment și use-case s-a realizat modelarea statică a sistemului iar prin diagramele de stare, de secvență și DFD (Data Flow Diagram) s-a realizat modelarea dinamică a acestuia.
Ca și comportament, aplicația nu consumă multe resurse (20 MB de memorie RAM) și se execută un singur proces aferent acesteia care are 9 fire de execuție.
5.1 Posibilități de dezvoltare
Principalul dezavantaj al sistemului este că depinde în oricare măsură de condițiile de luminozitate din încăpere, Acest aspect a fost rezolvat în proporții mari, însă se mai pot aduce îmbunătățiri fie prin utilizarea unei camere web mai performante care sa nu fie foarte sensibilă la fluctuațiile bruște de lumină fie prin implementarea unor algoritmi de detectare a pointerului ce nu se bazează pe detectarea parametrilor HSV a acestuia.
Un alt aspect care poate fi îmbunătățit este acela de a reduce zgomotul captat de camera web, în general în implementarea proiectului, de puține ori s-a avut de a face cu această problemă. In general zgomotul a intervenit atunci când au apărut schimbări bruște de luminozitate pe suprafața pe care s-a proiectat pointerul (tabla virtuală).
De asemenea nu s-a reușit să se facă calibrarea automată a camerei web deoarece a necesitat un studiu mai amănunțit asupra acestui lucru, algoritmii de calibrare existenți la ora actuală fiind puțini și prost documentați.
Ca funcționalități noi se mai pot adăuga la Meniul aplicației opțiuni asemănătoare editoarelor de text sau celor din aplicația Paint din sistemul de operare Windows. Pe viitor, acestui proiect s-ar putea să îi fie implementat opțiuni de control al prezentărilor bazat pe detectarea mâinii ceea ce ar face un produs cu adevărat competitiv.
Bibliografie
Ashlee Vance, With Kinect, Microsoft Aims for a Game Changer, http://www.nytimes.com/2010/10/24/business/24kinect.html?_r=4&ref=technology& , 2010
L. Matthies, M. Maimone, Andrew Johnson, Yang Cheng, R. Willson, C. Villalpando, S. Goldberg, A. Huertas, Computer Vision on Mars, Springer Science + Business Medi, 2007
Siouris, George, Missile Guidance and Control Systems. 2004
Pun, Gerig and Ratib, Computer vision in medicine, 1993
Ministerul Educatiei și Cercetării, Ministerul Educației Naționale deschide procedurile aferente licitației pentru manualele de clasa I și clasa a II-a, http://www.edu.ro/index.php/pressrel/21108, la data de 13.03.2014
https://smarttech.com/Solutions/Education+Solutions/Products+for+education/Interactive+whiteboards+and+displays/SMART+Board+interactive+whiteboards la data de 11.04.2014
C. Vertan, Prelucrarea și Analiza Imaginilor, Printech București, 1999
R., C., Gonzalez, P., Wintz, “Digital Image Processing”, Adison-Wesley, 1987
H. Grif, Prelucrarea digitală a imaginilor. Notițe de curs – format digital , Universitatea “Petru Maior”- Târgu Mureș, 2008
L.M. Ivanovici, Procesarea Imaginilor, Îndrumător de laborator, Universitatea “Transilvania” din Brașov, 2006
http://www.e-learn.ro/tutorial/fotografie/perceptia-umana-a-culorilor/132/1/161.htm la 22.04.2014
H. Grif, Prelucrări de imagine. Notițe de curs, Universitatea “Petru Maior”- Târgu Mureș, 2009
J. C. Russ, The Image Processing Handbook – Sixth Edition, CRC Press Taylor & Francis Group, 2011
Cristina Zoica Dumitru, „RGB, HSV și reprezentarea culorilor în Hexazecimal”,http://www.animatic.ro/2010/05/rgb-hsv-si-reprezentarea-culorilor-in-hexazecimal/, 23.05.2010
G. Bradski, A. Kaehler, “Learning OpenCV”, O’Reilly Media, Inc. , 2008
http://docs.opencv.org/modules/core/doc/intro.html, la 23.04.2014
http://cs.upm.ro/_users/cursuri_on_line/CD/IP/UML.HTM, la 30.05.2014
http://www.geek.com/games/microsofts-xbox-720-kinect-motion-sensor-specs-leak-1540355/ la data de 17.06.2013
http://library.noctrl.edu/instructional_media/smartboard_classrooms.html la data de 17.06.2012
http://www.buzzle.com/articles/primary-colors-of-light.html la data de 17.06.2014
http://learn.leighcotnoir.com/artspeak/elements-color/hue-value-saturation/ la data de 17.06.2014
Bibliografie
Ashlee Vance, With Kinect, Microsoft Aims for a Game Changer, http://www.nytimes.com/2010/10/24/business/24kinect.html?_r=4&ref=technology& , 2010
L. Matthies, M. Maimone, Andrew Johnson, Yang Cheng, R. Willson, C. Villalpando, S. Goldberg, A. Huertas, Computer Vision on Mars, Springer Science + Business Medi, 2007
Siouris, George, Missile Guidance and Control Systems. 2004
Pun, Gerig and Ratib, Computer vision in medicine, 1993
Ministerul Educatiei și Cercetării, Ministerul Educației Naționale deschide procedurile aferente licitației pentru manualele de clasa I și clasa a II-a, http://www.edu.ro/index.php/pressrel/21108, la data de 13.03.2014
https://smarttech.com/Solutions/Education+Solutions/Products+for+education/Interactive+whiteboards+and+displays/SMART+Board+interactive+whiteboards la data de 11.04.2014
C. Vertan, Prelucrarea și Analiza Imaginilor, Printech București, 1999
R., C., Gonzalez, P., Wintz, “Digital Image Processing”, Adison-Wesley, 1987
H. Grif, Prelucrarea digitală a imaginilor. Notițe de curs – format digital , Universitatea “Petru Maior”- Târgu Mureș, 2008
L.M. Ivanovici, Procesarea Imaginilor, Îndrumător de laborator, Universitatea “Transilvania” din Brașov, 2006
http://www.e-learn.ro/tutorial/fotografie/perceptia-umana-a-culorilor/132/1/161.htm la 22.04.2014
H. Grif, Prelucrări de imagine. Notițe de curs, Universitatea “Petru Maior”- Târgu Mureș, 2009
J. C. Russ, The Image Processing Handbook – Sixth Edition, CRC Press Taylor & Francis Group, 2011
Cristina Zoica Dumitru, „RGB, HSV și reprezentarea culorilor în Hexazecimal”,http://www.animatic.ro/2010/05/rgb-hsv-si-reprezentarea-culorilor-in-hexazecimal/, 23.05.2010
G. Bradski, A. Kaehler, “Learning OpenCV”, O’Reilly Media, Inc. , 2008
http://docs.opencv.org/modules/core/doc/intro.html, la 23.04.2014
http://cs.upm.ro/_users/cursuri_on_line/CD/IP/UML.HTM, la 30.05.2014
http://www.geek.com/games/microsofts-xbox-720-kinect-motion-sensor-specs-leak-1540355/ la data de 17.06.2013
http://library.noctrl.edu/instructional_media/smartboard_classrooms.html la data de 17.06.2012
http://www.buzzle.com/articles/primary-colors-of-light.html la data de 17.06.2014
http://learn.leighcotnoir.com/artspeak/elements-color/hue-value-saturation/ la data de 17.06.2014
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: Tabla Interactiva (ID: 124392)
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.
