Mihos

Jul 19

Autor: Victor Adrian Prisacariu – Universitatea Tehnică “Gh. Asachi”, Iași

Conducător teză: Prof. dr. ing. Dan Gâlea

Mihos

Abstract

Realitatea augmentată înseamnă combinarea datelor generate de calculator cu cele obținute din lumea reala. Cu ajutorul realității augmentate interacțiunea cu calculatorul nu mai este doar un banal schimb fata – ecran. Aceasta se dizolvă în obiectele și spațiul înconjurător. Ea încetează chiar sa fie un act conștient și intenționat.

O interacțiune completă intre lumea reală și cea virtuală trebuie sa fie bidirecționala: calculatorul trebuie sa fie capabil sa înțeleagă lumea reala, iar obiectele generate de calculator trebuie sa fie complet compatibile cu lumea reala in care sunt plasate.

Aceasta lucrare își propune sa realizeze un sistem ce folosește realitatea augmentata pentru a permite unui utilizator uman sa joace șah cu un calculator, folosind o tabla reală. Calculatorul observa tabla cu ajutorul unei camere și răspunde la mutările făcute de utilizatorul uman, prin voce.

Sistemul permite și jocuri intre 2 utilizatori umani conectați prin internet. În acest caz fiecare utilizator are propria sa cameră și tablă de șah. Sistemul observă și înțelege mișcările făcute de cei 2 utilizatori si le transmite de la unul la celălalt prin internet.

Sistemul nu face nici o presupunere asupra:

  • Culorii pieselor de pe tabla de șah
  • Mărimea tablei de șah
  • Aspectul vizual al tablei de șah
  • Intensitatea și direcția luminii

Sistemul face următoarele presupuneri:

  • Tabla de șah este complet conținută in imagine.
  • Camera observă tabla de șah de la aceeași înălțime ca un utilizator uman.
  • Imaginea conține o singură o tablă de șah și nu conține altă structură ce poate fi confundată cu o tablă de șah.
  • Tabla nu se mișcă după ce piesele au fost aranjate.
  • Utilizatorul uman respectă regulile jocului de șah.

Sistemul poartă numele de Mihos, după numele zeului egiptean al vederii.

Introducere

Șahul este un joc jucat de 2 jucători. Un jucător joacă cu piese albe, al doilea cu piese negre. Fiecare jucător are 16 piese la începutul jocului: un rege, o regină, două ture, doi nebuni, doi cai și opt pioni. Jocul se joacă pe o tablă cu 64 de pătrate: 8 rânduri și 8 coloane. Pătratele sunt alternativ albe și negre. Pentru a facilita notarea mișcărilor fiecare pătrat are o adresă proprie. Din punctul de vedere al jucătorului alb rândurile sunt numerotate 1, 2, 3, 4, 5, 6, 7, 8 de jos în sus, iar coloanele a, b, c, d, e, f, g, h de la dreapta la stânga. Adresa fiecărui pătrat este formata prin combinarea literei pentru coloană, cu cifra pentru rând. De exemplu pătratul din dreapta jos este are adresa a1 (1).

In studiul șahului majoritatea cercetărilor s-au axat pe inteligență artificială, pe construirea de programe capabile să joace șah (2). Aceste studii au fost parțial încheiate când un calculator a reușit să învingă un campion mondial de șah (3). Un studiu similar cu acesta a urmărit citirea mișcărilor de șah de către roboți (4).

Pentru captura de imagine Mihos folosește o camera web si imagini cu rezoluție de 640×480, 15fps.

Mihos întâi detectează o tablă de șah fără piese aflată in fața camerei. A fost implementat un algoritm, explicat in detaliu in Capitolul 2, care detectează cele 64 de pătrate ale tablei de șah.

Mihos nu restricționează poziția camerei raportată la tabla de șah. Din acest motiv este necesară determinarea matricei de proiecție 2D, din in care tabla de șah se află in o postură arbitrară fată de cameră (figura 1.1) , in o imagine in care camera este perpendiculară pe tabla de șah (figura 1.2).


Figura 1.1 – Camera în o postură arbitrară față de tabla de șah

Folosind parametri intrinseci ai camerei Mihos este capabil să găsească și coordonatele 3D ale tablei de șah, raportate la coordonatele camerei. Este folosit algoritmul Iterației ortogonale (5), care va fi detaliat in Capitolul 3.


