Aplicatie Control Acces Neintruziv al Unei Statii Windows 8

Proiect de diplomă

Aplicație

Control acces neintruziv al unei statii Windows 8

CUPRINS

Introducere

Am ales această temă fiind dorința mea de a înțelege modul de funcționare a aplicațiilor pentru detectarea formelor obiectelor și a fețelor omenești, folosind dispozitive precum camera video. Această aplicație este folosită și în prezent pentru accesarea dispozitivelor pe care le deținem.

Dorința mea este de a perfecționa astfel de aplicații pentru a putea evita unele accesări nepermise de către alte persoane.

Fiind în era tehnologiei, acest domeniu al IT-ului este vital în orice domeniu.

Această aplicație odată instalată pe dispozitiv cu funcția pornită și configurată , oferă o interfață cu utilizatorul prin care este verificat dacă are permisiunea de a accesa dispozitivul.

Aplicația înainte de a putea fi folosită trebuie configurată prin scanarea feței din mai multe unghiuri prin care se poate crea o figură biometrică a utilizatorului, aceasta fiind cheia de logare a utilizatorului cu dispozitivul respectiv.

Dacă există mai multe persoane în cadru, se alege cea mai apropiată persoana de camera video, după care se verifică daca are permisiunea de a accesa dispozitivul.

PGINA este o aplicatie de legatura dintre Windows si aplicatia creata, care permite modificarea serviciilor statiei Windows 8. Aplicatia creata permite PGIN-ei de a loga utilizatorul in contul curent.

Aplicația creată compară utilizatorul cu figura biometrică construita la momentul configurări aplicației, pentru a transmite lui PGINA că are permisiunea de a debloca contul respectiv.

Nu poate fi o potrivire de 100% dintre figura biometrică si utilizator, astfel se calculează marja de eroare. Aplicația creată nefiind strictă cu micile modificări ale utilizatorului apărute pe parcursul timpului.

Tehnologii utilizate

Limbajul C/C++

Limbajul C este prezentat ca fiind un program de asamblare portabil fiind diferit de programul de ansamblare, codul scris in programul C poate fi compilat aproape pe orice sistem de calcul, pe când limbajele de ansamblare crează programe doar pentru anumite modele de masinări. Limbajul C poate fi comparat cu alte limbaje de nivel scăzut sau chiar de nivel mediu, acest limbaj fiind legătura dintre componentele hardware si interoperabilitate.

Motivul creări limbajului C fiind acela de a crea programele mari cât mai ușor și cu un raport de erori mai mic în paradigma programării procedurale și fără a îngreuna compilatorul C, acesta fiind încărcat tot mai mult cu caracteristici complexe ale limbajului C.

Limbajul C este relativ simplu avand funcți matematice implementate în el precum și manipulare de fișiere.

Este focalizat pe paradigma programării procedurale, care facilitează programarea într-un mod structurat.

Folosește un limbaj preprocesor, preprocesorul C, pentru sarcini cum ar fi definirea de macrouri și includerea mai multor fișiere sursă.

Se folosesc pointeri pentru a putea accesa informați din memoria calculatorului.

Limbajul C folosește parametri, fiind transmiși funcțiilor prin valoar și nu prin referintă.

Pointeri la funcți, ce permit forme rudimentare de închidere (engleză closure) și polimorfism.

Se pot declara variabile globale și locale (doar în funcțiile definite).

Structuri de date sau tipuri de date agregate, fiind definite de catre utilizator prin ( struct ), ce permite ca datele înrudite să fie combinate și manipulate ca un întreg.

Limbajul C este dezavantajos de caracteristicile celorlalte limbaje prin:

-sistem automat de colectare a rezidurilor (de memorie) (în engleză Garbage collection)

-clasele și obiectele (programarea orientată pe obiecte)

-un sistem avansat de tipuri de date

-programarea generică

-supraîncărcarea

-metaprogramarea

-suport nativ pentru programarea pe mai multor fire de execuție ( în engleză multithreaded ) și funcțiilor de rețea

-procesarea listelor

Deși aceste caracteristici lipsesc din limbajul C nu este un dezavantaj mare încat să nu folosească utilizatorii acest limbaj de programare, având posibilitatea ca noile compilatoare să fie folosite pe noile tipuri de platforme, și de a controla mai bine programul pe care îl crează utilizatorul. Acesta reprezintă un avantaj oferit de limbajul C față de celelalte limbaje de programare, fiind mult mai eficient.

Un program scris în limbajul mașina poate fi performant dacă este scris cu mare grijă având un control integral cu sistemul de calcul. La performanța compilatoarelor din prezent împreuna cu noile procesoare apărute, a transformat limbajul C într-un limbaj din ce în ce mai dorit de către programatori.

Una din consecințele acceptării și eficienței C-ului este aceea că multe compilatoare, biblioteci și interpretoare ale limbajelor de nivel înalt sunt adesea implementate în C.

În primele linii ale programului sunt prezentate biblioteci catre “headere” predefinite sau contruite de către utilizator numite directive preprocesor. Preprocesorul este primul pas în compilare, care verifică fiecare linie de cod scris de către utilizator pentru a confirma dacă întregul program poate merge mai departe cu compilarea sau va raporta erorile pe care utilizatorul trebuie să le corecteze.

Antetul funcției va fi scris cu paranteze unghiulare sau cu ghilimele dacă este predefinit de utilizator, fiind specificat și locația dacă aceasta diferă față de codul sursă.

OpenCV

OpenCV(Open Source Computer Vision Library) este o bibliotecă “ open-source ” cu licență BSD care include câteva sute de algoritmi “ computer vision “. Documentul descrie așa numitul OpenCV 2.x API (fiind oricare versiune de 2), care este de esență un C++ API, opusul acestui C de baza este OpenCV 1.x API.

OpenCV are o structură modulară, ceea ce înseamnă că pachetele include câteva biblioteci statice sau comune. Sunt valabile urmatoarele module:

CORE – un modul compact care definește o structură de date de baza, incluzând mulțimea multi-dimensională și funcți de bază folosite de către toate celelalte module.

