Aplicatie Mobila Android Ce Implementeaza Detectarea Faciala

Proiect de practica

Aplicatie mobila Android ce implementeaza detectarea faciala

Rosoiu Ondina

Grupa 1097

Bucuresti 2016

Definirea problemei

Pentru realizarea proiectului de Practica am ales sa realizez o aplicatie mobila android care implementeaza detectarea faciala a unor persoane. Aplicatia poarta numele OpenCvFaceRec si va detecta fetele persoanelor din diferite poze, pozele fiind adaugate in aplicatie din galeria foto a dispozitivului android sau va detecta atat fetele, cat si ochii, in timp real cu ajutorul camerei. Dupa ce poza a fost introdusa in aplicatie, urmeaza sa se aplice algoritmul de detectare faciala pentru a returna utilizatorului un mesaj cu numele persoanei din poza. Am ales aceasta tema deoarece cel mai mult timp petrecut pe telefon sau tableta il aloc aplicatiilor care utilizeaza detectare si recunoastere faciala pentru editare poze sau doar pentru divertisment.

Consider ca este un domeniu foarte interesant care poate fi folosit in variate moduri, iar in ultimii ani se cauta dezvoltarea detectarii si recunoasterii faciale din ce in ce mai mult fiind folosite intr-o gama larga de aplicatii, cum ar fi: aplicatii care dupa introducerea pozei dorite de utilizator(fie din galerie, fie cu ajutorul camerei) au functionalitati de a schimba culoarea ochilor, de a colora buzele in diferite culori, de a colora tenul in diferite tonuri, aplicatii amuzante care prin introducerea unei poze in care sunt doua persoane inverseaza fetele acestora, sau ofera utilizatorului posibilitatea sa se deghizeze sub diferite animatii care sunt disponibile in aplicatie. De asemenea mi se par foarte distractive, dar in acelasi timp si motivationale aplicatiile care afiseaza utilizatorului cum ar arata gras, mai slab, fumator pentru 20 de ani si asa mai departe.

Aplicatia este destiata persoanelor care doresc sa experimenteze detectarea unor prieteni, fie dintr-o imagine introdusa din galeria foto a dispozitivului, fie utilizand camera unde atat fata cat si ochii persoanei sunt detectati si urmariti in timp real. Utilizatorul trebuie atentionat care este modul de fuctionare al aplicatiei si care sunt rezultatele care ar trebui sa le primeasca. Asadar, in descrierea aplicatiei trebuie precizat faptul ca aplicatia detecteaza fetele persoanelor doar in situatia in care fetele sunt pozate sau vizualizate prin intermeiul camerei doar din pozitie frontala.

Pentru o buna functionare a aplicatiei, utilizatorul este indrumat pe parcursul folosirii aplicatiei cu mesaje afisate pe ecran dupa fiecare pas pe care il parcurge.

Analiza mecanismului economic

Orice aplicatie mobila android este foarte importanta in mediul economic, deoarece aduce beneficii atat utilizatorului cat si celui care o implementeaza. Cu cat este implementata mai corect, cu atat oamenii au satisfactia utilizarii unei aplicatii de calitate care le ofera informatia dorita, iar dezvoltatorul are meritul atat financiar cat si satisfatia multumirii utilizatorilor.

In baza mai multor statistici sunt de parere ca cel mai important este sa oferim ultilizatorilor o experinta gratuita care consta in posibilitatea de a utiliza aplicatia pentru a detecta fetele a unui numar de 10 persoane diferite pentru a oferi utilizatorului ocazia sa descopere cum functioneaza aplicatia si cat de corecte sunt rezultatele pe care acesta le primeste. In functie de aprecierea utilizatorului, acesta poate plati 1 euro pentru a cumpara pachetul nelimitat de detectare faciala. Perioada care acorda utilizatorilor posibilitatea de a exersa functionalitatea aplicatiei gratuit este benefica dezvoltatorului pentru a cunoaste care sunt asteptarile, iar in felul acesta o poate imbunatati in functie de sugestiile primite. Cu cat este mai apreciata de catre unu numarul cat mai larg de persoane, cu atat satisfactia dezvoltatorului in urma realizarii unei aplicatii de calitate este mai mare.