Figura 1.2 – Camera
în o postură ideală fată de tabla de șah

După detecția inițială a tablei de șah Mihos va urmări mutările utilizatorului uman si după ce a fost detectată o mutare scena va fi analizată folosind tehnici bazate atât pe procesare de imagine cât și pe cunoștințe. Mihos urmărește mărimea diferenței intre 2 imagini pentru a detecta producerea unei mișcări si apoi variații in culoare in aceeași diferență pentru a vedea ce poziții pe tablă s-au modificat. Programul folosește reguli de șah și alte reguli empirice pentru a valida mutările detectate din imagine. Acest procedeu este descris in capitolele 4 și 5.

Mihos este scris în principal folosind platforma .NET, versiunea 3.5 și limbajul de programare C#, versiunea 3.0. Totuși anumite părți din program au necesitat folosirea de alte platforme sau limbaje de programare. Astfel algoritmul de găsire al tabelei de șah este scris in Matlab, versiunea 2008a, iar algoritmii de detecție și interpretare a mișcării sunt scriși in Managed C++, versiunea 9.

Aplicația Windows oferă utilizatorului o interfață în care obiecte 3D sunt generate și desenate în timp real peste o imagine de la o cameră web. Acest fel de interfață nu se putea obține, cu performanțe bune și în timp relativ scurt, decât folosind Windows Presentation Foundation din platforma .NET 3.0 și 3.5. În plus platforma .NET 3.5 include și extensii precum Linq, care au accelerat considerabil procesul de implementare. O altă caracteristică ce a determinat alegerea platformei .NET este interoperabilitatea foarte bună cu alte limbaje de programare și platforme (Matlab și Managed C++).

Am implementat algoritmii de detecție a tablei și de recuperare a posturii în Matlab pentru a accelera procesul de dezvoltare. Matlab nu oferă viteză de procesare foarte mare, dar în partea de detecție a tablei de șah o diferență de 200ms nu este foarte importantă.

Algoritmii de detecție și înțelegere a imaginii necesită viteză mare de procesare, pentru a obține o interacțiune in timp real între om și calculator. Este deci nevoie de C++. Pentru a face interfațarea cu platforma .NET mai rapidă și sigură am folosit extensiile managed ale C++, care permit folosirea obiectelor din platforma .NET și in un mediu unmanaged, precum C++.

Detecția tablei de șah

Înainte de a putea detecta și înțelege mișcări trebuie detectată tabla de șah. Aceasta poate fi de orice formă, cu orice culori și in orice postură față de cameră. Am impus totuși restricția ca ea să fie inclusă complet în imagine și in imagine să nu existe alte structuri care ar putea fi confundate cu o tablă de șah.


Figura 2.1 – Detecția tablei de șah

Prima etapă in detecția tablei de șah este achiziția imaginii. Mihos poate lucra cu orice camera video, conectată la calculator si compatibilă DirectShow. In continuare voi folosii o camera Philips SPC900NC, la rezoluția standard de 640×480, 15fps. Detalii mai multe despre conectarea camerei web la calculator vor fi date in capitolul 5.

FPS (frames per second) este unitatea de măsură a frecvenței cu care un producător de imagine produce imagini consecutive.

După achiziție imaginea este convertită in nuanțe de gri, după care a doua etapă este aplicarea operației morfologice de dilatare imaginii, prin care valoarea unui pixel din imagine devine maximul dintre valoare lui și valorilor vecinilor lui.

Pixelul este cea mai mică componentă a unei imagini.

Imaginea este apoi binarizată. Cele 256 de nivele de gri devin 2 nivele, alb și negru.

În imaginea binarizată sunt detectate contururile parților negre (intre care si pătratele negre, dar si alte contururi negre din imagine).

Aceste poligoane detectate sunt reduse folosind algoritmul Douglas Peucker la doar câteva segmente, apoi aceste segmente sunt reduse 4 folosind câteva reguli statistice si empirice.

Următoare etapă este aplicarea altor reguli statistice și empirice figurilor cu 4 laturi detectate în imagine. Rămân maxim 35 de pătrate, intre care și pătratele negre din tabla de șah.

Folosind morfologia tablei de șah găsesc orientarea tablei și 4 puncte care vor fi folosite apoi la recuperarea posturii tablei.

Morfologie matematică și dilatarea imaginii