IMGPROC – un modul de procesare a imaginilor care include imagini liniare și imagini filtrate non-liniare, transformări geometrice ale imaginilor (cum ar fi redimensionarea imagini, deformare perspectivă, remaparea generică a tabelei de bază), conversia spațiului la culori, histograme ți multe altele.

VIDEO – un modul de analizare a video-urilor care include estimarea mișcări, extragerea imagini de fundal cât și algoritmi de urmărire a obiectelor.

CALIB3D – algoritmi de vizualizare multipă geometrica de baza, calibrarea unei singure camere video sau mai multe, estimarea locației obiectului, algoritm de conformitate multiplă, elemente de reconstruire 3D.

FEATURES2D – propriul detector de trasături, descriptori si comparări de descriptori.

OBJDETECT – detectarea obiectelor și instanțierea claselor predefinite cum ar fi fața, ochi, oameni, mașini și multe altele.

HIGHGUI – o interfața ușor de utilizat la capacitățile simple UI.

VIDEOIO – o interfață ușor de utilizat pentru înregistrările video și codecurile video-urilor.

GPU – algoritm de accelerare a GPU din diferite module OpenCV.

Alte module care ajută, cum ar fi FLANN și Google, legături Python și altele.

cv Namespace

Toate clasele și funcțiile din OpenCV se pot accesa prin includerea acestui “namespace cv”. Pentru a putea folosi funcțiile OpenCV se folosește specificatorul cv:: prezentat în figura următoare:

#include "opencv2/core.hpp"

cv::Mat H = cv::findHomography(points1, points2, CV_RANSAC, 5);

Fig. II.1

Pentru accesarea acestor funcți se mai poate folosi specificatorul using namespace cv; prezentat în figura următoare:

#include "opencv2/core.hpp"

using namespace cv;

Mat H = findHomography(points1, points2, CV_RANSAC, 5 );

Fig. II.2

Câteva din denumirile externe curente sau viitoare ale lui OpenCV poate să se afle în conflict cu STL sau alte biblioteci. În acest caz, se folosește explicit specificatorul namespace pentru a rezolva aceste conflicte, un exemplu este prezentat în figura următoare:

Mat a(100, 100, CV_32F);

randu(a, Scalar::all(1), Scalar::all(std::rand()));

cv::log(a, a);

a /= std::log(2.);

Fig. II.3

Amenajarea automată a memoriei

OpenCV se ocupă de amenajarea memoriei în mod automat.

În primul rând, std::vector, Mat, si alte structuri de date folosite de către funcți și metode, au destructori care dealocheaza memoria tampon când este nevoie. Acest lucru înseamna că destructorul nu dealocheaza memoria cum este precizat în cazul Mat. Ei iau în considerare posibilitatea schimbului de date. Un destructor decrementează referința contorului asociat cu memoria tampon de date ale matricei. Memoria tampon este dealocat doar atunci când contorul ajunge la valoarea 0, când celelalte structuri nu fac referință la aceați memorie tampon. Similar, când o instanță Mat este copiată, nici o informație nu este cu adevărat copiată. În schimb, referința către contor este incrementată pentru a memora o altă instanță care are aceași informație cu o instanță curentă. Mai există si metoda Mat::clone care crează o copie întreaga a matricei. Un exemplu pentru această metodă este prezentat în figura următoare:

// creaza o matrice de 8Mb

Mat A(1000, 1000, CV_64F);

// crearea unui nou header pentru aceasi matrice;

// aceasta este o operatie instantanee, indifferent de dimensiunea matricei.

Mat B = A;

// crearea unui nou header pentru randul 3 din matricea lui A; nici aici nu este copiata //informatia

Mat C = B.row(3);

// acuma se face o copie separate a matricei

Mat D = B.clone();

// copiaza al 5-lea rand din B in C, acesta fiind copia a randului 5 din A

// in al 3-lea rand din matricea lui A.

B.row(5).copyTo(C);

// acuma A si D vor avea aceasi matrice de informati; dupa aceasta modificare A va avea //referinta de la B si C

A = D;

// acuma B va fi o matrice goala (care ave avea referinta la un buffer gol),

// dar versiunea modificata a lui A va avea in continuare referinta la C,

// desi C este doar un rand din matricea lui A

B.release();

// in final se face o copie complete a lui C. Ca si rezultat matricea mare modificata va fi

// goala, pentru ca nu are referinta la nimica

C = C.clone();

Fig. II.4

Se vede că folosirea lui Mat și alte structuri de date sunt simple de folosit. Cât despre clasele de nivel înalt sau chiar și tipurilor de date create fără gestionarea automată a memoriei în conturi, în acest caz OpenCV oferă o clasă șablon Ptr care este similară cu std::shared_prt din versiunea 11 a lui C++. Așadar în loc să se folosească pointeri simpli:

T* ptr = new T(…);

Fig. II.5

Se mai poate folosi și :

Ptr<T> ptr(new T(…));

Fig. II.6

Sau chiar :

Ptr<T> ptr = makePtr<T>(…);

Fig. II.7

Ptr<T>  încapsulează un pointer către intanța T și un contor de referință către pointerul asociat.

Alocarea automată a datelor de ieșire

OpenCV eliberează memoria în mod automat, precum și alocarea memoriei la ieșirea datelor dintr-o funcție. Dacă o funcție are unu sau mai mulți parametri de intrare de tip matrice (instanța cv::Mat), cât și date la ieșire tot matrici, acele date de tip matrice la ieșire, sunt allocate și realocate în mod automat. Dimensiunea și tipul de date a datelor de ieșire de tip matrice depinde de dimnesiunea și tipul de date de tip matrice la intrare. Dacă este nevoie, funcția permite folosirea mai multor parametri pentru a ajuta la determinarea proprietăților datelor de ieșire de tip matrice,prezentată în figura următoare:

#include "opencv2/imgproc.hpp"

#include "opencv2/highgui.hpp"

using namespace cv;

int main(int, char**)

{

VideoCapture cap(0);

if(!cap.isOpened()) return -1;

Mat frame, edges;

namedWindow("edges",1);

for(;;)

{

cap >> frame;

cvtColor(frame, edges, COLOR_BGR2GRAY);

GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);

Canny(edges, edges, 0, 30, 3);

imshow("edges", edges);

if(waitKey(30) >= 0) break;

}