Grupul tinta este format din persoane care, in primul rand, folosesc dispozitive android, tableta sau telefon care doresc sa exprimenteze aplicatii care implementeaza detectare faciala, acest domeniu fiind unul intr-o continua dezvoltare si foarte cautat atat de dezvoltatorii de aplicatii cat si de public.

Despre detectarea faciala

Detectare fetei este o tehnologie care este utilizata intr-o varietate de aplicatii care identifica fetele umane in imagini digitale. De asemenea, se refera la procesul psihologic prin care oamenii detecteaza fetele intr-o scena vizuala. Detectare faciala poate fi considerata ca fiind un caz specific al clasei de detectare a obiectelor. In clasa de detectare a obiectelor, sarcina este de a gasi locatiile si dimensiunile tuturor obiectelor dintr-o imagine care apartin unei anumite clase (pietoni, masini, numere inmatriculare).

Detectarea faciala folosind clasificatori de tip cascada Haar este o abordare bazata pe masina de invatare in care o functie in cascada este antrenata dintr-o multime de imagini pozitive si negative. Aceasta este apoi utilizata pentru a detecta fetele in alte imagini. Initial, algoritmul are nevoie de o multime de imagini pozitive (imagini ale fetelor) si imagini negative (imagini fara fete), pentru a instrui clasificatorul. Apoi, trebuie sa extragem caracteristici din ea. O fata poate fi detectata doar din pozitia frontala si daca este complet vizibila.

Preprocesarea imaginilor este formata din trei etape:

1. conversia imaginii de intrare care este colorata in tonuri de gri (necesar pentru egalizarea ulterioara si detectarea Haar)

2. scalare pentru a reduce dimensiunea imaginii (si, prin urmare, reducerea timpului de detectie)

3. egalizarea tonurilor de gri care presupune analizarea tuturor valorilor de tonuri de gri ale imaginii si le largeste pentru a acoperi mai mult din intervalul total de la negru la alb. Rezultatul este o imagine cu contraste mari intre zonele umbrite in mod similar, ceea ce face mai usor de detectare a fetelor mai tarziu.

Clasificatorii cascada Haar

In primul rand, un clasificator este instruit pentru a detecta obiecte rigide, cum ar fi masini, motociclete si parti ale corpului uman, cum ar fi fata, numite exemple pozitive, care sunt scalate la aceleasi dimensiuni (ex: 20×20), cat si negative exemple – imagini arbitrare de aceeasi marime.

O buna pregatire presupune folosirea multor mii de imagini pozitive de inalta calitate. Pentru detectarea fetei, acest lucru inseamna imaginile cu fetele persoanelor pozate de aproape. Ochii, nasul si gura ar trebui sa fie toate in aproximativ aceeasi pozitie pe toate imaginile, iar imaginile ar trebui sa fie de aceeasi dimensiune. De asemenea, este nevoie instruirea clasificatorul cu un numar similar de imagini negative (imagini fara fete)

Dupa ce un clasificator este antrenat, acesta poate fi aplicat intr-o regiune de interes (de aceeasi marime ca atunci cand au fost folosite in timpul formarii) intr-o imagine de intrare. Clasificatorul emite un "1" in cazul in care regiunea este probabil sa apara obiectul (adica, fata / masina), si "0", in caz contrar. Pentru a cauta obiectul in intreaga imagine, se poate muta fereastra de cautare in intreaga imagine si verificata fiecare locatie din aceasta folosind clasificatorul. Clasificatorul este proiectat astfel incat sa poata fi usor "redimensionat", pentru a se putea gasi obiecte de interes la diferite dimensiuni, care este mai eficienta decat redimensionarea imaginii in sine. Deci, pentru a gasi un obiect de dimensiuni necunoscute in imagine, procedura de scanare trebuie sa fie facut de mai multe ori la diferite scari pentru ca rezultatul obtinut sa fie cel corect.