Morfologia matematică este analizarea imaginilor folosind funcții matematice și teoria mulțimilor.

Mulțimile in morfologia matematică reprezintă formele obiectelor în o imagine. În imaginile binare toate mulțimile sunt membre ale spațiului întreg , unde fiecare element al unei mulțimi este un vector 2D, ale cărui coordonate sunt coordonatele ale pixelului în imagine. În imaginile în nuanțe de gri elementul unei mulțimi este , unde g este valoarea intensității. Mulțimi in spații n – dimensionale pot conține informații suplimentare (de exemplu culoare) (6).


Figura 2.1.1 – Două mulțimi A și B. (sursă (6))

Fie și două mulțimi în , având componentele și (figura 2.1.1). Câteva exemple de operații cu cele 2 mulțimi sunt:

  • Translarea lui cu , notată , definită ca:


  • Reflexia lui B, notată , definită ca:


  • Complementul lui A, notat , definit ca:


  • Diferența , definită ca:


Fie mulțimea vidă. Dilatarea lui A prin B este definită ca:


Dilatarea este deci mulțimea tuturor deplasărilor x astfel încât intersecția lui A cu B conține cel puțin un element. B este numit elementul structural în dilatare.

Dacă presupunem imaginea în nuanțe de gri sursă , elementul structural , domeniul lui și domeniul lui , atunci dilatarea pentru o imagine în nuanțe de gri este:


Mihos folosește dilatarea pentru a micșora părțile întunecate și deci pentru a separa pătratele negre de restul tabelei (figura 2.2.3).

Conversia imaginii: imagine color în imagine cu nuanțe de gri și apoi in imagine binară

Înainte de dilatare este nevoie de o conversie a imaginii din color în nuanțe de gri. După dilatare imaginea este convertită în imagine binară.

Imaginile color sunt in spațiul de culori RGB.

In spațiul de culori RGB fiecare culoare este reprezentată ca o combinație de 3 culori, roșu, verde și albastru.

Fie imaginea color inițială, imaginea în nuanțe de gri si imaginea binară. În acest caz , unde r, b, g sunt componentele roșu, verde și albastru ale culorii pixelului de la coordonatele , , unde i este valoarea intensității pixelului de la coordonatele în imaginea in nuanțe de gri si , unde v este valoarea intensității pixelului la coordonatele in imaginea binarizată.

Pentru a obține intensitatea pixelilor aplicăm formula:

Imaginea binară are numai 2 culori, 0 pentru negru și 255 pentru alb. Binarizarea se face in funcție de o valoare prag. Toate intensitățile mai mici decât valoarea prag vor devenii 0, și toate mai mari vor devenii 1. Mihos folosește pentru a determina valoarea prag următoarea formulă:



Figura 2.2.1 – Imaginea color de la cameră


Figura 2.2.2 – Imaginea după dilatare


Figura 2.2.3 – Imaginea în nuanțe de gri


Figura 2.2.4 – Imaginea după binarizare

Trasarea conturului în jurul pătratelor negre

Pentru a găsii contururile Mihos întâi caută toate punctele ce mărginesc zonele negre. Un punct mărginește o zonă neagră daca are in apropierea lui pixeli albi. În continuare sunt grupate punctele după distanța intre ele și sunt găsite marginile zonelor negre (figura 2.3.1).


Figura 2.3.1 – Imaginea cu marginile marcate

În acest moment am găsit o lista de mulțimi de puncte, care mărginesc zone negre. Fiecare mulțime de puncte va fi simplificată folosind algoritmul Douglas Peucker și apoi din segmentele rămase vor fi alese numai 4, in funcție de unghiul dintre ele (rămân cele 4 segmente cu unghiul dintre ele cât mai apropiat de 90).

Algoritmul Douglas Peucker

Algoritmul Douglas Peucker folosește apropierea unui punct de o linie pentru a determina daca el face sau nu parte din linia respectivă.

Algoritmul funcționează de sus în jos, pornind cu o aproximare inițială a poligonului: o linie cu primul punct din lista de puncte la un capăt si cu ultimul la celălalt capăt. Apoi punctele rămase sunt testate pentru apropierea de această linie. Dacă un punct este mai departe de linie cu o toleranță , atunci este adăugat la simplificare și este creată o nouă aproximare a poligonului. Folosind recursie procesul continuă până când toate punctele au fost ori adăugate în poligon, ori distanța dintre ele și linie este mai mică decât toleranța (7).