return 0;

}

Fig. II.8

Matricea cu cadre este alocat automat prin folosirea operatorului >> având în vedere rezoluția cadrului video si bit-depth-ul, este cunoscută prin modul de capturare video. Marginile matricei este alocat în mod automat prin funcția cvtColor. Are aceași rezoluție și bit-depth ca și matricea de la intrare. Numărul de canale este 1 pentru că este folosit codul culori de conversie COLOR_BGR2GRAY, ceea ce presupune modul de conversie către culoarea gri. Cadrele și marginile acestora este alocat doar o singură data într-o buclă, pentru că toate celelalte cadre au aceași rezoluție. Dacă cumva această rezoluție se schimbă, acea matrice este realocată în mod automat.

Componenta cheie acestei tehnologi este metoda Mat::create. Se ia mărimea și tipul matricei. Dacă matricea are mărimea și tipul ei, această metodă nu face nimica. În caz contrar, se eliberează datele allocate anterior, dacă oricare ( în această parte include decrementarea referinței contor și compararea acestuia cu 0 ), după care alocheaza un noua memorie tampon cu mărimea dorită. Multe funcți apelează metoda Mat::create pentru fiecare matrice de iesire, și astfel este implementat în mod automat alocarea datelor la ieșire.

Există unele excepți precum cv::mixChannels, cv::RNG::fill, și alte câteva funcți și metode. Acestea nu au posibilitatea de a aloca matricea la ieșire, fiind făcuta în mod manual.

Saturatia aritmetică

Ca o bibliotecă ” computer vision “, OpenCV are deaface cu pixeli fiecărei imagini care sunt adesea codate în 8 sau 16 biți pe fiecare canal, are în așa fel forma încat are valori limitate. Se fac anumite operați cu imagini, precum conversia spațiului de culoare, ajustarea contrastului și luminozități, interpolarea complexă (bi-cubin, Lanczon), pot crea valori care să iasă din intervalul permis. Dacă se depoziteaza doar 8 (16) biți din rezultat, acest rezultat în “visual artifacts” poat afecta analiza imagini următoare. Pentru rezolvarea acestei probleme, se folosește saturația aritmetica . De exemplu pentru stocarea rezultatului unei operati cu o imagine de 8 biți, se caută valoarea cea mai apropriată de intervalul 0 – 255.

Fig. II.9

Reguli similare sunt aplicate pentru un semnal de 8 biți, 16 biți, si semnale nesemnate. Aceasta semantică este folosită peste tot în librăriile OpenCV. În codul C++ este realizat prin folosirea funcției saturate_cast<> care reasamblează standardul operației cast din C++. Implementarea formului este:

I.at<uchar>(y, x) = saturate_cast<uchar>(r);

Fig. II.10

Unde cv::uchar este un întreg nesemnat de 8 biți din OpenCV . În codul optimizat SIMD, precum folosirea instrucțiunilor SSE2, aspaddusb, packuswb, precum și altele. Ajută la realizarea aceleiași înfățișări ca și codul C++. 

Saturația nu se aplică dacă rezultatul este un întreg de 32 de biți.

Tipuri de pixeli fixe. Utilizarea limitată de șabloane

Șabloanele sunt o caracteristică mare a limbajului C++, care permite implementarea instrucțiunilor și algoritmilor puternici, eficiente și sigure. Totuși, utilizarea în exces a acestor șabloane, poate mări timpul de compilare cât și dimensiunea codului. Pe lânga asta este dificil să se separe o interfață și o implementare când șabloanele sunt folosite în exces. Acest lucru poate fi în regula pentru algoritmi de bază dar nu folosiți pentru bibliotecile “ computer vision ” unde un singur algoritm poate conține sute de lini de cod. Pentru acest motiv și pentru a simplifica dezvoltarea legături dintre limbajele precum Python, Java, Matlab care nu au șabloane deloc sau șabloane cu capabilități limitate, această implementare a lui OpenCV este bazat pe polimorfism și dispecerizarea execuției peste șabloane. In acele momente unde dispecerizarea execuției ar fi prea lentă ( cum ar fi operați de acces cu pixeli ), imposibile ( implementare generică Ptr<> ), sau poate doar incomod ( saturate_cast<>() ) implementarea curentă introduce clase de șabloane mici, metode, și funcți.Oriunde altundeva, în versiunea curentă OpenCV, utilizarea șabloanelor este limitată.

Prin urmare, există un set fix, limitat, de tipuri de date primitive pe care biblioteca poate funcționa.

Datele de tip matrice trebuie să fie definite cu una dintre urmatoarele tipuri de date

8-bit unsigned integer (uchar)

8-bit signed integer (schar)

16-bit unsigned integer (ushort)

16-bit signed integer (short)

32-bit signed integer (int)

32-bit floating-point number (float)

64-bit floating-point number (double)

Tuplul din mai multe elemente fiind toate de același tip ( unul din ele mai sus ). O matrice ale cărei elemente sunt astfel de tupluri, sunt numite matrici multi-canale, opusul unei matrici cu un singur canal, carui elemente sunt valori scalare. Numărul maxim posibil pentru canale este definită de catre constanta CV_CN_MAX, care este setat implicit pe valoarea 512.

Pentru aceste tipuri de bază, este aplicată următoarea enumeratie:

enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };

Fig. II.11

Tipuri de multi-canale ( n-canale ) pot fi specificate prin opțiunea următoare:

Constantele de la CV_8UC1 până la CV_64FC4 (pentru canalele de la 1 la 4)

Constantele de la CV_8UC(n)  până la  CV_64FC(n)  sau constantele de la CV_MAKETYPE(CV_8U, n) până la  CV_MAKETYPE(CV_64F, n) macrouri ( dacă numărul de canale este mai mare de 4 ). CV_32FC1 == CV_32F, CV_32FC2 == CV_32FC(2) == CV_MAKETYPE(CV_32F, 2), și CV_MAKETYPE(depth, n) == ((x&7)<<3) + (n-1). Aceasta înseamnă că tipul constantei este formată din bit-depth, adică luând cele mai mici 3 biți, și numărul de canale -1, luând următori biți, log2( CV_CN_MAX ), exemplu:

Mat mtx(3, 3, CV_32F); // creaza o matrice de 3 pe 3 in virgule mobila

Mat cmtx(10, 1, CV_64FC2); // creaza o matrice de 10 pe 1 cu 2 canale in virgule mobila

// matrice cu 10 vectori complexi

Mat img(Size(1920, 1080), CV_8UC3); // matrice cu 3 canale pentru o imagine color

// format din 1920 coloane and 1080 randuri.

Mat grayscale(image.size(), CV_MAKETYPE(image.depth(), 1)); // creaza o imagine cu un singur canal avand aceasi dimensiune si acelasi tip de canale ca si imaginea

Fig. II.12

Matricele cu elemente mai complexe nu pot fi construite sau procesate de către OpenCV. În plus, fiecare funcție sau metodă poate procesa doar un subset din toate tipurile de matrice posibile. Deobicei, cu cât este mai complex algoritmul, cu atât mai mic este numărul de tipuri de date suportate, următoarele exemple rezultate astfel de cazuri:

Algoritmul de detectare facială funcționează doar pentru imagini color și monocolor de 8 biți.

Funcțiile algebrice lineare și în mare parte algoritmul de învățare a mașini de a lucra doar cu matrici în virgulă flotantă.

Funcțiile de bază, cum ar fi cv::add, suportă toate tipurile de date.

Funcțiile de conversie al spațiilor de culoare suportă 8 biți nesemnate, 16 biți nesemnate, cât și 32 biți nesemnate în virgulă mobilă.

Subsetul pentru tipuri de date suportat, pentru fiecare funcție a fost definită din nevoile practice și pot fi extinse pe baza cereri utilizatorului pe viitor.

Matrici de intrare și matrici de ieșire

Multe funcți din OpenCV procesează matrici numerice pe două dimensiuni sau mai multe. Deobicei, astfel de funcți au ca și parametru cpp:class:Mat, dar în alte cazuri este mai convenabil să se folosească std::vector<> sau Matx<> ( pentru matrici de 3 pe 3 ). Pentru a evita astfel de dubluri în API, s-au introdus clasele speciale “ proxy ”. Clasa de bază “ proxy ” este matricea de intrare. Este folosită pentru a transmite mai departe doar citirea matrici ca și parametru la o funcție. Clasa derivată din matricea de intrare este matricea de ieșire, este folosită pentru a specifica o matrice la ieșirea dintr-o funcție. În mod normal, utilizatorul nu trebuie să se gândească la resprectivele tipuri intermediare ( si nu trebuie să declare astfel de tipuri de date ), acestea se fac în mod automat. Se poate presupune că înloc de matricele de intrare si de ieșire se poate folosi metoda Mat, std::vector<>, Matx<>, Vec<> sau Scalar. Când o funcție are o matrice optională la intrarea sau la ieșirea, dar utilizatorul nu are nevoie de matricea opțională sau nu are nevoie de una, se poate folosi metoda cv::noArray().

Manipularea erorilor

OpenCV folosește excepți în erorile critice. Când parametrul de intrare are un format corect si valoarea sa se găsește în intervalul dorit, dar algoritmul nu poate să se execute din anumite motive ( de exemplu, optimizarea algortmului nu se poate executa ), acesta returnează un cod de eroare ( de obicei, o variabila booleana ).

O excepție poate fi o instanță din clasa cv::Exception sau a uneia din derivatele acestuia. Acest cv::Exception este derivată din clasa std::exception. Astfel poate fi manipulată în codul utilizatorului folosind componentele standard ale biblioteci C++.

Excepția este de obicei identificată prin folosirea macroului CV_Error( errcode, description), sau varianta CV_Error_( errcode, printf-specs, ( printf-args ) ), sau folosirea macroului CV_Assert( condition ) care verifică condiția și returnează o excepție când nu este satisfăcută. Pentru un cod optim al errori, există CV_DbgAssert( condition ) care poate fi folosit doar în configurarea modului de depanare. Din cauza amenajări automate a memoriei, toate memoriile tampon sunt în mod automat dealocate în cazul unei erori. Utilizatorul trebuie să adauge doar condiția TRY… CATCH EXCEPTION…, dacă are nevoie de manipularea codului de eroare, exemplu:

try

{

… // call OpenCV

}

catch( cv::Exception& e )

{

const char* err_msg = e.what();

std::cout << "exception caught: " << err_msg << std::endl;

}

Fig. II.13

Fire de execuție și Reenterabilitate

Implementarea curentă a lui OpenCV este complet reintrodusă. Adică, aceeași funcție, aceeași metodă constantă a instanței unei clase, sau aceași metodă neconstantă a unei instanțe al altei clase care poate fi denumită dintr-un alt fir de execuție. De asemenea, același cv::Mat poate fi folosit în diferite threaduri din cauza operațiuni contorului de referință folosind instrucțiunile atomice specificate arhitectual.

Aplicații utilizate

PGINA

Instalare PGINA

Pentru instalarea aplicației PGINA pe lângă descărcarea și instalarea ei este necesară și “ Visual C++ redistributable package ” să fie instalată ca aplicația să funcționeze corect. În pachetul de instalare PGINA există această opțiune de a instala cele necesare după ce s-a instalat PGINA.

După ce aplicația PGINA a fost instalată, urmează a fi configurată folosind „Local Machine”, aceasta activează accesul prin autentificare. Acest lucru va permite să se poată folosi PGINA ca utilizatorul să se autentifice folosind contul local existent, iar dacă este necesar, acest „Local Machine” va permite crearea altor conturi de utilizator.

Pe langă acest „Local Machine” există și alte opțiuni precum acesta dar fiind dezactivate.

Pentru a verifica dacă PGINA este instalat corect, dupa instalare se deschide aplicația de configurare al PGINA, Se verifică dacă serviciul PGINA este funcțional iar “Credential Provicer/PGINA” este instalat și activat.

Fig. III.1

Funcționalitatea PGINA