Cuvantul "cascada" in numele clasificator inseamna ca clasificatorul rezultat este format din mai multi clasificatori simpli (etape) care sunt aplicati ulterior, intr-o regiune de interes, pana cand la o anumita etapa acesta este respins sau toate etapele sunt transmise. Clasificatorii in fiecare etapa a cascadei sunt ei insisi complexi si sunt construiti din clasificatorii de baza, utilizand una dintre cele patru tehnici diferite de stimulare a (vot ponderat). In prezent sunt Discrete Adaboost, Real Adaboost, Gentle Adaboost si Logitboost. Clasificatorii de baza sunt clasificatori-arbore decizionali, cu cel putin 2 frunze. Caracteristicile Haar sunt intrarile clasificatorilor de baza si sunt utilizate urmatoarele:

Caracteristica utilizata intr-un anumit clasificator este specificata de forma sa (1a, 2b etc.), pozitia in interiorul regiunii de interes si scala (aceasta scala nu este aceeasse ca cea utilizata in etapa de detectare, desi aceste doua scale sunt multiplicate). De exemplu, in cazul caracteristicii 2c, raspunsul este calculat ca diferenta dintre suma de pixeli ai imaginii sub dreptunghi care acopera intreaga caracteristica (inclusiv cele doua dungi albe si dunga neagra in mijloc), iar suma pixelilor imaginii in banda neagra inmultit cu 3, in scopul de a compensa diferentele in marimea zonelor.

Aplicatii care folosesc detectarea faciala

Tagguirea persoanelor:

Facebook este aplicatia de socializare care permite etichetarea persoanelor care se afla in poza. In momentul in care este selectata o fata, Facebookul afiseaza o lista de sugestii dintre care utilizatorul poate selecta. Pe langa detectarea faciala care este observata cu ajutorul chenarului care apare in jurul fetei, acesta foloseste si recunoasterea faciala pentru a afisa lista de sugestii.

Recunoastere faciala:

Recunoasterea faciala are la baza un sistem biometric, ce presupune recunoasterea mai multor persoane pe baza unor imagini statice care contin fetele lor. Cum imaginea este un set de pixeli ordonati, sistemul de recunoastere faciala percepe fata unei persoane ca o multime de pixeli. Sistemul de recunoastere faciala nu percepe chipul unui individ asemenea oamenilor, ci il

percepe ca pe o multime de pixeli alaturati. Asadar, esentiala in procesul de recunoastere faciala este abilitatea sistemului de localizare a fetei individului si nu a imaginilor de fond.

Fotografie:

Unele camere foto digitale utilizeaza detectarea fetei pentru focalizare automata, numita face-priority AF (auto focus), este o functie a camerei care detecteaza fetele umane, astfel incat camera poate seta automat focalizarea. Atunci cand se utilizeaza un blit, detectarea fetei va elimina in mod automat efectul nedorit de ochi rosii, care pot aparea de multe ori atunci cand fotografiati persoane folosind un blit.

Securitate:

Unele dispozitie mobile folosesc optiunea de a debloca dispozitivul cu ajutorul fetei in locul unei parole. Aceasta implementare presupune recunoastere faciala care are la baza detectia fetelor. In momentul activarii este necesara detectarea fetei si capturarea acesteia, dupa care fetele salvate sunt folosite in algortimul de recunoastere facial pentru a compara trasaturile si deblocarea dispozitivului cu success.

Divertisment:

Detectarea facial este folosita si in aplicatiile destinate divertismentului. Mai exact, ne referim la aplicatiile care detecteaza fata persoanei care este in cadrul camerei dispozitivului, iar in locul fetei detectate este adaugat un actor de film, actor din desene animate sau diferite masti doar pentru a oferi o dispozitie buna utilizatorului.

Definirea functionalitatilor aplicatiei

Dupa ce utilizatorul descarca aplicatia OpenCVFaceRec, aceasta ii ofera utilizatorului posibilitatea de a detecta fetele persoanelor dorite in doua variante: fie detectarea persoanelor dintr-o imagie statica, fie in timp real cu ajutorul accesarii camerei dispozitivului. De asemenea poate accesa si o galerie proprie unde sunt salvate toate fetele persoanelor care au fost detectate utilizand aplicatia. Asadar, cand utilizatorul porneste aplicatia, aceasta are la dispozitie in activitatea principala trei butoane: “Add Picture”, “Add Name” si “Face Detection”, un controler de tip ImageView si un controler de tip EditText.