Algoritmul este exemplificat în figura 2.3.2.


Figura 2.3.2 – Algoritmul Douglas-Peucker


Figura 2.3.3 – Rezultatul simplificărilor poligoanelor detectate

După cum se observă in figura 2.3.3 au fost detectate toate pătratele din tablă, dar au fost detectate și alte pătrate. Este chiar posibil sa nu fie detectate toate pătratele din tablă, dar să fie detectate alte pătrate din imagine.

Filtrare empirică, statistică și morfologică a pătratelor detectate

Din pătratele detectate se aleg numai acelea care respectă următoarele reguli empirice:

  • să nu fie prea mici
  • raportul dintre cea mai mică latură și cea mai mare să fie mai mic decât 0.6

După eliminarea empirică Mihos face una statistică. Sunt luați in calcul următorii factori:

  • Aria
  • Raportul între latura cea mai mică și cea mai mare
  • Raportul între unghiurile dintre laturi
  • Numărul de muchii detectate de algoritmul Douglas-Peucker.

Pentru fiecare din acești factori sunt calculați parametrii pentru o distribuție gaussiană: este media factorului (media ariilor detectate de exemplu) , iar este variabilă funcție de factor:

  • Aria:
  • Raportul între latura cea mai mică și cea mai mare:
  • Raportul între unghiurile dintre laturi:
  • Numărul de muchii detectate de algoritmul Douglas-Peucker:

    Distribuția gaussiană are 2 parametrii: media și deviația standard :


Fiecare pătrat din cele detectate va avea 4 probabilități, de corespondență la factorii de mai sus. Probabilitatea ca un pătrat să aparțină tablei este dată de produsul acestor 4 probabilități.


Figura 2.4.1 – Rezultatul eliminării statistice și empirice a pătratelor

Se observă în figura 2.4.1 că eliminarea nu a este perfectă. Este posibil ca să rămână pătate care nu aparțin tablei de șah, dacă ele sunt similare cu cele care aparțin tablei.

Ultima filtrare este una bazată pe morfologia tablei. Se poate observa că tabla de șah are o singura diagonala formată din pătrate negre. Aceasta trece prin centrul celor 8 pătrate. Daca deci tragem o linie din centrul fiecărui pătrat la centrul fiecărui alt pătrat exista o singură pereche de pătrate a cărei linie trece prin alte 6. Aceste 2 pătrate determină și orientarea tablei. Similar se observă că există si 3 perechi de pătrate a căror linie trece prin alte 5 pătrate. Pornind de la aceste premize vom găsii 8 pătrate, câte 2 pentru fiecare colț al tablei (figura 2.4.2).


Figura 2.4.2 – Cele 8 pătrate care marchează colțurile tablei

Interesat? Intra in contact cu autorul pentru restul lucrarii.

  1. (necesar)
  2. (introduceti o adresa valida)
 

Cuprins

Cuprins

Abstract    2

Cuprins    3

Listă de figuri    4

Capitolul 1 – Introducere    6

Capitolul 2 – Detecția tablei de șah    9

2.1 Morfologie matematică și dilatarea imaginii    10

2.2 Conversia imaginii: imagine color în imagine cu nuanțe de gri și apoi in imagine binară    11

2.3 Trasarea conturului în jurul pătratelor negre    12

2.3.1 Algoritmul Douglas Peucker    12

2.4 Filtrare empirică, statistică și morfologică a pătratelor detectate    13

Capitolul 3 – Recuperarea posturii    16

3.1 Transformări geometrice    16

3.2 Construirea matricei de proiecție    17

3.3 Problema estimării posturii    18

3.3.1 Modelul camerei    18

3.3.2 Formularea problemei    21

3.3.3 Algoritmul Iterației ortogonale    22

Capitolul 4 – Detecția mișcării    27

4.1 Bază matematică    27

4.2 Procedeul de detecție a mișcării    29

Capitolul 5 – Înțelegerea mișcării    32

5.1 Histograma    32

5.2 Produsul de convoluție    33

5.3 Procedeul de înțelegere a mișcării    34

5.4 Probleme la detecție și rezolvări propuse    36

5.4.1 Simulare 3D    36

5.4.2 Filtru Laplace    37