PGINA este un înlocuitor pentru “ Windows Credential Provider ” (CP), PGINA oferă posibilitatea de a configura multe aspecte de la autentificarea utlizatorului și autorizarea folosiri aplicațiilor. Acest “ Framework Credential Provider “ este suportat începand cu Windows 7/Vista spre cele mai noi sisteme de operare. Versiunea prioritară a Windows-ului este Framework-ul PGINA.

Diagrama de mai jos reprezintă subsistemul major al lui PGINA fiind prezentat pentru o simplă logare in windows.

Fig. III.2

Mai jos sunt prezentați pași unei logări în Windows.

Utilizatorul introduce parola în câmpul interfeței PGINA, această opțiune de logare este una din mai multe categori de logare folosind aplicația PGINA. La început sunt prezentate mai multe conturi de logare dintre care una este PGINA.

Parola introdusă în câmpul PGINA la logare trimite informația nealterată către serviciul PGINA, după care PGINA transferă informația mai departe prin “Local Machine” care se transmite către Windows.

Dupa ce credibilitatea a fost procesată, PGINA trimite rezultatul procesări credibilități împreună cu credibilitatea( nume și parolă ) către PGINA CP. Aceste credibilități pot să nu fie la fel cu cele transmise de serviciul de logare către windows, ele fiind alterate la un moment dat.

Dacă rezultatul returnat la punctual 3 este corect, atunci PGINA “Credential Provicer” transmite credențialele către windows, astfel se declanșează logarea utilizatorului în contul respective.

După cum se vede nu PGINA este responsabilă cu logarea în cont, PGINA fiind folosit pentru verificarea credibilități utilizatorului.

Arhitectura aplicației PGINA este construită din două componente și anume “Credential Provider” și “PGINA Service”.

Fig. III.2

Acest CP înlocuiește interfața de autentificare al windows-ului. Se conectează la sistemul de la Windows și configurează UI care afișează în momentul logări. PGINA PC este un mic program de executare, care pur și simplu primește credibilitatea utilizatorului și o transferă către serviciul PGINA după care se așteaptă un răspuns de la acel serviciu.

PGINA este un serviciu de la Windows care este pornit în momentul porniri calculatorului fiind rulat cu drepturi de administrator. Peste serviciul inițial va fi nevoie de timp pentru ca serviciul PGINA să pornească după care CP-ul va fi pornit ca să comunice cu serviciul.

PGINA gestionează procesul de logare prin delegarea lucrului la un set de zerouri sau mai mult alte plugin-uri. Aceste plugin-uri au rolul de a determina dacă utilizatorul este cine spune că este, daca este permis accesul său. Logarea are nevoie de o conecțiune în 3 etape ilustrate în diagrama următoare.

Fig. III.3

Fiecare etapă implică zerourile sau mai multe plugin-uri, un anumit plugin poate fi folosit în mai multe etape. După ce utilizatorul furnizează credibilitatea , PGINA transmite mai departe prin cele 3 etape. Fiecare etapă poate fi indeplinită sau nu depinzând de rezultatele acelui plugin implicat.Rolul fiecărei etape este prezentat mai jos.

Autentificarea:

Plugin-urile implicate în această etapă validează dacă utilizatorul are acces. Acest lucru se face prin validarea credibilități cu informația dintr-o bază de date externa.

Autorizarea:

Această etapă este creată pentru a determina dacă utilizatorului ii este permis să acceseze resursele pe care le dorește să le folosească. De exemplu un utilizator are drept de logare doar dacă face parte dintr-un grup.

Gateway:

Această etapă este similară cu etapa de autorizare, în acest caz nu se validează utilizatorul ci furnizează informați despre contul dorit care poate să fie refuzat. De exemplu acest plugin “Local Machine” poate fi executat înăuntrul etapei Gateway. Este posibil să se creeze un cont local în Windows care să fie identic cu credibilitatea contului care este deja logat. Dacă dintr-un anumit motiv acest lucru eșuează, atunci utilizatorul nu se poate loga iar acest plugin trebuie să oprească si să furnizeze un mesaj corespunzător . În mare parte această etapă este ultima șansa de logare a utilizatorului înainte de a eșua cu totului.

Plugin-urile pot fi configurate pentru a furniza servici pentru una sau mai multe etape. De exemplu acest plugin “Local Machine” furnizează servici pentru toate 3 etapele. În prima etapă, verifică dacă credibilitatea utilizatorului corespunde cu contul local.

Poate există nici una sau mai multe plugin-uri implicate în fiecare etapă. Dacă o etapă este greșită atunci logarea nu are loc. Pe de altă parte fiecare etapă are propriile reguli în vederea treceri la etapa următoare sau nu.

Autentificarea – Cel puțin un plugin este implicat în această etapă, în care trebuie să fie înregistrat cu success pentru ca procesul să poata continua la urmatoarea etapă. Dacă nu este înregistrat nici un plugin această etapă nu poata continua iar logarea nu are loc.

Autorizarea – Toate plugin-urile implicate în această etapă trebuie înregistrate cu success altfel logarea nu are loc. Daca nu există nici un plugin înregistrat , această etapă s-a indeplinit cu succes.

Gateway Toate plugin-urile implicate în această etapă trebuie înregistrat cu succes pentru ca procesul să poată continua. Dacă nu există nici un plugin atunci această etapa s-a încheiat cu succes.

Plugin-urile pot furniza servici către mai multe etape, iar aceste servică pot fi oprite sau pornite selectiv. De exemplu acest plugin FOO care furnizează autentificări și autorizației. PGINA poate fi configurată ca acest plugin să fie folosit doar în autentificare, sau doar în autorizație sau amăndouă sau niciuna.

Plugin-urile pot de asemenea să fie ordonate în fiecare etapă, de exemplu două plugin-uri pot fi Foo si Bar (acestea fiind serviciile). Ele pot fi configurate, Foo urmat de Bar sau Bar urmat de FOO.

PGINA reține câteva informați despre utilizator. Acest lucru include numele de utilizator, parola, grupul la care este membru, cât și alte informați. Aceste informați pot fi alterate de către plugin-uri și sunt folosite aceste informați de către plugin-uri pentru a modifica starea sistemului de calcul. De exemplu, aceste plugin-uri pot adăuga sau scoate utilizatorul dintr-un grup, să modifice parola sau numele de utilizator, sau un plugin poate creea un cont local folosindu-se de aceste informați. Acest lucru arată că ordinea în care aceste plugin-uri sunt executate în fiecare etapă este foarte importantă, astfel diferite ordonări ale plugin-urilor poate avea rezultate diferite. Ultimile rezultate ale numelui de utilizator, parolă, domeniu care face parte sunt transmise mai departe către Windows pentru a finalize procesul de logare.