Pasii de functionare ai aplicatiei sunt dupa cum urmeaza:

In urma apasarii butonului “Add Picture”, apare un buton de tip DialogBox care ofera utilizatorului urmatoarele:

Varianta de a alege o poza din galeria proprie a dispozitivului android;

Varianta de a accesa camera dispozitivului;

Varianta de inchide butonul de tip DialogBox si de a reveni la activitatea initiala.

Pe rand voi analiza cum functioneaza aplicatia in situatiile in care utilizatorul acceseaza galeria sau camera:

1. Utilizatorul acceseaza galeria

Poza selectata din galerie este introdusa in activitatea principala intr-un controler de tip ImageView

Urmeaza apasarea butonului “Face Detection” care implementeaza procesul de detectare a fetei persoanei din poza introdusa

Se introduce, cu ajutorul tastaturii dispozitivului, numele persoanei care se afla in poza

Se apasa butonul “Add name” care are rolul de a captura doar fata detectata si de a o salva intr-un folder extern in memoria dispozitivului. Poza este salvata cu numele “NumePersoana_i.jpg”, unde “i” incepe de la 0 de fiecare data cand un nume nou este introdus si reprezinta numarul pozei cu acelasi nume salvata in folderul extern. De cate ori butonul “Add Name” este apasat, de atatea ori poza este salvata. JPEG este formatul utilizat pentru salvarea pozelor.

2. Utilizatorul acceseaza camera

Aplicatia deschide o noua activitate care implementeaza procesul de detectare al fetei peroanei din cadru si urmarirea fetei detectate (face tracking). Activitatea contine camera, un buton de tip EditText si 2 butoane: “Add Name” , “Take Picture”, iar in prima faza tastatura dispozitivului este activata.

Din momentul in care utilizatorul alege varianta de a accesa camera , o camera e tip JavaCameraView, oferita de catre OpenCV, este pornita si din acest moment utilizatorul are posibilitatea de a detecta atat fata persoanei din cadru, cat si ochii acesteia. De asemenea ochii persoanei detectate sunt urmariti si separat cu ajutorul a doua ecrane in pasrtea dreapta a camerei.

Primul pas este de a introduce numele persoanei in butonul de tip EditText pe care in background scrie “Name”. In momentul in care utilizatorul introduce numele, scrisul de pe fundal dispare automat. In situatia in care utilizatorul doreste sa amane acest pas are posibilitatea de a apasa pe butonul de tip EditText, iar tastura dispare.

Dupa ce utilizatorul introduce numele persoanei pe care doreste sa o detecteze trebuie obligatoriu sa apese butonul Add Name pentru ca numele persoanei sa fie salvat. Este necesara salvarea numelui introdus pentru ca ma apoi sa poata fi utilizat in procesul de salvare a fetei detectate

Dupa ce utilizatorul a salvat numele, acesta trebuie sa apese butonul Take Photo pentru ca fata detectata sa fie salvata in acelasi folder extern unde se pot gasi toate fetele care au fost detectate utilizand aceasta aplicatie. . Poza este salvata cu numele “NumePersoana_i.jpg”, unde “i” incepe de la 0 de fiecare data cand un nume nou este introdus si reprezinta numarul pozei cu acelasi nume salvata in folderul extern. De cate ori butonul Take Photo este apasat, de atatea ori poza este salvata. JPEG este formatul utilizat pentru salvarea pozelor.

Dupa ce utilizatorul a salvat fetele detectate utilizand metodele mentionate anterior, are posibilitatea de a verifica imaginile selectand, din meniul activitatii principale, Galeria proprie a acesteia. Asadar, in galerie, utilizatorul vizualizeaza o lista cu totalitatea pozelor, iar in momentul cand o poza este selectata aceasta este vizualizata in prim plan, iar numele persoanei detectate va aparea pe ecran.

Stabilirea intrarilor in concordanta cu iesirile

