Bonjour,
J'ai je suis en train d'écrit un programme qui auras pour finalité l'analyse et la reconnaissance d'images prisent par une camera IP.
Toute la partie gestion de la connexion TCP avec la camera fonctionne ainsi que la partie traitement d'image : redimensionnement, amélioration des blancs, binarization de l'image et plusieurs filtres me permettant d'obtenir des signatures spécifiques par image (densité, nombre de point blanc ou noir sur un ligne horizontal, etc...) :
Pièce jointe 146138 => Pièce jointe 146136
Afin de rendre la reconnaissance possible, j'ai effectué un apprentissage de toute les signatures de mes images et les aient inscrite dans un fichier CSV. Ce dernier fonctionne correctement.
Mon problème apparais au niveau de la reconnaissance d'image. En effet, une fois l'image acquise, je la soumet au même traitements que les images pré-enregistrées dans ma base (fichier CVS) et avec les mêmes filtres.
Toute fois, impossible d'implémenter un code de reconnaissance "fiable", je suis toujours à la recherche d'un algorithme qui me permettrais de reconnaître une image dans 99% des cas.
Voici mon code concernant la reconnaissance d'image :
Comme expliqué précédemment, ce code fonctionne mais n'est pas "fiable":?. les bornes de + ou - 10% me permettent de géré les problèmes de luminosité dans la pièce (en complément d'une lampe qui est fixée à coté de la camera), et les écarts entre les photos prisent au moment de la création de ma base et celles prisent une fois le programme lancé.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 void camera::reconnaissance() { //chargement du fichier CSV QFile file("Chemin d'accès au CSV"); if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) ) { QTextStream in( &file ) ; QString line = in.readLine() ; int nline = 1; while ( piece == false ) { QStringList parse = line.split(";") ; if (( line.isEmpty() )||( line.startsWith("#") )) { line = in.readLine() ; nline++ ; continue; } //l'image 0 est blanche if ( (int)densite_photo == 0 && line_1+line_2 == 0) { piece = true; nb_piece =0; rotation_piece = 0; break; } if (densite_photo >= (parse[1].toLong() * 0.10) && densite_photo <= (parse[1].toLong() * 1.90) ) { if(grid >= (parse[2].toLong()*0.10) && grid <= (parse[2].toLong() * 1.90) ) { if(line_1 >= (parse[3].toLong() * 0.10) && line_1 <= (parse[3].toLong() * 1.90) ) { if(line_2 >=(parse[4].toLong()* 0.10) && line_2 <= (parse[4].toLong() * 1.90)) { nb_piece = parse[0].toInt(); rotation_piece = parse[5].toInt(); piece = true; break; } } } } line = in.readLine() ; nline++ ; if(in.atEnd()) { break; } } ecrir_log("densite : " + QString::number(densite_photo)); ecrir_log("grid : " + QString::number(grid)); ecrir_log("line 1 : " + QString::number(line_1)); ecrir_log("line 2 : " + QString::number(line_2)); file.close(); } }
Cependant, mon programme ce limite à parcourir le fichier CSV et à prendre comme image reconnu la première qui auras répondu au condition de densité, grid, line1 et 2, ce qui pose des problèmes dans le cas ou deux images se ressemblent, mon programme ce contentera de prendre la première image qui correspond même si la bonne image se trouve 3 lignes après dans ma base.
Avez vous des idées d'algorithmes à me proposer ? Une autre manière d'implémenter ce code ?
Merci d'avance :D.