De obicei se recomandă ca crearea contului local să fie executat la finalul procesului lui PGINA. Un mod de a face acest lucru este configurarea plugin-ului “Local Machine” pentru a fi executat la urma în etapa Gateway. Etapa Gateway al plugin-ului “Local Machine” crează, dacă este necesar, un cont local. Dacă plugin-ul “Local Machine” se execută mai devreme, poate pierde din vedere unele informați pentru contul local.

Plugin-urile se pot înregistra pentru a primi notificări de la “ Windows Terminal Services “. Aceste evenimente include: logarea, delogarea, blocarea(lock), deblocarea, conectarea la consolă, deconectare de la consolă și altele. Un plugin care dorește să primească aceste notificări vor fi listate ca un plugin de “ Notificare ” în interfața de configurare. Plugin-ul nu poate primi notificări dacă nu este pornit.

Configurare PGINA

Configurare Plugin-uri

În configurația de la PGINA, plugin-urile pot afi activate sau dezactivate. Dacă un plugin oferă servici pentru o anumită etapă, va apărea un “ checkbox “ pe linia acelui plugin, acesta oferind posibilitatea de a dezactiva acel plugin pentru o anumită etapa.

Pentru a configura un plugin, se dă un dublu clic pe el sau un clic pe el după care un clic pe butonul configurare. Pagina cu configurările acelui plugin se va arăta. Opțiunile oferite sunt cele de la plugin, pentru a putea configură corect se recomandă citirea documentației acelui plugin.

Ordonarea plugin-urilor

Pe pagina “ Ordered Plugins ” se poate detecrmina ordinea pentru fiecare plugin. Există o listă în PGINA cu fiecare etapă din care se poate ordona plugin-urile dorite.

Testarea plugin-urilor

Pentru a verifica dacă plugin-urile sunt configurate corect, PGINA oferă un simulator pentru logare, care poate fi găsit pe pagina „ Simulation ”, în interfața de configurare PGINA. Cu acest simulator se poate inițializa simularea pentru logare, și poate verifica starea fiecărui plugin, dacă sa terminat cu succes sau nu.

Simulatorul oferă posibilitatea de a urmări în timp real logarea PGINA, apăsând pe butonul „ View Log ”. Dacă ceva nu funcționează corect, se pot găsi informați în acel fișier „ View Log ”.

În „ Final User Data ”, simulatorul arată ultimul set de credibilități, care sunt furnizate pentru Windows. Aceste credibilități trebuie să corespundă cu cele de la contul local pentru ca logarea să fie îndeplinită.

În „ Local Groups ”, simulatorul arată lista cu grupele locale din PGINA, după ce legătura dintre PGINA și Windows sa realizat cu succes. Această listă poate să nu fie lista pentru a accesa contul local doar daca plugin-ul „ Local Machine ” se execută ultimul în etapa Geteway.

Logarea

PGINA înregistrează informațiile la următoarele fișiere, găsite în folderul cu instalarea lui PGINA (implicit: C:\Program Files\PGINA\log).

PGINA.Configuration_log.txt : acesta conține mesaje de la aplicația de configurare PGINA.

PGINA.Services.ServiceHost_log.txt: fișierul conține mesaje de la serviciul PGINA.

PGINA.CredentialProvider.Registration_log.txt: acesta conține mesaje de la utlitara de înregistrare care se folosește în instalarea sau dezinstalarea pentru a activare sau dezactivare CP și serviciilor PGINA.

PGINA este suportat de “ Apache log4net ”, și este configurat în fișierul de configurare “ log4net “, locația implicită este “ C:\Programs Files\PGINA\log4net.config ”.

Pentru logarea într-un alt fișier , pur și simplu se editează acest fișier.

Microsoft Visual Studio

Microsoft Visual C++ ( adesea numit și ca MASVC sau VC++ ) este o aplicație comercială ( având și versiuni gratis ), fiind un produs mediu de dezvoltare integral ( numit și IDE ) creat de Microsoft pentru limbajele de programare C, C++ și CLI. Dispune de caracterstici de dezvoltare și depanare a codului C++, în special cod scris pentru Microsoft Windows API, pentru Directx API, și pentru Microsoft .Net Framework.

Multe aplicați au nevoie de “ Visual c++ redistributable packages ” pentru a funcționa corect. Aceste pachete de obicei sunt instalate individual față de aplicație, permițând mai multor aplicați să le folosească fiind instalate o singură dată. Acest redistribuibil Visual C++ și pachetele de execuție sunt instalate de obicei pentru bibliotecile standard ale aplicațiilor care le folosește.

Visual C++ 2013 ( cunoscut și ca Visual C++ 12.0 ) a fost eliberat în 17 Octombrie 2013, fiind și o versiune stabilă. Acesta folosește mai mult versiunea 11 al limbajului C++ și introduce un REST SDK.

RTM versiunea cu numarul: 18.0.21005.1

Actualizarea 2 versiunea cu numarul: 18.00.30501

Actualizarea 3 versiunea cu numarul: 18.00.30723

Actualizarea 4 versiunea cu numarul: 18.00.31101

Compilatorul ABI de la Visual C++ a fost schimbat dealungul istoriei. Acest lucru este în special pentru containerele STL, unde dimensiunea containerelor variază de la un compilator la altul. Microsoft recomandă împotriva folosiri interfeței C++ la modulul imbinări, când utilizatorul dorește să activeze compilatorul codului client folosind o versiune de compilator diferită. În loc de C++, Microsoft recomandă folosirea interfeței C sau COM, care sunt concepute în a avea un ABI stabil printre compilatoarele eliberate.