Asa cum reiese si din schema de mai jos, utilizatorul este cel care introduce in aplicatie de la tastatura numele persoanei, iar prin intermediul aplicatiei alege sa acceseze camera dispozitivului sau galeria foto a acestuia. In situatia in care utilizatorul acceseaza camera, aplicatia porneste camera pentru a detecta fetele in timp real, utilizatorul trebuie sa introduca de la tastatura numele persoanei pe care doreste sa o detecteze si ofera ca data de iesire fata detectata si salvata in fisierul extern propriu cu formatul JPEG. In cazul in care selecteaza galeria, aceasta ofera ca data de iesire poza dorita pentru a efectua detectare facial asupra ei.

Odata ce aplicatia a primit de la utilizator si galerie toate resursele necesare pentru procesarea imaginilor, se realizeaza actiunea de detectare a fetelor personei care se afla in poza adaugata din galleria foto , iar in galeria proprie aceasta sunt stocate doar fetele detectate. Accesand galeria aplicatiei utilizatorul poate vizualiza ca date de iesire o lista cu imaginile procesate. Daca selecteaza o imagine, pe ecran ca primi un mesaj cu numele persoanelor detectate.

Structura aplicatiei

Mai jos este mentionata structura aplicatiei destinata detectarii faciale OpenCvFaceRec:

In directorul OpenCvFaceRec\app\src\main\java se regasesc clasele java ce contin codul sursa al aplicatiei:

MainActivity care incarca libraria OpenCV in proiect, defineste activitatea fiecarui controller din activity_main.xml, incarca clasificatorul cascada Local Binary Patterns (lbpcascade_frontalface.xml) necesar pentru detectarea frontala a fetei, detecteaza fata dintr-o imagine static pe care mai apoi o salveaza in galeria proprie pentru ca utilizatorul sa aiba acces la imagile care au fost prelucrate direct din aplicatie, fara a mai trebui sa iasa din aplicatie pentru a accesa folderul din documentele externe ale dispozitivului.

Camera_ care incarca libraria OpenCV in proiect, defineste activitatea fiecarui controller din layout-ul activity_camera.xml, adauga clasificatorii cascada Local Binary Patterns (lbpcascade_frontalface.xml) necesar pentru detectarea frontala a fetei si haarcascade_lefteye_2splits.xml care bazat pe trasaturi Haar necasar pentru detectarea ochilor, detecteaza fata dintr-o imagine static pe care mai apoi o salveaza in galeria proprie.

c. Gallery care implementeaza galeria proprie de tip GridView a aplicatiei unde utilizatorul poate vedea care sunt persoanele detectate.

d. Image_View creata pentru a oferi utilizatorului posibilitatea de a selecta o poza din galerie cu ajutorul layout-ului activity_image_view.xml.

In directorul OpenCvFaceRec\app\src\main\res\layout se gasesc fisiere de tip “.xml” care reprezinta interfetele grafice ale activitatilor aplicatiei

activity_main.xml – fisier de tip .XML care contine controllerele ce compun interfata principala a aplicatiei. Ofera utilizatorului posibilitatea de a incarca o poza din galerie pentru a efectua detectarea faciala

activity_gallery.xml – cumprinde un controller de tip GridView unde se pot vizualiza toate fetele detectate cu ajutorul aplicatiei. Acesta poate fi selectat din meniul activitatii principale (activity_main.xml)

activity_camera.xml – fisier de tip .XML in care se afla controllerele ce formeaza activitatea a doua a aplicatiei,

activity_image_view.xml contine un controller de tip ImageView pentru a pune in plan principal fata detectata pe care o alege utilizatorul.

In OpenCvFaceRec\app\src\main\res\raw se regasesc resursele utilizate pentru procesul de detectarea faciala:

haarcascade_lefteye_2splits.xml – clasificator cascada bazat pe trasaturi Haar necasar pentru detectarea ochilor

lbpcascade_frontalface.xml – Local Binary Patterns (LBP) care este un clasificator cascada necesar pentru detectarea frontala a fetei

In OpenCvFaceRec\libs\opencv se afla modulul OpenCV compilat cu ajutorul programului Android Studio care este necesar dupa cum am mentionat anterior pentru implementarea detectarii faciale fie din imagini statice, fie real-time cu ajutorul camerei

Pe langa aceste directoare, foarte important este si fisierul AndroidManifest.xml deoarece se gasesc detalii despre aplicatie, cum ar fi permisiunile, activitatile definite si versiunea aplicatiei. Permisiunile necesare aplicatiei sunt urmatoarele:

Pentru a avea permisiunea de a accesa camera:

<uses-permission android:name="android.permission.CAMERA" />

Pentru permisiunea de a stoca fetele detectate intr-un fisier din memoria externa:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Pentru permisiunea de a citi imaginile din fisierul extern:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Mediul de implementare si instrumentele folosite

Pentru implementarea acestei aplicatii am utilizat programul software Android Studio 2.1. care este mediul oficial de dezvoltare integrat (IDE) pentru platforma de dezvoltare Android. Bazat pe software-ul IDEA JetBrains 'IntelliJ, Android Studio este conceput special pentru dezvoltarea Android. Este disponibil pentru descarcare pe Windows, Mac OS X si Linux si inlocuieste Eclipse Android Development Tools (ADT) ca IDE primar Google pentru dezvoltarea nativa a aplicatiilor Android. Pentru implementarea detectarii faciale am utilizat biblioteca open source OpenCV.

Ce este OpenCV?

OpenCV(Open Source Computer Vision Library) este o biblioteca open source C ++ pentru procesare de imagine si viziune artificiala, initial dezvoltata de Intel si acum sustinuta de Willow Garage. OpenCV este acum utilizat pe scara larga pentru dezvoltarea de aplicatii avansate de procesare si manipulare a imaginii si viziuni artificiale. Acesta este un instrument destinat studentilor, inginerilor si cercetatorilor din fiecare colt al lumii.

Este gratuita atat pentru uz comercial si non-comercial. Prin urmare, nu este obligatoriu pentru aplicatiile care utilizeaza OpenCV sa fie deschise sau gratuie.

Este o biblioteca ce contine multe functii care au ca scop principal procesarea imaginilor in timp real. Acum are cateva sute de algoritmi de procesari de imagini si de viziune artficiala care fac dezvoltarea de aplicatii avansate intr-un mod usor si eficient.

Fiind un produs sub licenta BSD, OpenCV face usor pentru intreprinderi sa utilizeze si sa modifice codul. Biblioteca are mai mult de 2500 de algoritmi optimizate. Acesti algoritmi pot fi folositi pentru a detecta si recunoaste fetele, de a identifica obiecte, clasifica actiunile umane in inregistrari video, urmarirea miscarilor utilizand camera, urmarirea obiectelor in miscare, se extrag modele 3D ale obiectelor, produc puncte 3D de la camere stereo, cusatura imagini impreuna pentru a produce o imagine de rezolutie inalta a unei intregi scene, gasirea unor imagini similare dintr-o baza de date de imagini, elimina ochii rosii din imaginile realizate cu ajutorul flash-ului, urmarirea miscarilor ochilor etc. OpenCV are mai mult de 47 de mii de oameni de utilizator comunitate si numarul estimat de descarcari care depaseste 7 milioane. Biblioteca este utilizata pe scara larga in companii cum ar fi Google, Yahoo, Microsoft, Intel, IBM, Sony, Honda, Toyota, grupuri de cercetare si de organisme guvernamentale.

Caracteristici-cheie

Este optimizata pentru procesare de imagini in timp real si aplicatii de viziune artificiala

Interfata primara a OpenCV este in C ++

Exista, de asemenea, interfete C, Python si JAVA complete

aplicatiile OpenCV ruleaza pe Windows, Android, Linux, Mac si iOS

Optimizat pentru procesoarele Intel

Module OpenCV

OpenCV are o structura modulara. Principalele module ale OpenCV sunt enumerate mai jos.

 Core (libopencv_core.dll)

Acesta este modulul de baza al OpenCV. Acesta include structuri de baza de date (e.g.- structura de date Mat) si functiile de baza de procesare a imaginii. Acest modul este, de asemenea, utilizat pe scara larga de catre alte module, cum ar fi highgui etc.

Highgui (libopencv_highgui.dll)

Acest modul ofera capacitati de realizare cu usurinta a interfetelor cu utilizatorul, mai multe imagini si codec-uri video, capabilitati de capturare a imaginilor si video-uri, manipularea imaginilor.

Imgproc (libopencv_imgproc.dll)