5.4.3 Diferența între deviații standard    38

5.4.4 Spațiul de culori RGB normalizat    39

5.5 Exemplu    39

Capitolul 6 – Aplicația Windows    40

6.1 Interfața cu utilizatorul    42

6.1.1 Utilizatori    42

6.1.2 Fereastra principală și cea de vizualizare a istoricului    43

6.1.3 Fereastra de creare și conectare la jocuri în rețea    44

6.1.4 Fereastra Joc    45

6.1.5 Detalii de implementare    47

6.2 Procesarea de imagine    48

6.2.1 Matlab    48

6.2.2 Managed C++    49

6.3 Grafica 3D    50

6.4 Motorul de șah    52

6.5 Conectare în rețea    52

6.6 Flickr    55

6.7 Audio    55

Capitolul 7 – Concluzii    56

Bibliografie    58

Lista de figuri

Listă de figuri

Figura 1.1 – Camera în o postură arbitrară față de tabla de șah    7

Figura 1.2 – Camera în o postură ideală fată de tabla de șah    8

Figura 2.1 – Detecția tablei de șah    9

Figura 3.1 – Imagine obținută de la cameră în cazul ideal    16

Figura 6.1 – Arhitectura Mihos și limbaje de programare folosite    40

Figura 2.1.1 – Două mulțimi A și B. (sursă (6))    10

Figura 2.2.1 – Imaginea color de la cameră    11

Figura 2.2.2 – Imaginea după dilatare    11

Figura 2.2.3 – Imaginea în nuanțe de gri    11

Figura 2.2.4 – Imaginea după binarizare    11

Figura 2.3.1 – Imaginea cu marginile marcate    12

Figura 2.3.2 – Algoritmul Douglas-Peucker    13

Figura 2.3.3 – Rezultatul simplificărilor poligoanelor detectate    13

Figura 2.4.1 – Rezultatul eliminării statistice și empirice a pătratelor    14

Figura 2.4.2 – Cele 8 pătrate care marchează colțurile tablei    15

Figura 3.3.1 – Modelul pinhole al camerei    19

Figura 3.3.2 – Problema estimării posturii (sursa (5))    21

Figura 4.1.1 – Două imagini consecutive și diferența obținută între ele    27

Figura 4.1.2 – Deviația standard la o variabilă aleatoare (sursă (17))    28

Figura 4.2.1 – Procedeul de detecție al mișcării unei piese    29

Figura 4.2.2 – Mișcare de mână, finalizată cu mutare de piesă    31

Figura 4.2.3 – Mișcare de mână, nefinalizată cu mutare de piesă    31

Figura 5.1.1 – Imagine inițială și histograme pentru componente roșu, verde și albastru    32

Figura 5.3.1 – Procedeul folosit pentru înțelegerea mișcării    34

Figura 5.3.2 – Imaginile înainte și după mișcare și diferența între ele    35

Figura 5.3.3 – Stânga: histogramă pentru pătrat ocupat, dreapta: histogramă pentru pătrat liber    35

Figura 5.4.1 – Aranjarea inițială a simulări    37

Figura 5.5.1 – Pătrate detectate    39

Figura 5.5.2 – Simulare de mutare    39

Figura 6.2.1 – Fereastra de selecție și cea de creare utilizatori    42

Figura 6.1.2 – Ranguri de jucători în Mihos    42

Figura 6.1.3 – Reprezentare utilizatori în Mihos    43

Figura 6.1.4 – Fereastra principală    43

Figura 6.1.5 – Fereastra My History (Istoricul meu) 44

Figura 6.1.6 – Fereastra de creare și conectare la jocuri în rețea    44

Figura 6.1.7 – Fereastra Joc înainte de detecție    45

Figura 6.1.8 – Fereastra Joc după detecție, selecția dificultății    45

Figura 6.1.9 – Fereastra joc cu piesele 3D, în așezarea inițială    46

Figura 6.1.10 – Fereastra joc cu piesele 3D, după câteva mișcări    46

Figura 6.1.11 – Fereastra joc cu piesele 2D, după câteva mișcări    46

Figura 6.1.12 – Selecția camerei    45

Figura 6.1.13 – Timer și istoric mutări    46

Figura 6.1.14 – Arhitectura WPF    47

Figura 6.3.1 – Modele 3D pentru piesele de șah    51