Visual C++ este eliberat cu diferite versiuni de biblioteci ale limbajului C. Acest lucru înseamna că, utilizatori iși pot compila codul cu oricare bibliotecă disponibilă. Totuși, acest lucru poate crea probleme când se folosesc diferite componente ( DLLs, EXEs ) în același program. Un exemplu tipic poate fi un program care folosește diferite biblioteci. Utilizatorul trebuie să folosească același “ C Run-Time “ pentru toate componentele programului cu excepția cazului în care nu sunt înțelese. Microsoft recomandă folosirea mai multor fire de execuție, folosirea diferitelor biblioteci ( opțiuni de compilare MD sau MDd ) pentru a evita posibile probleme.

Totuși produsul original provine ca și un IDE pentru limbajul de programare C, pentru mulți ani compilatorul suportă limbajele care au la bază limbajul C standard, începând cu anul 1989. Cea mai recentă revisiune al standardului, C99 si C11, nu au fost suportate deloc până la versiunea Visual C++ 2012, care a adăugat acest support pentru multe variante de C99 în modul C ( incluzând dizainuri inițializate, combinați precise, și tipul de date _Bool ). Visual C++ 2013 a fost îmbunătățit suportul pentru C99, totuși nici acuma nu este complet.

Proiectarea aplicației

Crearea securități

Pentru a crea securitatea, pe lângă aplicație este nevoie de 3 fisiere, care sunt verificate la începutul aplicației dacă există, și anume verifică dacă fișierul folosit pentru detectarea fețelor din cadru există.