Acest modul include algoritmi de baza pentru procesarea imaginilor, inclusiv de filtrare a imaginilor, transformari de imagine, conversii spatiu de culoare etc.

 Video (libopencv_video.dll)

Acesta este un modul de analiza video, care include algoritmi de urmarire a obiectelor, algoritmi de scadere de fond si etc.

Objdetect (libopencv_objdetect.dll)

Aceasta include algoritmi de detectie si de recunoastere a obiectelor pentru obiecte standard.

Analiza si proiectarea formatelor de intrare-iesire

In situatia in care utilizatorul acceseaza galeria acesta:

1. Va alege o poza din memoria dispozitivului android, iar aceasta este introdusa intr-un controller de tip ImageView (imgView) sub forma unui Bitmap (myBitmap).

2. Apasa butonul Detect Face dupa care introduce de la tastatura un nume in controllerul de tip EditText(main_name) care urmeaza sa fie salvat intr-o variabila de tip String (name) la apasarea butonul Add Name (variabila main_add de tip Button).

3. Fata detectata este salvata cu ajutorul variabilei bitmap, care este de tip Bitmap, in memoria externa a dispozitivului intr-un folder de tip File (variabila myDir) cu formatul JPEG si are numele ”name_imageNum.jpg”, unde variabila “name” este de tip String, iar imageNum este o variabila de tip integer care initial are valoarea 0, creste cu cate o unitate in situatia in care este introdus de la tastatura acelasi nume si se reinitializeaza cu 0 atunci cand este introdus un nume care nu a mai fost introdus inainte.

In situatia in care utilizatorul acceseaza camera acesta:

1. Acceseaza o camera (openCvCameraView) de tip JavaCameraView care are rolul de a detecta fata persoanei din cadru

2. Introduce de la tastatura un nume in controllerul de tip EditText(add_name) care urmeaza sa fie salvat intr-o variabila de tip String (new_name) la apasarea butonul Add Name (variabila add_btn de tip Button).

3. Fata detectata este salvata cu ajutorul variabilei bitmap, care este de tip Bitmap, in memoria externa a dispozitivului intr-un folder de tip File (variabila myDir) cu formatul JPEG si are numele ”new_name_imageNum.jpg”, unde variabila “new_name” este de tip String, iar imageNum este o variabila de tip integer care initial are valoarea 0, creste cu cate o unitate in situatia in care este introdus de la tastatura acelasi nume si se reinitializeaza cu 0 atunci cand este introdus un nume care nu a mai fost introdus inainte.

Validarea datelor

Pentru a ajuta utilizatorul sa utilizeze aplicatia intr-un mod corespunzator, am aplicat validare pe fiecare buton pentru a il indruma care sunt pasii corecti. Asadar pentru fiecare buton folosesc cate o variabila de tip Boolean care daca in momentul in care utilizatorul apasa pe un buton, iar variabila corespunzatoare este setata pe true atunci butonul functioneaza correct, altfel un mesaj este afisat pe ecran pentru a instiinta utilizatorul care este pasul urmator pe care trebuie sa il urmeze.

1. In prima faza utilizatorul nu poate detecta o fata daca nu are nicio poza introdusa, sau daca nu porneste camera. Asadar butonul de “Add picture” are setata variabila boolean pe true pentru a putea introduce o poza din galerie sau pentru a deschide camera, celelalte butoane fiind setate pe false.

2. Daca utilizatorul alege sa selecteze o poza din galerie, dupa ce s-a introdus poza in aplicatie butonul “Face Detection” devine true si un mesaj “Detect face” este afisat pe ecran. Dupa ce fata este detectata apare un mesaj “Add Name” si butonul “Add Name” devine true. Urmeaza introducerea numelui persoanei si odata cu apasarea butonul “Add Name” fata detectata este salvata in galeria proprie si mesajul “Face added in your gallery”. Folderul extern poarta numele de “saved_images”, iar daca initial acesta nu este creat, se creeaza in momentul in care o fata este detectata si urmeaza sa fie salvata.