Figura 6.5.1 – Arhitectura client – server    52

Figura 6.5.2 – Conectarea la server    53

Figura 6.5.3 – Creare joc nou în rețea    54

Figura 6.5.4 – Anulare joc existent în rețea    54

Bibliografie

Bibliografie

1. Rayment, W.J. Chess Rules. Chess Rules. [Interactiv] [Citat: 2008 Mai 2008.] http://www.conservativebookstore.com/chess/.

2. Wikipedia Chess Engines. Wikipedia. [Interactiv] [Citat: 7 Mai 2008.] http://en.wikipedia.org/wiki/Chess_engine.

3. Wikipedia Deep Blue. Wikipedia. [Interactiv] [Citat: 7 Mai 2008.] http://en.wikipedia.org/wiki/IBM_Deep_Blue.

4. A chess-playing robot: lab course in robot sensor integration. Groen, F.C.A., și alții. 6, s.l. : IEEE, 1992, Instrumentation and Measurement, IEEE Transactions on, Vol. 41.

5. Lu, Chien-Ping, Hager, Gregory D. și Mjolsness, Eric. Fast and Globally Convergent Pose Estimation from Video Images. IEEE Trans. Pattern Analysis and Machine. 2000, Vol. 22, 6.

6. Gonzales, R. C. și Woods, R. E.
Digital Image Processing . s.l. : Addison Wesley, 1993.

7. Algorithms for the reduction of the number of points required to represent a digitized line or its caricature. Douglas, David și Peucker, Thomas. 112-122, 1973, The Canadian Cartographer, Vol. 10(2).

8. Visual Servo Control of Robots Using Kalman Filter Estimates of Relative Pose. Wilson, W. J. 12th IFAC World. Congress. Vol. 19, pg. 399-404.

9. Superior Augmented Reality Registration by Integrating. State, Andrei, și alții. 1996. Proceedings of the 23rd annual conference on Computer graphics and interactive techniques. ISBN 0-89791-746-4.

10. Grimson, W. E. L.
Object Recognition by Computer. Cambridge Mass. : MIT Press, 1990.

11. An Analytic Solution for the Perspective 4-Point Problem. Horaud, Radu P., și alții. 1989 : s.n. Computer Vision, Graphics and Image Processing. Vol. 47, pg. 33-34.

12. Ganapathy, S.
Decomposition of transformation matrices for robot vision. s.l. : IEEE, 1984.

13. Wikipedia Gauss-Newton Algorithm. Wikipedia. [Interactiv] [Citat: 9 Mai 2008.] http://en.wikipedia.org/wiki/Gauss-Newton_algorithm.

14. Three-Dimensional Object Recognition from Single Two-Dimensional Images. Lowe, David G. [ed.] ACM. 3, s.l. : ACM, 1987, Artificial Intelligence, Vol. 31, pg. 355-395. ISSN 0004-3702.

15. Vezhnevets, Vladimir. GML MatLab Camera Calibration Toolbox. Graphics and Media Lab. [Interactiv] http://research.graphicon.ru/calibration/gml-matlab-camera-calibration-toolbox.html.

16. Closed-Form Solution of Absolute Orientation Using Orthonormal Matrices. Horn, Berthold K.P, Hilden, Hugh M. și Negahdaripour, Shahriar. Aprilie 1987, Journal of the Optical Society of America , Vol. 4, p. 629.

17. Wikipedia Standard Deviation. Wikipedia. [Interactiv] [Citat: 11 Mai 2008.] http://en.wikipedia.org/wiki/Standard_deviation.

18. Skarbek, W. și Koschan, A.
Colour image segmentation – a survey. s.l. : Institute for Technical Informatics, Technical University of Berlin, 1994.

19. Robust Pose Estimation from a Planar Target. Schweighofer, Gerald și Pinz, Gerald. 12, s.l. : IEEE, 2006, IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, Vol. 28.

Comentarii

Pina acum... 2 comentarii la articolul “Mihos”

  1. Andrei on May 25th 9:54 pm

    Salut.
    Poti sa mi trimiti pe email Cap 4 si 5 a lucrarii tale?
    Acum lucrez la un program pentru detectia miscarii si am nevoie de careva indicii…
    multumesc anticipat

  2. Andrei on May 25th 9:55 pm

Lasa un comentariu.





Valid XHTML 1.0 Transitional