Daca camera video selectată din program exista ( setarea camerei video se face prin numarul variabilei, in exemplul acesta camera este setată pe 0 “webcam(0”, 0 fiind camera implicită a windows-ului, iar >0 sunt camerele posibile atasate prin usb sau alte porturi, iar -1 pentru nefolosirea camerei video ).

Se mai verifică dacă poza implicită este încărcată, și anume poza aceasta va fi un înlocuitor daca nu există nici o față în cadru.

Pentru pasul următor există o buclă infinită ( WHILE ) având 3 ferestre de informare a utilizatorului și anume:

consola ( consola este interfața dintre aplicatie si utilizator, oferind informati utilizatorului cum sa foloseasca aplicatia ).

O fereastră cu cadru primit de la camera video.

O altă fereastra ca arata imaginea cu fața utilizatorului ( dacă există mai multe fețe în cadru se selectează fața cea mai apropiată de camera video ), dacă există în cadru în caz contrar arată poza implicită.

Deocamdată aplicația tot ce face este să afișeze cadru de la webcam si imaginea cu fața utilizatorului sau poza implicită.

La apăsarea tastei ENTER, acesta fiind declanșatorul pentru etapa următoare care este salvarea feței utilizatorului din cadru într-un vector.

La apăsarea tastei ENTER pentru a doua oară se va ieși din bucla WHILE, informând utilizatorul cu privire la salvarea informatiei. Mai exact aplicația crează o figură biometrică ( o formă a feței în 3D ) bazat pe pozele salvate în bucla WHILE, care se salveaza într-un fișier urmat de închiderea programului în mod automat.

IMPORTANT !

Dacă se recreaza acea figură, executând fiecare etapă dinou, iar la final dacă exista fisierul creat anterior (sau alt fișier cu aceași denumire pe care aplicația o folosește) acesta se înlocuiește cu noul fișier creat.

Fig. IV.1

Autentificarea utilizatorului

Autentificarea utilizatorului este realizată cu ajutorul aplicației PGINA, pentru configurarea și folosirea lui PGINA este prezentată în capitolul III Aplicați folosite.

În partea aceasta în comparație cu “ Crearea securitati „ de la punctul anterior, s-a adăugat înca o conditie care trebuie indeplinită pentru ca aplicația să execute codul său.

Dacă nu sa executat prima parte cu forma acelei fețe 3D a utilizatorului, se execută logarea în Windows.

IMPORTANT !

Pentru ca aplicația să poată fi folosită, ea trebuie să îndeplinească condițiile de la începutul programului, este important ca acele fișiere să existe în cadrul programului.

Aceasta măsură este luată pentru a preveni blocarea accesului la windows în cazul în care acele fișiere nu sunt găsite, dacă se alege din greșeală această autentificare, aplicația poate crea în mod direct accesul la PGINA pentru a continua cu logarea.

De data aceasta în bucla infinită ( WHILE ) avem o singura fereastră ( acea fereastră este defapt campul pentru poza utilizatorului, astfel utilizatorul este informat prin acel câmp și anume dacă chipul acestuia este văzut de către aplicație ), desigur și în acest caz daca nu există nici o fața în cadrul primit de la camera video se afișeaza poza implicită.

Aplicația rămâne în buclă până când utilizatorul închide windows-ul sau dacă utilizatorul este permis să acceseze contul local al stației curente.

După această comparare dacă utilizatorul are acces, se predă comanda pentru aplicația PGINA pentru a inițializa serviciile necesare logări utilizatorului în contul curent.

Fig. IV.2

Detectarea feței

Această parte conține și condițiile aplicației pentru ambele categori “ Creare securități ” si ” Autentificare utilizator ”(ambele au fost definite în acest capitol).

Deși sunt folosite chiar și în subprogramul “ DetectFace „ ( despre care se va vorbi după ), sunt conectate prin cele doua categori.

În „ Creare securitate ” sunt folosite doar 3 verificări din cele 4, ele fiind:

Verifye_face: verifică fișierul care calculează pixeli pentru detectarea fețelor

Verifye_webcam: verifică dacă camera video cu numarul dat ca și parametru există sau este disponibilă.

Verifye_image: verifică dacă imaginea implicită este gasită pentru a putea fi folosită în cazul nedetectări al cel putin o față.

În „ Autentificarea utilizatorului ” sunt folosite cele 3 verificări, prezentate mai sus dar se mai verifică dacă securitatea a fost configurată:

VerifyeFiles: verifică existența fișierului „ face-rec-model “, care conține informațiile despre utilizator.

Fig. IV.3

În partea următoare a aplicației este subprogramul care se ocupă de detectarea feței din imaginea pe care o primește ca și parametru.

Datele de intrare în acest subprogram sunt:

Imaginea de la camera video ( în care se va căuta fețele )

fișierul care ajută la detectarea fețelor din imagine, acesta are un algoritm prin care compară pixeli ca să determine dacă în acel grup de pixeli se găsește caracteristicile feței (nasul, ochi, gura), calculând distanța dintre acestea pentru determinarea feței.

imaginea implicită care o va returna în cazul în care nu se gasește nici o față în imaginea primită ca și primul argument( această imagine va fi schimbată cu imaginea feței găsite în imaginea de la camera video).

Imaginea care o primeste ca si parametru este convertită dintr-o imagine color într-o imagine alb negru pentru a fi mai ușor de procesat în detectarea feței.

După conversia acelei imagini urmează determinarea numărului de fețe din acea imagine, ele fiind memorate ca și obiecte într-o listă ( aceste obiecte au coordonatele în x,y respectiv width, height ).

Din acest moment avem lista cu fețele si coordonatele acestuia, urmat a intra într-o buclă și executând codul pentru fiecare față din acea listă, mai exact se va determina dimensiunea fiecarui obiect ( folosinduse de coordonate ), acestea fiind salvate în 4 variabile ( x, y, width, height ).

Următorul pas va fi determinarea feței cu dimensiunea ce mai mare pe care o va returna, compararea dimensiunilor se va face prin compararea acestor 4 variabile cu dimensiunile fiecărei fețe, cum ar fi compararea dintre face.x și x, face.y și y, face.width și width, face.height și height,“ face “ fiind obiectul în care se salvează fiecare obiect din listă pentru a se face compararea .

Pentru a ajunge până la acest pas trebuie să îndeplinească o singură condiție ți anume ca width-ul și height-ul să fie diferite de 0 ( cele doua variabile fiind definite inainte de a intra în buclă ).

Dacă la compararea fețelor se găsește una mai mare decât cealaltă, pe lângă memorarea coordonatelor în cele 4 variabile, cu ajutorul acestora se va face o nouă imagine care va fi returnată la ieșirea din buclă.

La final, când se iese din buclă, se va returna imaginea feței cu dimensiunea cea mai mare, pentru a fi folosită în crearea feței biometrice ( pentru mai multe informați se găsesc la capitolul IV 1 ) sau autentificarea utilizatorului (pentru mai multe informati se găsesc la capitolul IV 2 ).

Fig. IV.4

Implementarea aplicației

Structura aplicației

Structura acestei aplicați a fost simplificată pentru a ajuta compilatorul de a executa mai repede aplicația astfel timpul de execuție este mai mic, marimea codului este si ea mai mică.

După cum s-a specificat în capitolul anterior, aplicația este împărțită în două părti:

Partea în care se configurează aplicația, prin verificarea fișierelor necesare pentru a putea îndeplini condiția de a executa codul din buclă și anume detectarea facială prin care se verifică daca există fețe în cadru pentru a determina cine este utilizatorul.

În partea a doua este vorba despre logarea utilizatorului în contul pe care este instalat aplicația prin PGINA, acesta verifică aceleași condiți precum în prima parte dar mai există încă o verificare înainte de a putea merge în buclă unde detecteaza fața pentru a o compara cu amprenta biometrică ( compară fața cu forma 3D a feței creată în prima parte a aplicației )

Cele doua părți sunt prezentate în figura următoare:

Fig. V.1

Ghid de utilizare a aplicației

Pentru ca utilizatorul să poată folosi această aplicație este necesar să de-a dublu clic pe fișierul de executie „ Crearea securități ”, după care se vor arăta 3 ferestre, acestea fiind consola cu care va interactiona utilizatorul iar celelalte 2 vor fi pentru a arata cea ce vede aplicația.

Utilizatorul va primi în consolă un mesaj de genu „ Dupa ce se apasă tasta ENTER, rotițivă capul dinspre dreapta spre stânga, după care apăsași dinou tasta ENTER. ”, acest mesaj va ajuta utilizatorul să configureze corect aplicația.

Fig. V.2

Fig. V.3

Fig. V.4

Dupa ce utilizatorul a facut ceea ce s-a recomandat, după cel de-a doilea ENTER apăsat înafară de consolă, celelalte 2 ferestre se închid.

În consolă se va afișa mesajul „ Se salvează ”, acest mesaj va fi postat timp de 2 secunde dupa apasarea celui de-al doilea ENTER, dupa aceea se va închide și consola.

Fig. V.5

Pentru logarea în windows utilizatorul nu are nimica de făcut înafară de a fi în cadrul camerei video pentru a permite aplicației sa îl logheze în contul său.

În momentul logări aplicația va funcționa până când windows-ul va determina să se pună pe mod hibernare sau înainte de acel moment se dă un „ SHUTDOWN ” la windows.

Fig. V.6

Concluzii

Această aplicașie este utilă pentru utilizator, deoarece ofera posibilitatea de a se loga in Windows mai repede, existenta unei parola pe care trebuie introdusa, existand posibilitatea ca altcineva sa o afla nu exista, fiind logat folosind chipul utilizatorului.

Aplicația poate fi îmbunătățită prin creare unei interfata cu utilizatorul de a da posibilitatea de a personaliza aplicatia, exemplu poate fi marimea acelei poze in momentul logari, poate avea o dimensiune data de catre utilizator.

Mai poate fi imbunatatita prin adaugarea de conditi pentru a nu se putea folosi de fotografi pentru a se loga sau alte obiecte care poate obtine accesul la cont.

Aceasta aplicatie poate multumi utilizatori de Windows 8 ne avand probleme de integrare a programului in windows 8 respectiv 8.1, cum o pot avea alte aplicati de genul acesta.

Se poate adauga optiunea de a seta limba in care se doreste ca textele sa fie afisate in aplicatie.

Imbunatatiri pe pot fi avuse poate fi transferul de la aratarea consolei cu text in cuvinte auzite de catre utilizator.

Bibliografie

http://docs.opencv.org/3.0-beta/modules/core/doc/intro.html

https://github.com/pgina/pgina/wiki/How-pGina-Works

http://pgina.org/docs/v3.0/user.html#ordering

https://en.wikipedia.org/wiki/Visual_C%2B%2B

https://en.wikipedia.org/wiki/Microsoft_Visual_Studio

Similar Posts