3. Daca utilizatorul alege sa selecteze camera atunci el trebuie initial sa introduca numele persoanei dupa care sa apese butonul “Add Name” care are variabila boolean setata initial pe true si primeste un mesaj “Take Photo”. Dupa ce numele este introdus variabila Boolean folosita pentru verificarea butonul “Take photo” este setat pe true si butonul poate fi apasat pentru a salva in galerie fata detectata. Dupa salvarea pozei mesajul “Face added in your gallery” apare pe ecran. Folderul extern poarta numele de “saved_images”, iar daca initial acesta nu este creat, se creeaza in momentul in care o fata este detectata si urmeaza sa fie salvata.

4. Galeria poate fi accesata fara nicio restrictie.

In momentul in care utilizatorul introduce numele de la tastatura prima litera a fiecarui cuvant este setata automat sa fie cu litera mare. Pentru aceasta pe controllerul de tip EditText este adaugata urmatoarea setare:

android:inputType="textPersonName|textCapWords"

In situatia in care utilizatorul nu introduce un nume, pozele nu sunt salvate in folderul extern, iar daca introduce un nume care deja exista salvat in galerie, atunci poza este salvata cu numele “nume_i+1” unde este i este variabila e tip integer pentru a numerota pozele cu acelasi nume. In felul acesta pozele au nume unic si nu se suprascriu.

Daca utilizatorul introduce o poza in care nu exista nicio persoana si apasa butonul “Face Detection” atunci mesajul “No face detected. Please add a new picture” va aparea pe ecran pentru a instiinta utilizatorul ca poza selectata nu este buna.

Proiectarea folderului de stocare a fetelor detectate

Indiferent de varianta de utilizare a aplicatiei aleasa de catre utilizator, de accesare a galeriei sau de accesare a camerei dispozitivului, imaginile sunt stocate in acelasi director care este creat in memoria externa a dispozitivului android. Folderul care stocheaza pozele procesate este accesat atat din memoria externa a dispozitivului cat si din aplicatie sub forma unei galerii(variabila grid de tip GridView) pentru ca utilizatorul sa poata vedea mai rapid care sunt fetele pe care aplicatia le-a detectat.

1. Se salveaza cu ajutorul variabilei “root”, de tip String, calea catre memoria externa

String root = Environment.getExternalStorageDirectory().toString();

2. In calea obtinuta este creat un folder cu numele “saved_images” in cazul in care nu exista deja. In caz contrar, se creaza in momentul salvarii primei fete detectate.

String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/saved_images");
if (!myDir.exists())
myDir.mkdirs();

3. In cazul in care a fost introdus de la tastatura un nume in controllerul de tip EditText, fata detectata este salvata cu ajutorul unei variabile de tip bitmap in folderul creat in memoria externa prin variabila output de tip FileOutputStream.

int imageNum = 0;
String fileName = new_name + "_" + String.valueOf(imageNum) + ".jpg";
File output = new File(myDir, fileName);
while (output.exists()) {
imageNum++;
fileName = new_name + "_" + String.valueOf(imageNum) + ".jpg";
output = new File(myDir, fileName);
}

FileOutputStream out = new FileOutputStream(output);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();

Folderul care este salvat in memoria externa este salvat si in interiorul aplicatiei sub forma unei galerii (variabila grid de tip GridView) in modul urmator:

1. Pozele sunt citite din directorul extern si sunt stocate in variabila “list”, care este un vector de fisiere:

String sdCard = Environment.getExternalStorageDirectory().getAbsolutePath();
String fullpath = sdCard + "/saved_images/";

File directory = new File(fullpath);

ArrayList<File> list;

list = imageReader(directory);

2. Se initializeaza controllerul de tip GridView pentru a afisa lista de imagini intr-o noua activitate. Pozele care se afla in lista pot fi selectate pentru a fi deschise in prim plan cu ajutorul clasei ImageView.

grid = (GridView)findViewById(R.id.gridView);
grid.setAdapter(myGridAdapter);
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
startActivity(new Intent(getApplicationContext(), Image_View.class).putExtra("img",list.get(position).toString()));
}
});

In clasa ImageView, urmatoarea sectiune permite selectarea unei poze si afisarea ei sub forma unui controller de tip ImageView:

String f = getIntent().getStringExtra("img");
iv3 = (ImageView) findViewById(R.id.imageView3);
iv3.setImageURI(Uri.parse(f));

Similar Posts