Medii de Programare Pentru Procesarea de Imagine
Cuprins
Introducere
În ultimii ani numărul mașinilor a crescut considerabil. Din cauza acestui fapt, a devenit dificil să se țină o evidență a fiecărui vehicul în scopul managementului traficului. Întrebarea evidentă aici este cum să identifici un vehicul anume? Răspunsul este prin folosirea numărului de înmatriculare. Recunoașterea plăcuței de înmatriculare este folosită din ce în ce mai mult în zilele noastre pentru colectarea taxelor, pentru buna desfășurare a activității traficului, dar și pentru un sistem de acces, cum va fi cazul de față.
Vehiculele din fiecare țară au un număr propriu de înmatriculare care este înscris pe plăcuța de înmatriculare. Acest număr diferențiază vehiculele unul de celălalt și este de ajutor atunci când mașinile aparțin aceleiași mărci și aceluiași model. Un sistem automat poate fi implementat pentru a identifica numărul de înmatriculare și să extragă literele înscrise pe plăcuța de înmatriculare.
În acest proiect metoda de extragere a numărului de înmatriculare este bazată pe procesarea imaginii și binarizarea acesteia realizată prin contrastul dintre caractere și fundalul plăcuței de înmatriculare. După binarizarea imaginii, aceasta este divizată în diferite regiuni de alb și negru. Aceste regiuni sunt supuse unei etape de eliminare pentru a obține regiunea care este cel mai probabil să conțină plăcuța de înmatriculare.
Scopul acestei lucrări este să detecteze numărul de înmatriculare dintr-o imagine obținută de la o cameră de supraveghere. Pe baza identificării numărului de înmatriculare se va activa deschiderea unei bariere care va permite sau nu trecerea vehicului. Accesul vehiculului va fi permis pe baza verificării numărului în baza de date. Acest proiect poate reprezenta o bază pentru viitoarele dezvoltări în câmpul procesării de imagine, în special în identificarea plăcuțelor de înmatriculare și extragerea numărului înscris pe plăcuță.
Fundamente teoretice
Componentele imaginii
Suntem în mijlocul unei lumi vizuale încântătoare, care se manifestă printr-o varietate de forme, culori și texturi, mișcare. Percepția umană are capabilitatea de a prelua, integra și interpreta toată această abundneță de imagini vizulale care ne înconjoară. Este motivant să împarți aceste calități cu un aparat cu scopul de a interpreta informațiile vizuale imprimate în poze, filme sau imagini în mișcare. Este important să înțelegem tehnicile de stocare, procesare, transmisie, recunoaștere și în final interpretarea acestor scene vizuale.
O imagine este folosită pentru a oferi informații utile într-un format vizibil. O imagine reprezintă o aranjare a unor mici elemente într-un plan bidimensional. Aceste mici elemente poartă denumirea de pixeli. Acești pixeli se combină între ei, iar rezultatul îl reprezintă o imagine, fie de mărime mică sau mare.
Fiecare pixel conține anumite informații despre o imagine, cum ar fi culoarea, intensitatea luminii și luminanța. Pixel-ul reprezintă elementul de bază care descrie o imagine. Fiecare pixel este reprezentat în imagine în format RGB(Red, Green, Blue) sau YCbCr.
În cazul imaginii RGB, toate cele trei componente, numite R, G, B, se combină pentru a transmite informații despre luminozitatea și culoarea unui pixel. Fiecare componentă consuma un anumit spațiu de memorie în timpul procesării imaginii.
Formatul RGB este un model color aditiv în care roșu, verde și albastru sunt adăugate împreună pentru a reproduce o gamă largă de culori.(Fig. 1.1)
Fig. 2.1 Amestecul culorilor aditive [1]
Principalul scop al modelului color RGB este afișarea imaginilor în sistemele electronice, cum are fi televiziunea sau computerele, dar a fost folosit și în fotografia convențională. Diferite aparate detectează și reproduc diferit un model RGB dat pentru că ele răspund diferit la fiecare dintre cele trei culori în funcție de producător.
Fiecare dintre cele trei componente necesită cel puțin 8 biți pentru stocare. In general fiecare pixel necesiă până la 8*3 biti pentru stocare.
Valoarea pentru R, G sau B variază de la 0-255. O valoare de (0,0,0) reprezintă un pixel negru, (255,0,0) reprezintă un pixel roșu, (0,255,0) reprezintă un pixel verde, iar (0,0,255) este un pixel albastru.
În cazul imaginii YCbCr, fiecare pixel dintr-o imagine este reprezentat ca o combinație dintre Y și valorile Cb/ Cr. Aici, Y reprezintă luminanța, care descrie intensitatea luminii și Cb / Cr reprezintă componenta cromatică, care descrie informațiile de culoare pentru o imagine. De-a lungul timpului, sa constatat că componentele YCbCr ale unei imagini transmit suficientă cantitate de informații comparativ cu RGB și ocupând spațiu de memorie mai mic. Acesta este un avantaj major în zilele noastre.
Spre deosebire de formatul RGB, formatul YCbCr este disponibil în diverse tipuri de intercalare. De exemplu, un format YCbCr 4:2:2 sugerează că un singur pixel este reprezentat prin două componente, Y și C. Componentele Cb și Cr sunt intercalate printre pixeli. Deci, dacă un pixel este reprezentat printr-o combinație de Y și Cb, pixelul adiacent va fi reprezentat de o combinație de Y și Cr. Chiar dacă respectivele componente Cb și Cr sunt intercalate, efectul său nu este vizibil pentru ochiul uman.
Figură 2.1 Imagine color și componentele Y, Cb, Cr
Valorile pentru Y, Cb și Cr variază de la 0-255. Astfel, pentru a stoca un singur pixel, valoarea de stocare necesară este de 8 * 2 biți, care este mai puțin în comparație cu cel solicitat de formatul RGB.
Etapele procesării imaginii
Fig. 2.2 Etapele procesării imaginii [3]
Achiziția imaginii – primul pas în elaborarea unui sistem de analiză a imaginii este achiziția digitală a imaginii folosind senzori în lungimi de unda optice sau termice. O imagine bidimensională capturată de acești senzori reprezintă harta tridimensională a lumii vizuale. Semnalul bidimensional capturat este eșantionat și cuantizat pentru a reda imagini digitale. Uneori primim imagini cu zgomot care sunt degradate de un mecanism de degradare. O sursă comună de degradare a imaginii îl reprezintă sistemul de lentile optice de la o cameră digitală. Dacă camera nu este focusată corespunzător, atunci obținem imagini neclare. Un alt tip de degradare a imaginii este dat de condițiile atmosferice, cum ar fi ceața. În alte cazuri poate exista o mișcare între obiect și cameră. Deci dacă camera primește un impuls de mișcare în timp ce face captura unui obiect, care este static, rezultatul va fi o imagine neclară, cu zgomot. Intensificarea imaginii, filtrarea și restaurarea sunt câteva dintre aplicațiile importante folosite în acest domeniu.[2]
Îmbunătățire a imaginii – îmbunătățirea imaginii este printre cel mai simple și interesante părți ale procesării digitale de imagine. Ideea din spatele tehnicii de intensificare este de a scoate în evidența detalii care sunt obscure sau pentru simpla evidențiere a unor trăsături de interes din imagine, cum ar fi schimbarea luminozității, contrastului etc.[3]
Restaurarea imaginii – restaurarea imaginii este o parte care se ocupă tot cu îmbunătățirea aspectului imaginii. Totuși, spre deosebire intensificare, care este subiectivă, restaurarea imaginii este obiectivă, în sensul că restaurarea imaginii tinde să fie bazată pe modele matematice și probabilistice de degradare a imaginii.[3]
Procesarea imaginii color – este o arie care și-a câștigat importanța prin folosirea din ce în ce mai mult imaginilor digitale pe internet. Aceasta include modelarea culorii și procesării în domeniul digital.[3]
Wavelets și procesarea multirezoluție – wavelet reprezintă baza reprezentării imaginii în diverse rezoluții. Imaginile se subdivid succesiv în regiuni mai mici pentru compresia datelor și reprezentarea piramidală.[3]
Compresia – compresia are la bază tehnicile de reducere a spațiului pentru salvarea imaginii sau pentru reducerea lațimii de bandă pentru transmiterea ei. Particular, când folosim internetul este necesar să compactăm datele.[3]
Procesarea morfologică – în această etapa se extrag componentele imaginii care sunt folositoare pentru reprezentarea și descrierea formei.[3]
Segmentarea – segmentarea este procesul care divide o imagine într-un număr de regiuni uniforme omogene. Fiecare regiune omogenă reprezintă o parte sau un obiect din întreaga scenă. Cu alte cuvinte, segmentarea unei imagini este definită de un set de regiuni conectate și nesuprapuse, în așa fel încât fiecărui pixel aparținând unui segment din imagine i se poate atribui o etichetă unică a a regiunii cărei aparține. Segmentarea este una din cele mai importante tehnici de analiză automată a imaginii, în special pentru că în acest punct obiectele sau alte entități sunt extrase pentru procesări ulterioare, cum ar fi descrierea sau recunoașterea.[2]
Extragerea – după identificarea fiecărui segment, următoarea operațiune este extragerea unor elemente specifice, cum ar fi textura, culoarea și forma. Acestea sunt entități importante, iar măsurarea lor ne oferă variate proprietăți ale segmentelor imaginii. Câteva dintre proprietățile texturii sunt asprimea, netezimea, regularitatea, etc., în timp ce parametrii formei sunt lungimea, lățimea, rezoluția, aria, locația, perimetrul, etc. Fiecare segment al regiunii poate fi caracterizat de un astfel de set de parametrii.[2]
Recunoașterea obiectului – este procesul prin care se atribuie o etichetă, cum ar fi „vehicul”, unui obiect. Procesul de etichetare se bazează pe elementele descriptive ale obiectului.[3]
Baza de cunoștințe – controlează interacțiunea dintre module. Informația despre o problemă este codată într-un sistem de procesare a imaginii, cum este baza de cunoștințe.[3]
Componentele sistemului de procesare digital
Fig. 2.3 Camera digitală [3]
Sunt necesare două elemente pentru a obține o imagine digitală. Primul este un aparat fizic care este sensibil la energia radiată de obiectul de la care vrem sa obținem o imagine. Al doilea este convertorul digital, care convertește imaginea capturată de senzorii aparatului într-o formă digitală. Spre exemplu, într-o cameră digitală, produc un semnal electric proporțional cu intensitatea luminii. Convertorul digital convertește acest semnal format digital. Hardware-ul specializat pe procesarea de imagine este format de obicei din acest convertor digital și o unitate aritmetică logică(ALU) care execută alte operații primitive. ALU execută operații aritmetice și logice în paralel pe întreaga imagine. Caracteristica principală a acestei unități este viteza.[2]
Senzorii care sunt utilizați în cele mai multe camere sunt CCD(charge couple device) sau CMOS. Camerele CCD cuprind un număr mare de mici fotodiode. Încărcările electrice care sunt acumulate în fiecare celulă a imaginii sunt transportate, dar numai după o exactă conversie analog-digitală.[2]
În senzorii CMOS sunt folosiți o serie de tranzistori care amplifică semnalul în locația fiecărui pixel. Semnalul rezultat pentru fiecare pixel este citit individual. Senzorii CMOS actuali adaugă mai mult zgomot în comparație cu senzorii CCD. Totuși ei consumă putere mai puțină și sunt mai puțin costisitori.[2]
O cameră digitală poate captura imagini la diverse rezoluții: rezoluții mici(320×240 pixeli, 640×480 pixeli) și rezoluții mari(1216×912 pixeli, 1600×1200 pixeli). Camerele digitale pe cere le folosim în mod normal pot produce până la 16 milioane de culori.
Rezoluția spațială a unei imagini se referă la mărimea pixelilor. Procesul de zooming a unei imagini implică realizarea interpolării între pixeli pentru a produce o formă mărită a imaginii. Zooming-ul nu mărește conținutul informațional fața de ceea ce ne oferă sistemul. Senzorii de rezoluție depind de cea mai mică dimensiune a obiectului dintr-o imagine pe care sistemul trebuie sa o distingă. De exemplu, într-un sistem optic de recunoaștere a caracterelor(OCR), detaliul minim care trebuie identificat este lățimea minimă segmentelor de linie care compun șablonul. Rezoluția senzorului unei camere reprezintă totalitatea rândurilMOS actuali adaugă mai mult zgomot în comparație cu senzorii CCD. Totuși ei consumă putere mai puțină și sunt mai puțin costisitori.[2]
O cameră digitală poate captura imagini la diverse rezoluții: rezoluții mici(320×240 pixeli, 640×480 pixeli) și rezoluții mari(1216×912 pixeli, 1600×1200 pixeli). Camerele digitale pe cere le folosim în mod normal pot produce până la 16 milioane de culori.
Rezoluția spațială a unei imagini se referă la mărimea pixelilor. Procesul de zooming a unei imagini implică realizarea interpolării între pixeli pentru a produce o formă mărită a imaginii. Zooming-ul nu mărește conținutul informațional fața de ceea ce ne oferă sistemul. Senzorii de rezoluție depind de cea mai mică dimensiune a obiectului dintr-o imagine pe care sistemul trebuie sa o distingă. De exemplu, într-un sistem optic de recunoaștere a caracterelor(OCR), detaliul minim care trebuie identificat este lățimea minimă segmentelor de linie care compun șablonul. Rezoluția senzorului unei camere reprezintă totalitatea rândurilor și coloanelor care compun mulțimea CCD, în timp ce câmpul vizual(FOV) reprezintă aria scenei pe care camera o poate captura. FOV este ales ca dimensiunea orizontală a regiunii de inspectat care include obiectele de interes.
Camerele digitale suportă mai multe opțiuni printre care controlul fotografierii, controlul focus-ului, controlul timpului de expunere etc.[2]
Microcontrollere
Un microcontroller este un microcircuit care incorporează o unitate centrală (CPU) și o memorie împreună cu resurse care-i permit interacțiunea cu mediul exterior.[4]
Se folosesc în produse și dispozitive controlate automat, cu ar fi sisteme de control al motoarelor autoturismelor, dispozitive medicale implantabile, sisteme de comandă de la distanță. Folosirea microcontrollerului în opoziție cu un design care conține entități separate pentru microprocesor, memorie și dispozitive de input/output aduce multe avantaje, printre care cele de cost al producției și reducere a dimensiunilor, mai ales în aplicațiile unde volumul ocupat este o caracteristică critică.[4]
Printre multele domenii unde utilizarea lor este practic un standard industrial se pot menționa: în industria de automobile (controlul aprinderii/motorului, climatizare, diagnoză, sisteme de alarmă, etc.), în așa zisa electronică de consum (sisteme audio, televizoare, camere video și videocasetofoane, telefonie mobilă, GPS-uri, jocuri electronice etc.), în aparatura electrocasnică (mașini de spălat, frigidere, cuptoare cu microunde, aspiratoare), în controlul mediului și climatizare (sere, locuințe, hale industriale), în industria aerospațială, în mijloacele moderne de măsurare – instrumentație (aparate de măsură, senzori și traductoare inteligente), la realizarea de periferice pentru calculatoare, în medicină.
Pentru aplicația de față am ales să folosesc microcontorllerul Atmega48, din familia AVR de la Atmel. Atmega48 este un microcontroller pe 8 biți bazat pe arhitectura RISC.
Procesorul AVR cuprinde 32 de regiștrii de uz general. Toți acești 32 de regiștri sunt conectați direct la Unitatea Logică Aritmetică(ALU), permițând ca doi regiștrii independenți să fie accesați de o singură instrucțiune executată într-o singur ciclu de ceas. Segmentele de memorie non-volatilă includ 32 kB de memorie Flash pentru program, 1024bytes EEPROM, 2Kbytes SRAM, 32 de lini I/O de uz general, 3 flexibile Timer/Counters, întreruperi interne și externe, interfață programabilă USART, interfață programabilă SPI, Watchdog programabil cu oscilator intern.[5]
Fig. 2.4 Diagrama bloc a microcontrollerului Atmega32 [5]
Microcontrollerul este prezentat într-o capsulă PDIP (Plastic Dual In-Line Package) cu 40 de pini, cu configurația pinilor conform figurii următoare:
Fig. 2.5 Configurația pinilor Atmega32[5]
Principala funcție a nucleului CPU este de a asigura execuția corectă a programului și de aceea CPU-ul trebuie să fie capabil să acceseze memoriile, să execute instrucțiuni, să controleze funcțiile periferice și să trateze întreruperi. Pentru o performanță cât mai bună, AVR folosește arhitectura Harvard, cu memorii și magistrale separate pentru program și pentru date.[5]
Cei 32 de regiștri pe 8 biți sunt cu acces rapid, fiind posibilă execuția unei operații ALU într-un singur ciclu de ceas. Șase dintre aceștia pot fi utilizați ca și cum ar fi trei pointeri de adrese pentru adresare indirectă pe 16 biți (regiștri X, Y si Z). ALU acceptă operații între regiștri, între registru si constantă, și operații pe un singur registru.[5]
Fig. 2.6 Diagrama bloc a arhitecturii AVR[5]
Fig. 2.7 Diagrama pentru efectuarea unei singure operații ALU[5]
După efectuarea unei operații, registrul de stare SREG (Status Register) este actualizat pentru a reflecta rezultatul operației.
În timpul apelării de subrutine sau a tratării întreruperilor, Program Counter (PC) este salvat pe stivă. Stiva este localizată în memoria SRAM pentru date generale și în consecință dimensiunea acesteia este limitată de dimensiunea generală a memoriei SRAM și de gradul de utilizare a acestei memorii. Pointerul stivei este accesibil în modula read/write în spațiu I/O. Această memorie este accesată prin cele cinci moduri diferite de adresare posibile în arhitectura AVR.[5]
Modulul pentru întreruperi este controlat de regiștri aflați în spațiul I/O, și de un bit adițional în registrul de stări, care permite activarea sau dezactivarea globală a întreruperilor. Toate întreruperile au vectori dedicați în tabela vectorilor de întreruperi, cu prioritate dependentă de poziția vectorului de întrerupere. Prioritatea de tratare este cu atât mai mare cu cât adresa vectorului de întrerupere este mai mică.[5]
Fig. 2.8 Registrul de stare SREG[5]
Bitul 7 – I: Global Interrupt Enable. Acest bit trebuie să aibă valoarea 1 pentru ca întreruperile să fie activate, iar apoi se poate activa fiecare întrerupere în parte din regiștri de control aferenți. Dacă bitul are valoarea 0, nici una dintre întreruperi nu este activă. Acestui bit îi este alocată prin hardware valoarea zero în momentul în care se declanșează o întrerupere și valoare 1 la revenirea din rutina de tratare a întreruperii, marcată de instrucțiunea RETI. De asemenea, se pot folosi în program instrucțiunile SEI pentru setarea bitului și CLI pentru ștergerea acestuia.[5]
Bitul 6 – T: Bit Copy Storage. Instrucțiunile de copiere a unui bit, BLD (bit load) și BST (bit store) folosesc acest bit din registrul de stări ca sursă sau destinație pentru operand. Instrucțiunea BLD copiază un bit din regiștrii în bitul T, iar BST copiază valoarea bitului T într-un bit dintr-un registru.[5]
Bitul 5 – H: Half Carry Flag. Half Carry este utilizat în operațiile aritmetice BCD.[5]
Bitul 4 – S: Sign Bit. Acest bit se definește ca fiind întotdeauna “sau exclusiv” între bitul 2 al SREG N (Negative Flag) și bitul 3 al SREG V (Two’s Complement Overflow Flag), descriși în continuare.[5]
Bitul 3 – V: Two’s Complement Overflow Flag. Este folosit adițional pentru calcularea complementului față de 2.[5]
Bitul 2 – N: Negative Flag. Indică un rezultat negativ într-o operație aritmetică sau logică.[5]
Bitul 1 – Z: Zero Flag. Indică rezultat nul într-o operație aritmetică sau logică.[5]
Bitul 0 – C: Carry Flag. Indică transport într-o operație logică sau aritmetică.[5]
Sistem de comandă motor curent continuu( DC motor)
Motoarele de curent continuu sunt motoare electrice care sunt alimentate direct de la o baterie sau de la o sursă de curent continuu. Comutația acestora poate fi cu perie sau fără perie Viteza unui DC cu perie poate fi controlat prin modificarea voltajului. Prin contrast, un motor de curent alternativ este alimentat de curent alternativ (AC), care este definit atât de tensiune cât și de frecvență. În consecință, motoarele care sunt alimentate cu curent alternativ necesită o modificare a frecvenței pentru a schimba viteza, care implică un control mai complex și costisitor de viteză.[6]
Viteza, cuplul și tensiunea de funcționare sunt cele mai importanți parametrii de performanță pentru motoarele de curent continuu.
Specificații de performanță
Viteza arborelui: Unui motor de curent continuu i se aplică o tensiune (V) pentru a roti un ax, la o viteză de rotație proporțional (ω). Specificațiile de viteză ale axului se referă în general la viteza de mers în gol, care este viteza maximă la care motorulul poate ajunge atunci când nu este aplicat nici un cuplu. De obicei, viteza arborelui este dată în rotații sau revoluții pe minut (rpm). Aceste rotații sau revoluții pot fi legate de numărul de radiani pentru a exprima viteza motorului în radiani pe secundă (rad / s). Pentru calcule numerice, această unitate a vitezei de rotație este mai convenabilă. Următoarea formulă descrie relația dintre radiani pe secundă și rotații sau rotații pe minut.[6]
(2.1)
Cuplu de ieșire: rotația arborelui generează o forță de rotație numit cuplu (τ) în motor. Aceasta este sarcina motorului pe care o poate genera sau conduce. Cuplul este dat în unități de forță-distanță (lb-ft, oz-in, Nm, etc). Specificațiile cuplului se referă în general la cuplul de antrenare și cuplul continuu. Cuplul de antrenare este τ la care turația arborelui este zero, sau motorul stă. Cuplul continuu este τ maxim la condiții normale de funcționare. Rețineți că cuplul (τ) al unui motor de curent continuu este proporțional cu curentul armături (I) și constanta de proporționalitate este constanta de cuplu (k). Următoarea ecuație descrie relațiile dintre cuplu și curent:
(2.2)
Importanța cuplului constant este evidentă din ecuația de mai sus. Pentru un cuplu dat, o valoare ridicată a k limitează curentul la o valoare scăzută. Aceasta este o măsură de eficiență, deoarece consumul de curent mai mic înseamnă un consum mai mic de energie (căldură) .Cuplul constant și cuplul produs de rotor ne permite să calculăm curentul prin armătură, care este folosit pentru a calcula evaluări de temperatură.[6]
Fig. 2.9 Relația dintre viteză și cuplu[6]
Tensiunea disponibilă: motoarele de curent continuu pot fi proiectate pentru a funcționa la o tensiune specifică în cazul în care doar o gama restrânsă de surse de alimentare este disponibilă.Tensiunea specificată determină viteza nominală a motorului. În general, tensiunea este dată în volți (V). [6]
Puterea de ieșire: o specificație regulată și importantă, puterea nominală de ieșire (PO) este produsul dintr cuplu și viteza nominală a motorului. Puterea de ieșire este dată de ecuația:
(2.3)
Puterea de ieșire maximă apare la 50% din viteza de mers în gol și la 50% din cuplul de antrenare. Mulți furnizori specifică puterea de ieșire în funcție de cai putere (CP). Pentru a converti o valoare calculată de putere de unități de wați (W) la unități de HP, împart puterea în wați cu 746.[6]
Comutația
Motoarele cu perii folosesc perii de contact care se conectează cu comutator pentru a modifica direcția actuală. Construcția motorului cu perii este mai puțin costisitoare decât fără perii și controlul de motoare cu perii este simplu și ieftin. Motoarele cu perii necesită întreținere periodică pentru a înlocui periile uzate, dar pot funcționa în medii extreme din cauza lipsei lor de electronice.[6]
Motoarele fără perii utilizează un magnet permanent încorporat în ansamblul rotor. Ei pot utiliza unul sau mai multe dispozitive cu efect Hall pentru a sesiza poziția rotorului și unitatea electronică asociată controlează rotația arborelui (viteza). Motoarele fără perii sunt similare cu motoarele de curent alternativ, dar sunt comutate electronic (ESM), astfel încât să poată fi alimentate de DC. Comutația fără perii este mai eficientă, necesită mai puțină întreținere, generează mai puțin zgomot și are o densitate de putere mai mare. Cu toate acestea, electronica de motoare fără perii contribuie în general la costul lor de capital mai ridicat, complexitatea și limitările de mediu.[6]
Motorul electric micro metal 1000:1 HP
Fig. 2.10 Motor electric micro metal 1000:1 HP[7]
Pentru această lucrare am ales motorul electric 1000:1 HP. Acest motor de cuplu mare are o cutie de viteze 1000:1, ceea ce-l face o alegere excelentă pentru aplicații care necesită un control mai fin la viteze foarte mici. Aceste unități au axul in forma literei „D” cu diametrul de 3 mm, iar lungimea axului este de 9,27mm. Tensiunea de alimentare este de 6V, cuplu de 9 kg/cm, iar viteza este 32 RPM.[7]
Aceste motoare sunt destinate utilizării la 6 V, deși, în general, aceste tipuri de motoare pot rula la tensiuni peste și sub această tensiune nominală, astfel încât acestea ar trebui să funcționeze confortabil în gama 3-9 V (rotația poate porni de la tensiuni de 0,5 V). Tensiunile mai mici s-ar putea să nu fie practice, iar tensiunile mai mari ar putea afecta negativ durata de viață a motorului.[7]
Comunicația microcontroller – PC
Comunicația dintre microcontroller și PC am realizat-o cu ajutorul modului bluetooth BTBee HC-06.
Fig. 2.11 Modul Bluetooth BTBee HC-06[8]
Bluetooth este un standard de tehnologie wireless pentru schimbul de date pe distanțe scurte (folosind transmisii radio, pe lungimea de undă în banda ISM 2400 la 2480 MHz) de la dispozitive fixe și mobile, creând rețele personale, cu un nivel ridicat de securitate. Creat de furnizorul de telecomunicații Ericsson în 1994, a fost inițial conceput ca o alternativă wireless pentru cablurile de date RS-232. Se pot conecta mai multe dispozitive, depășind problemele de sincronizare. Bluetooth este condus de Bluetooth Special Interest Group(SIG).
Bluetooth funcționează în intervalul de 2400-2483,5 MHz (inclusiv benzi de gardă). Bluetooth utilizează o tehnologie radio, numită de salt în frecvență cu spectru împrăștiat.Datele transmise sunt împărțite în pachete și fiecare pachet este transmis pe unul din cele 79 canale Bluetooth desemnate. Fiecare canal are o lățime de bandă de 1 MHz. Primul canal începe la 2402 MHz și continuă până la 2480 MHz, în trepte de 1 MHz. Se efectuează, de obicei 1600 de salturi pe secundă, cu Adaptive Frequency-Hopping (AFH) activat.
Inițial, modulația GFSK era singura schemă de modulație disponibilă, iar ulterior, cu introducerea Bluetooth 2.0+EDR, modulația π/4-DQPSK și 8DPSK a fost disponibilă între aparatele combatibile.[9]
Specificațiile modului bluetooth BTBee HC-06 sunt:
Are un modul de EDR și gama de schimbare a modulației : 2Mbps-3Mbp
Are antenă proprie de 2.4 GHz
Poate lucra la voltaj mic(3.1V – 4.2V)
Port HCI standard(UART sau USB)
Protocol USB: USB 1.1, combatibil cu 2.0
Este făcut prin procesul RoSH
Are un dispozitiv de emisie-recepție de 2.4 GHz
Se bazează pe tehnologia CSR BC04
Are funcție de salt în frecvență
Este mic(27mm x 13mm x 2mm)
Circuitul periferic este simplu
Temperatură de stocare: 40 C – 80 C, temperatură de lucru: 25 C [8]
Configurația pinilor:
Fig. 2.12 Configurația pinilor[8]
Medii de programare utilizate
MATLAB R2012b
Fig. 3.1 Logo MATLAB[10]
Pentru procesarea de imagine am folosit programul MATLAB. Acesta este un limbaj de nivel înalt și un mediu interactiv de calcul numeric, de vizualizare și de programare. Folosind MATLAB, puteți analiza datele, dezvolta algoritmi și crea modele și aplicații. Limbajul, instrumentele și funcțiile matematice interne vă permit să explorați mai multe abordări și să ajungeți la o soluție mai repede decât cu foi de calcul sau tradiționalele limbaje de programare, cum ar fi C / C + + sau Java.
Puteți utiliza MATLAB pentru o gamă largă de aplicații, inclusiv de prelucrare a semnalului și de prelucrare de comunicații, imaginii și video, de sisteme de de control, de testare și măsurare și de calcul biologic.[10]
Fig. 3.2 Capturi din program[11]
Image Processing Toolbox
Image Processing Toolbox oferă un set cuprinzător de algoritmi de referință standard și instrumente grafice de procesare a imaginii, analiză, vizualizare și algoritmi de dezvoltare. Puteți efectua îmbunătățiri ale imaginii, deblurring imagine, de detectare caracteristică, de reducere a zgomotului, segmentarea imaginilor, transformări geometrice. Multe funcții ale acestuia sunt multithread pentru a profita de multiplele nuclee ale procesoarelor.[11]
Image Processing Toolbox suportă o gamă variată de tipuri de imagini, inclusiv cu interval dinamic ridicat, rezoluție gigapixel, profil ICC incorporat și tomografic. Instrumentele grafice vă permit să explorați o imagine, să examinați o regiune de pixeli, pentru a regla contrastul, pentru a crea contururi sau histograme și pentru a manipula regiuni de interes (ROI). Cu algoritmii acestuia se pot recupera imaginile degradate, se pot detecta și măsura caracteristici, se pot analiza forme și texturi și se poate regla echilibrul culorilor.[11]
Atmel Studio 6
Fig. 3.3 Logo Atmel[12]
Pentru programarea microcontrollerului Atmega32 am utilizat software-ul ATMEL Studio 6. Acest software reprezintă platforma integrată (IDP) pentru dezvoltarea și depanarea de aplicații bazate pe Atmel ARM Cortex -M și Atmel AVR microcontroler (MCU). Atmel Studio 6 IDP vă oferă un mediu ușor de utilizat pentru a scrie, a construi și depana aplicații scrise în C / C + + sau în cod de asamblare. Atmel Studio 6 suportă toate tipurile de AVR p 8 biți și pe 32 de biți.[12]
Dezvoltare hardware
Partea hardware a proiectului este formată dintr-o cameră video, motor de curent continuu, plăcuța specifică aplicației, modul bluetooth și PC.
Schema bloc a proiectului:
Figură 4.4.1 Schema bloc
Placa specifică aplicației de față este formată din următoarele componente:
Microcontroller Atmega32 utilizat pentru programarea motorului de curent continuu
Modul Bluetooth BTBee HC-06 pentru comunicația microcontroller – PC
Motor de curent continuu 1000:1 HP, 32 RPM, utilizat pentru simularea barierei
Figură 4.4.2 Plăcuța sistemului
Descrierea circuitului electric al aplicației
Figură 4.4.3 Circuitul electric al plăcuței cu microcontroller
În figura prezentată în pagina anterioară se poate observa schema electrică a plăcii aplicației. Stabilizatorul de tensiune preia tensiunea de intrare de la o baterie de 9V și furnizează la ieșire tensiune de 5V. Intrarea și ieșirea sunt protejate cu condensatori cu valori de 10µF fiecare.
Figură 4.4.4 Schema LM7805( de la 9V la 5V)
Piesa centrală a circuitului este microcontrollerul Atmega32, în capsulă PDIP cu 40 de pini. Micrcontrollerul este alimentat de la ieșirea de 5V a stabilizatorului LM7805, care se leagă la pinul 10(VCC). Pinul 10(VCC) este legat la rândul lui la pinul 30(AVCC). Cei doi pini de masă ai microcontrollerului, pinul 11 și pinul 31, se conectează între ei și legatura lor comună se leagă la masa circuitului.
Pentru programarea microcontrollerului Atmega32 am folosit programatorul USBASP.
Figură 4.4.5 Schemă circuit USBASP
Pentru a programa microcontrollerul conectăm pinii programatorului la pinii microcontrollerului după cum urmează: pinii programatorului 1(MOSI), 5(RESET), 7(SCK), 9(MISO) se conectează la pinii corespunzători ai microcontrollerului,respectiv pinii 6(MOSI), 9(RESET), 8(SCK), 7(MISO). De asemenea, masa programatorului, reprezentată de pini 8 și 10 conectați între ei, se leagă la masa circuitului.
Pentru realizarea comunicării microcontrollerului cu PC-ul am utilizat modulul Bluetooth BTBee HC-06. Pentru alimentarea modului este nevoie de o tensiune cuprinsă între 3.1V și 4.2V. Pentru alimentarea modului am folosit cu regulatorul reglabil de tensiune LM317T. Circuitul din figura următoare furnizează la ieșire o tensiune de 3.4V:
Figură 4.4.6 Schemă LM317T( de la 5V la 3.4V)
LM317T este un regulator variabil de tensiune cu e ieșiri. LM317T dezvoltă și menține un o valoare nominală de 1.25V între ieșire și terminalu e ajustare. Acest voltaj de ajustare este convertit într-un curent de programare de către R1 și acest curent constant curge prin R2 spre masă.
(4.1)
Deoarece curentul de la terminalul de ajustare (IAdj) reprezintă un termen de eroare în ecuație, LM317 a fost proiectat pentru a controla IAdj la mai puțin de 100µA și să-l păstreze constant. Pentru a face acest lucru, tot curentul de operare pasiv este întors la terminalul de ieșire. Acest lucru impune un curent de sarcină minimă. Dacă curentul de sarcină este mai mic decât această sumă minimă, tensiunea de ieșire va crește. Pe ieșire am legat un condensator de 10 µF pentru a asigura stabilitatea.
Conexiunea dintre microcontroller și modulul bluetooth se realizează după următoarea configurație: pinul TX al modului bluetooth se conectează la pinul RX al microcntorllerului(pinul 14), iar pinul RX al modului bluetooth se leagă la pinul TX al microcontrllerului(pinul 15). Pinul de RESET al modului bluetooth se conectează la pinul RESET al microcontrollerului( pinul 9). De asemenea, pentru a putea realiza conexiunea microcontrollerului cu modulul bluetooth, a fost necesara marirea frecvenței ceasului intern al microcontrollerului de la 1MHz la 8MHz. Acest lucru l-am realizat prin conectarea unui oscilator extern de 8MHz la pinii 12(XTAL1), respectiv 13(XTAL2). Acești doi pini sunt intrarea și respectiv ieșirea unui amplificator inversor care poate fi configurat sa funcționeze ca un oscilator intern. La ieșirea din oscilatorul extern am legat câte un condensator ceramic de 10nF pe fiecare pin.
Figură 4.4.7 Schemă conectare oscilator extern la Atmega32[6]
Pentru comanda motorului de curent continuu de către microcontroller am utilizat un driver de motor L298N.
Figură 4.4.8 Driver motor L298N
Rolul acestui driver este de a limita curentul primit de motor. Pentru a comanda sensul motorului am folosit pinii de intrare Input 1 și Input 2, conectați la microcontroller la pinii 16 și 17. Cei doi pini aparțin punții A, care se activează cu Enable A, legat la microcontroller la pinul 18. Pentru conectarea la motor am utilizat pinii de ieșire Output 1 și Output 2. Pentru alimentarea driverului de motor se unește pinul Logic Supply Voltage Vss cu pinul Supply Voltage Vs. Această conexiune se leagă la o tensiune de 5V. Pentru legarea la masă se unesc pinii Current Sensing A și GND, iar legătura lor comună se conectezaă la masa circuitului.
Camera Microsoft LifeCam NX-3000 și PC-ul Acer Aspire
Pentru achiziția imaginilor am folosit camera Microsoft LifeCam NX-3000. Senzorii acestei camere sunt de tip CMOS. Rezoluția de înregistrare video este 640×480, ceea ce reprezintă un avantaj pentru cazul de față deoarece, având o rezoluție mică, există mai puțin zgomot în imagine. Având zgomot putin, procesarea imaginii este mai bună.
Figură 4.4.9 Microsoft LifeCam NX-3000
Imaginile sunt preluate pentru procesare de laptopul Acer Aspire V3-571G prin intermediul conexiunii de tip USB. Laptopul are un procesor Intel Core I5 de 2.6 GHz, memoria RAM de tip DDR3 cu o capacitate de 4 GB. Aceste caracteristici s-au dovedit a fi optime pentru implementarea acestui sistem.
Figură 4.4.10 Laptopul Acer Aspire V3-571G
Dezvoltare software
Scopul acestei lucrări a fost de a construi o aplicație care recunoaște în timp real numerele de înmatriculare ale vehiculelor la intrarea într-o zonă de parcare dotată cu bariera la intrare. Sistemul, bazat pe un PC, o cameră video, face capturi de cadre video, care includ plăcuța de licență a mașinii și le procesează. Dată o plăcuță de înmatriculare este detectată, caracterele sale sunt recunoscute, afișate pe interfața cu utilizatorul și verificate cu o bază de date.
Schema logică:
Implementare MATLAB
Pentru implementarea algoritmului de recunoaștere a numărului de înmatriculare am folosit programul MATLAB. Algoritmul folosește diverse funcții interne Matlab, dar și diverse rutine implementate legate de procesarea imaginii. După ce algoritmul a fost dezvoltat, acesta a fost testat pe mai multe capturi de imagine care conțineau plăcuța de înmatriculare.
Etapele de bază ale implementării algoritmului sunt prezentate în schema de mai jos:
Achiziția imaginii
Faza inițială de procesare a imaginilor pentru recunoașterea numărului de înmatriculare este de a obține imagini ale vehiculelor. Dispozitive electronice, cum ar fi optica (digital / video) camera, camera web, etc pot fi folosite pentru a captura imagini. Pentru acest proiect, imaginile vehicule vor fi luate cu camera Microsoft LifeCam NX-3000. Imaginile sunt capturate de camera digitală de la o distanță de 1.5m de vehicul, la o rezoluție de 640×480. Au fost realizate poze la mașini de culori diferite.
Figură 5.1 Imagine 1
Figură 5.2 Imagine 2
Figură 5.3 Imagine 3
Conversia imaginii color – gri
Algoritmul descris aici este independent de tipul de culori din imagine și se bazează în principal pe nivelul de gri al unei imagini pentru prelucrarea și extragerea informațiilor cerute. Componentele de culoare, cum ar fi rosu, verde și albastru nu sunt utilizate în totalitate în acest algoritm. Deci, în cazul imaginii de intrare, aceasta este o imagine colorată reprezentată de o matrice tridimensionala în MATLAB. Acesta este convertită la o imagine gri bidimensională înainte de continuarea prelucrării. Eșantionul imaginii de gri este prezentat mai jos:
Figură 5.4 Imaginea convertită la gri
Cod sursă Matlab:
grayImg = rgb2gray(img); %convertire in grayscale
[h, w] = size(grayImg); %parametri imagine
img = adapthisteq(grayImg); %egalizare histograma
Procesarea marginilor orizontale și verticale ale imaginii
Histograma este un grafic reprezentând valorile unei cantități variabile peste un anumit gamă. În acest algoritm de detectare a numărului de înmatriculare, am folosit histograma orizontală și histograma verticală, ceea ce reprezintă histograma de coloană și respectiv de rând. Aceste histograme reprezinta suma diferențelor de valori de gri între vecinii din imagine, pe coloane și de rând. În etapa de mai sus, mai întâi se calculează histograma orizontală. Pentru a găsi histograma orizontală, algoritmul parcurge fiecare coloană a unei imagini. În fiecare coloană, algoritmul începe cu al doilea pixel din partea de sus. Diferența dintre al doilea și primul pixel este calculată. Dacă diferența depășește un anumit prag, se adaugă la suma totală de diferențe. Apoi, algoritmul se va deplasa în jos pentru a calcula diferența dintre al treilea și al doilea pixel. Tot așa, se deplasează până la sfârșitul unei coloane și calculează suma totală a diferențelor dintre pixeli vecini. La sfârșit, o matrice care conține suma coloanelor este creată.Același proces este efectuat pentru a găsi histograma verticală. În acest caz, sunt prelucrate rândurile și nu coloanele. În figurile de mai jos se poate observa că histogramele difera în funcție de imagine.
Figură 5.2 Procesare margine orizontală imagine 1
Figură 5.3 Procesare margine verticală imagine 1
Figură 5.4 Procesare margine orizontală imagine 2
Figură 5.5 Procesare margine verticală imagine 2
Cod sursă Matlab:
title('Histograma procesarii marginii orizontale');
xlabel('Numar coloana ->');
ylabel('Diferenta ->');
sum = 0;
hor = hor1;
for i = 11:(w-11)
sum = 0;
for j = (i-10):(i+10)
sum = sum + hor1(j);
end
hor(i) = sum / 21;
end
Pentru histograma procesarii marginii verticale codul este similar, procesarea realizându-se pe rânduri.
Trecerea histogramelor printr-un filtru digital trece-jos
Referindu-mă la figurile de mai jos, se poate vedea că valorile histogramei sunt schimbate în mod radical între coloanele și rândurile consecutive. De aceea, pentru a preveni pierderea de informații importante în pașii următori, este recomandabil pentru a netezi aceste modificări drastice ale valorilor histogramei. De asemenea, histograma este trecută printr-un filtru digital trece-jos. În timp ce se efectuează acest pas, fiecare valoare a histogramei este mediată având în vedere valorile de pe partea dreaptă și de pe partea stângă. Această etapă se realizează atât pe histograma orizontală precum și pe histograma verticală. Mai jos sunt cifrele arătând histograma înainte de a trece printr-un filtru digital trece-jos și după ce trece printr-un filtru digital trece-jos.
Figură 5.6 Histograma orizontală după trecerea prin filtru trece-jos imagine 1
Figură 5.7 Histograma orizontală după trecerea prin filtru trece-jos imagine 2
Figură 5.8 Histograma verticală după trecerea prin filtru trece-jos imagine 1
Figură 5.9 Histograma verticală după trecerea prin filtru trece-jos imagine 2
Figură 5.10 Histograma orizontală dupa filtrare imagine 1
Figură 5.11 Histograma orizontală dupa filtrare imagine 2
Figură 5.12 Histograma verticală dupa filtrare imagine 1
Figură 5.13 Histograma verticală dupa filtrare imagine 2
Cod sursă Matlab:
title('Histograma dupa trecerea prin filtru trece-jos');
xlabel('Numar coloana ->');
ylabel('Diferenta ->');
for i = 1:w
if(hor(i) < average)
hor(i) = 0;
for j = 1:h
img(j, i) = 0;
end
end
end
title('Histograma dupa filtrare');
xlabel('Numar coloana ->');
ylabel('Diferenta ->');
diff = 0;
totalSum = 0;
diff = uint32(diff);
maximum = 0;
maxVer = 0;
for i = 2:h
sum = 0;
for j = 2:w
if(img(i, j) > img(i, j-1))
diff = uint32(img(i, j) – img(i, j-1));
end
if(img(i, j) <= img(i, j-1))
diff = uint32(img(i, j-1) – img(i, j));
end
if(diff > 30)
sum = sum + diff;
end
end
ver1(i) = sum;
if(sum > maximum)
maxVer = i;
maximum = sum;
end
totalSum = totalSum + sum;
end
average = totalSum / (h-300);
Pentru filtrarea histogramei marginii verticale codul este similar.
Eliminarea regiunilor nedorite din imagine
Odată ce histogramele sunt trecute printr-un filtru digital trece-jos, este aplicat un filtru pentru a elimina zonele nedorite dintr-o imagine. În acest caz, zonele nedorite sunt rândurile și coloanele cu valori scăzute ale histogramei. O valoare scăzută a histogramei indică faptul că o parte din imaginea conține variații foarte mici între vecini. Deoarece regiunea cu numărul de înmatriculare conține un fundal simplu cu caractere alfanumerice în ea, diferența dintre pixelii vecini, mai ales la marginile caracterelor de pe placă, va fi foarte mare. Aceasta duce la o valoare ridicată a histogramei pentru această parte a imagini.
Prin urmare, regiunea probabilă cu plăcuța de înmatriculare are valori mari ale histogramelor orizontală și verticală. Zonele cu o valoare mai mică sunt, astfel, nenecesare. Aceste zone sunt eliminate din imagine prin aplicarea unui prag dinamic. În acest algoritm, pragul dinamic este egal cu valoarea medie a unui histograme. Histogramele atât orizontale cât și verticale sunt trecute printr-un filtru cu prag dinamic. Rezultatul acestui proces este histograma regiunii cu probabilitatea cea mai mare de a conține numărul de înmatriculare.
Figură 5.14 Regiune nesegmentată cu probabilitate sa conțină număr de înmatriculare
Cod sursă Matlab:
Bordare pentru eliminarea zonelor cu interes scazut
for i=1:150
img(i,:) = 0;
end
for i=h – 150:h
img(i,:) = 0;
end
for i=1:200
img(:,i) = 0;
end
for i =w – 200:w
img(:,i) = 0;
end
maxHor = 0;
maximum = 0;
for i = 2:w
sum = 0;
for j = 2:h
if(img(j, i) > img(j-1, i))
diff = uint32(img(j, i) – img(j-1, i));
else
diff = uint32(img(j-1, i) – img(j, i));
end
if(diff > 30)
sum = sum + diff;
end
end
hor1(i) = sum;
Segmentarea
Următorul pas este de a găsi toate regiunile într-o imagine care au probabilitate mare să conțină un număr de înmatriculare. Coordonatele tuturor acestor regiuni probabile sunt stocate într-o mulțime.
Figură 5.15 Regiuni probabile cu număr de înmatriculare 1
Figură 5.16 Regiuni probabile cu număr de înmatriculare 2
Figură 5.17 Regiuni probabile cu număr de înmatriculare 3
Se poate observa că procesarea depinde de la mașină la mașină. Dupa cum se poate vedea în imaginile de mai sus, în primele doua poze s-au găsit mai multe zone probabile, pe când la ultima imagine s-a găsit o singuă zonă probabilă, aceea fiind chiar numărul de înmatriculare.
Cod sursă Matlab:
[~, w] = size (col);
if(mod(w, 2))
col(w+1) = w;
end
[~, h] = size (row);
if(mod(h, 2))
row(h+1) = h;
end
Extragerea regiunii de interes
Rezultatul procesului de segmentare reprezintă toate regiunile care au maxim de probabilitate de a conține un număr de înmatriculare. Din aceste regiuni, una cu valoarea maximă a histogramei este considerată ca fiind candidatul cel mai probabil pentru numărul de înmatriculare. Toate regiunile sunt prelucrate pe rând și pe coloană pentru a găsi un spațiu comun cu valoarea maximă a histogramei orizontale și verticale. Această regiune are cea mai mare probabilitate de a conține un număr de înmatriculare. Imaginea detectată cu numărul de înmatriculare este prezentată de mai jos:
Figură 5.18 Plăcuță număr detectată
Cod sursă Matlab:
for i = 1:2:h
for j = 1:2:w
if(~((maxHor >= col(j) && maxHor <= col(j+1)) && (maxVer >=row(i) && maxVer <= row(i+1))))
for m = row(i):row(i+1)
for n = col(j):col(j+1)
img(m, n) = 0;
end
end
end
end
end
Extracția caracterelor
Pentru extragerea cât mai eficență a caracterelor se face o binarizare cu un prag de 0.5 a imaginii numărului de înmatriculare.
Figură 5.19 Binarizare număr înmatriculare
Cod sursă Matlab:
edgeImg = edge(img, 'canny', 0.5);
edgeImg = mat2gray(edgeImg);
edgeImg = conv2(edgeImg,[1 1;1 1]); %convolutie pente evidentierea muchiilor
edgeImg = imadjust(edgeImg,[0.5 0.7],[0 1],0.1); %ajustarea intensitatii
logImg = im2bw(edgeImg); %binarizare
erImg = imerode(logImg,strel('line',50,0)); %eliminare linii orizontale
subImg = imsubtract(logImg,erImg);
fillImg = imfill(subImg,'holes'); %umplere goluri
thinImg = bwmorph(fillImg,'thin',1); %subtiere pentru evidentierea caracterelor
thinImg = imerode(thinImg,strel('line',3,90)); %eliminare zgomot vertical
finalImg = bwareaopen(thinImg,100); %eliminarea grupuri cu numar sub 100px
elem = regionprops(finalImg,'BoundingBox','Image'); %identificare elemente individuale din imagine
Înainte de algoritmul de recunoaștere, caracterele sunt normalizate. Pentru a normaliza caracterele mai întâi aplicăm filtru pentru detectarea de muchii de tip „canny” cu prag de 0.5, după care evidențiem muchiile prin convoluție cu o mască pătratică și se ajustează intensitatea acestora.
Figură 5.20 Imagine ajustată
Pentru a elimina liniile orizontale și verticale din imagine ce pot afecta extracția caracterelor din imaginea procesată anterior se scade aceeași imagine erodată cu o mască liniară de 50 de pixeli.
Ultimile operații aplicate imaginii presupun umplerea golurilor din imagine în cazul caracterelor care nu sunt complete și apoi se subțiază pentru evidențierea caracterelor.
Figură 5.21 Umplere goluri și subțiere caractere
Această normalizare este necesară pentru a le potrivi cu șabloanele caracterelor. Șabloanele acestor carctere sunt create după numerele românești de înmatriculare.
Figură 5.22 Șabloane de caractere
Există doua excepții, la caracterele „ I” șo „1”, unde pentru a le putea proporționa la dimensiunea standard a celorlalte caractere am aplicat o margine de culoare neagră.
Figură 5.23 Litera „I” fără margine
Figură 5.24 Litera „I” cu margine
Cod sursă Matlab:
pos = 0; %numarul caracterului
for i = 1:length(elem)
[h, w] = size(elem(i).Image); %parametrii caracter
if ((h >= 20) && (w >= 5)) && ((h <= 35) && (w <= 30))
%eliminare artefacte inadecvate
pos = pos + 1;
el = elem(i).Image;
if (w >= 5) && (w <= 10) %bordare pentru caractere inguste (i, 1)
blank = zeros(36, 32);
row = fix(w/2);
col = fix(h/2);
sr = 18 – col;
sc = 16 – row;
blank(sr:sr+h-1, sc:sc+w-1) = el;
el = blank;
end
ch = charDetect(el, pos);
plate = strcat(plate,ch); %concatenare numar inmatriculare
end
end
Pentru identificarea caracterelor am creat doua baze de date, una conținând litere(fillchar3.mat), iar cealaltă numai cifre (num5.mat). Pentru a crea cele două baze de date am folosit un algoritm de recunoaștere a caracterelor folosind analiza neuronală.[13]
În continuare voi prezenta principul acestui algoritm.
Primul pas al acestui algoritm îl reprezintă digitizarea imaginii șablonului, care este un pas important înainte de analiza neuronală. Procesul de digitizare este important pentru rețele neuronale utilizate în sistem. În acest proces, imaginea de intrare este eșantionată într-o fereastră binară care formează elementul pentru sistemul de recunoaștere.
Figură 5.25 Digitizarea caracterului
În figura de mai sus, litera „A” a fost digitalizată în 6X8 = 48 celule digitale, fiecare având o singură culoare, fie negru, fie alb. Acest lucru este important pentru că ne ajută să codificăm informația într-o formă semnificativă pentru computer. Pentru aceasta, se atribuie o valoare de 1 fiecărui pixel negru și 0 pentru fiecare pixel alb și se crează matricea binară „I”, care este prezentată în Fig. (4.22.c). După acest proces urmează analiza neuronală.[14] Caracterul A este prezentat sistemului și i se atribuie o etichetă specială. Mai multe variante ale aceluiași caracter sunt predate sistemului sub aceeași etichetă. Sistemul învață mai multe variații ale unui singur model. În timpul procesului de învățare elementul de intrare este reprezentat de matricea M definită astfel:
If I(i,j) = 1 Then M(i,j) =1
Else
If I(i,j) =0 Then M(i.j) = -1
Matricea M este acum setată ca intrare pentru sistemul de analiză neuronală. În această metodă, fiecărui caracter îi corespunde o matrice de pondere. Pentru fiecare caracter care urmează să fie învățat, matricea de pondere este notată cu W. Pe măsură ce procesul de învățare progresează, matricea de pondere se actualizează. La începutul procesului de învățare, matricea este inițializată cu 0. Matricea de pondere se actualizează după cum urmează:
For all i=1 to x
{
fir all j=1 to y
{
W(i,j) = W(i,j) + M(i,j)
}
}
Aici „x” și „y” reprezintă dimensiunile matricii W, respectiv M.[14]. În figura următoare sunt prezentate trei modele de intrare propuse sistemul pentru învățare.
Figură 5.26 Modele diferite propuse spre învățare[14]
Figură 5.27 Matricea pondere pentru litera „S”[14]
În această matrice, elementele cu valori mari sau pozitive reprezintă pixelii care apar mai des în imagine, iar valorile mici reprezintă pixeli care apar foarte rar în imagine.
Ponderile matricii reprezintă prioritatea unui parametru, care în cazul de față este apariția unui pixel în forma caracterului. Se poate vedea ca greutățile pixelilor mai frecvenți sunt mai mari și de obicei pozitive, iar la pixelii mai puțin frecvenți valorile ponderilor sunt mai mici, chiar negative. De aceea matricea acordă importanță mai mare pixelilor mai frecvenți și cu valori mai mari.[14]
Verificarea și reînnoirea bazei de date
Ultima etapă o constituie verificarea numărului obținut cu o bază de date creată.
Figură 5.9 Baza de date
La rularea softului prin comanda „PlateTrack” va apărea o interfață unde vor fi disponibile trei butoane principale: încarcare, verificare, adăugare.
Figură 5.10 Interfață soft
La apăsarea butonului „Incarcare” se va deschide folderul unde avem salvate poze ale mașinilor și vom alege una dintre acestea pentru procesare. După procesare, figura anterioară va arăta astfel:
Figură 5.11 Interfața după procesare
Procesarea fiind terminată, se va verifica existența numărului de înmatriculare în baza de date prin apăsarea butonului „Verificare”. Dacă numărul verificat se află în baza de date, atunci softul va lansa comanda de deschidere a barierei, iar în caz contrar se va aprinde un bec roșu.
În cadrul acestei se va realiza comunicația serială. Comanda serial('PORT') construiește un obiect de tip port serial asociat portului PORT. Dacă acest PORT nu există sau este deja folosit nu se poate face conexiunea obiectului de tip port serial cu dispozitivul. Pentru a comunica cu dispozitivul, obiectul trebuie conectat la portul serial cu funcția FOPEN. După ce se crează obiectul, statusul acestuia va fi închis. Odată ce obiectul se conectează la portul serial prin funcția FOPEN, statusul este configurat ca deschis.
handles.output = hObject;
instrreset;
handles.s = serial('COM16');
disp('Serial Created');
fopen(handles.s);
disp('Serial Started');
Butonul „Adaugare” va permite adăugarea unui nou număr de înmatriculare în baza de date.
Programare microcontroller
Pentru programarea microcontrollerului am folosit programatorul Usbasp și mediul de programare Atmel Studio 6. Rolul microcontrollerului este de a seta direcțiile de mers ale motorului la activarea barierei și de a aprinde un led roșu în cazul în care bariera nu se activează. De asemenea, prin microcontroller se va realiza și comunicația plăcuței cu PC-ul cu ajutorul modului bluetooth.
Codul generat pentru a realiza funcțiile de mai sus este următorul:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define F_CPU 8000000UL //Defineste viteza ceasului
#define USART_BAUDRATE 9600 //rata de baud pentru comunicatia seriala
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) – 1)
//rutina de intrerupere pentru comunicatia seriala (ruleaza de fiecare data cand un byte este primit)
ISR(USART_RXC_vect)
{
char ReceivedByte;
ReceivedByte = UDR; // achizitionare byte de la portul serial (modulul bluetooth)
UDR = ReceivedByte;
switch (ReceivedByte) //care caracter ASCII a fost primit?
{
case 'U': PORTD &= ~(1<<PD2) & ~(1<<PD3) & ~(1<<PD5) & ~(1<<PD4); //reseteaza la 0 pini de iesire
PORTD |= (1<<PD2) | (1<<PD4); //porneste motoru in directia sus
_delay_ms(2500);
PORTD &= ~(1<<PD2) & ~(1<<PD3) & ~(1<<PD5) & ~(1<<PD4); //reseteaza la 0 pinii de iesire
_delay_ms(10000);
PORTD |= (1<<PD3) | (1<<PD4); //porneste motoru in directia jos
_delay_ms(2500);
PORTD &= ~(1<<PD2) & ~(1<<PD3) & ~(1<<PD5) & ~(1<<PD4); //resteaza pinii de iesire la 0
break;
case 'B': PORTD &= ~(1<<PD2) & ~(1<<PD3) & ~(1<<PD5) & ~(1<<PD4); //resteaza pinii de iesire la 0
PORTD |= (1<<PD5); // aprinde led
_delay_ms(5000);
PORTD &= ~(1<<PD5);// reseteaza la 0 pinu de iesire
_delay_ms(3000);
PORTD |= (1<<PD5);
_delay_ms(5000);
PORTD &= ~(1<<PD5);
break;
Secvența de mai jos pornește rutina de întreruperi pentru comunicația cu bluetooth:
//initializare I/O
DDRD |= (1<<PD2) | (1<<PD3) | (1<<PD4) | (1<<PD5); // pinii DIR1, DIR2 si Enable setati ca iesire
PORTD=0; //toti pini sunt initializati cu 0
//UART
UCSRB |= (1 << RXEN) | (1 << TXEN); //activeaza Tx si Rx
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
UBRRL = BAUD_PRESCALE;
UBRRH = (BAUD_PRESCALE >> 8); // registrii ratei de baud
UCSRB |= (1 << RXCIE); // activeaza receptia de intrupere USART (USART_RXC)
sei(); //activeaza intreruperea globala
while(1);
return 0;
}
Concluzii
În această lucrare am prezentat un sistem de acces automatizat bazat pe o aplicație software de detectare a numărului de înmatriculare și de verificare a numărului detectat într-o bază de date. Prima dată se extrage locația plăcuței de înmatriculare, apoi se extrag caracterele de pe plăcuță și în final identificarea caracterelor cu ajutorul analizei neuronale. Dacă detecția este corectă și numărul de înmatriculare există în baza de date, se permite accesul.
Acest sistem a fost testat pe capturi statice ale vehiculelor cu rezultate foarte bune. Capturile foto au fost realizate în diferite condiții de lumină. Sistemul a fost proiectat să detecteze numerele de înmatriculare ale vehiculelor din România. Acest sistemul are o limitare în partea de recunoaștere a caracterelor. Algoritmul prezentat în lucrare a fost proiectat sa recunoască cu precizie doar caracterele numerelor de înmatriculare ale vehiculelor care nu provin din București.
Pentru realizarea sistemului au fost utilizate surse de informație din domeniul procesării de imagine, programarea microcontrollerelor, dar și comunicație bluetooth. Proiectarea software s-a realizat folosind mediile de programere MATLAB, pentru procesarea imaginii, respectiv Atmel Studio, pentru programarea microcontrollerului. Pentru realizarea circuitului electric s-a folosit programul Proteus Professional 7, un mediu de proiectare foarte complex.
Dezvoltări ulterioare
Proiectul prezentat poate fi dezvoltat în câteva moduri, prezentate mai jos:
Îmbunătățirea algoritmului de detectare a caracterelor pentru identificarea plăcuțelor de înmatriculare aparținând altor țări
Proiectarea sistemului astfel încât identificarea numărului de înmatriculare să se realizeze de la o distanță mai mare de 1.5 m
Utilizarea unei camere de supraveghere cu infraroșu pentru detectarea plăcuțelor de înmatriculare și pe timp de noapte
Proiectarea sistemului pentru a fi utilizat și în alte scopuri, cum ar fi controlul traficului
Anexă
Aplicații folosite în realizarea proiectului de diplomă
MATLAB R2012b
Atmel Studio 6
WinAVR
SinaProg 2.0
Proteus 7 Professional
Adobe Photoshop 6
Microsoft Word
Bibliografie
[1] http://www.equasys.de/colorformat.html
[2] Tonku Acharya and Ajoy K. Ray, Image processing, principles and applications
[3]http://research.philadelphia.edu.jo/313/1/Lecture_2_Fundamental_Steps_in_Digital_Image_Processing.pdf
[4] P.N Borza, C. Gerigan, P. Ogruțan, Gh. Toacșe, Microcontrollere – Aplicații, Editura Tehnică, București, 2000
[5] http://www.promelec.ru/pdf/atmega32a.pdf
[6] http://www.globalspec.com/learnmore/motion_controls/motors/dc_motors
[7] http://www.pololu.com/catalog/product/1595
[8] http://elecfreaks.com/store/download/datasheet/Bluetooth/HC-06-Spec.pdf
[9]http://www.radio-electronics.com/info/wireless/bluetooth/radio-interface-modulation.php
[10] http://www.mathworks.com/products/datasheets/pdf/matlab.pdf
[11]http://www.mathworks.com/products/datasheets/pdf/image-processing-toolbox.pdf
[12] http://www.atmel.com/microsite/atmel_studio6/
[13]http://www.mathworks.com/matlabcentral/fileexchange/19551-character-recognition-using-neural-networks/content/gskmadechar/gskmadechar.m
[14] http://arxiv.org/ftp/cs/papers/0505/0505016.pdf
[15] Csaba Kertesz, Suport de curs procesare imagine
Bibliografie
[1] http://www.equasys.de/colorformat.html
[2] Tonku Acharya and Ajoy K. Ray, Image processing, principles and applications
[3]http://research.philadelphia.edu.jo/313/1/Lecture_2_Fundamental_Steps_in_Digital_Image_Processing.pdf
[4] P.N Borza, C. Gerigan, P. Ogruțan, Gh. Toacșe, Microcontrollere – Aplicații, Editura Tehnică, București, 2000
[5] http://www.promelec.ru/pdf/atmega32a.pdf
[6] http://www.globalspec.com/learnmore/motion_controls/motors/dc_motors
[7] http://www.pololu.com/catalog/product/1595
[8] http://elecfreaks.com/store/download/datasheet/Bluetooth/HC-06-Spec.pdf
[9]http://www.radio-electronics.com/info/wireless/bluetooth/radio-interface-modulation.php
[10] http://www.mathworks.com/products/datasheets/pdf/matlab.pdf
[11]http://www.mathworks.com/products/datasheets/pdf/image-processing-toolbox.pdf
[12] http://www.atmel.com/microsite/atmel_studio6/
[13]http://www.mathworks.com/matlabcentral/fileexchange/19551-character-recognition-using-neural-networks/content/gskmadechar/gskmadechar.m
[14] http://arxiv.org/ftp/cs/papers/0505/0505016.pdf
[15] Csaba Kertesz, Suport de curs procesare imagine
Anexă
Aplicații folosite în realizarea proiectului de diplomă
MATLAB R2012b
Atmel Studio 6
WinAVR
SinaProg 2.0
Proteus 7 Professional
Adobe Photoshop 6
Microsoft Word
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: Medii de Programare Pentru Procesarea de Imagine (ID: 107339)
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.
