bonjour
je suis entrain de terminer un projet sur la détection des plaques d'immatriculation
je suis arrivée à détecter les plaques , à installer un OCR dans mon application mais le problème est que pour avoir tous chiffres de mes plaques je dois segmenter l'image de la plaque en chiffres,en effet l'image principale à été transformée en niveau de gris puis j'ai détecté la plaque et j'ai transformé l'image résultat en binaire noir et blanc comme suit (cpy c'est l'image de la matricule)
puis j'ai essayer de faire une fonction qui me permettra de réaliser la segmentation
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 int width2 = cpy -> width; int height2 = cpy-> height; int step = cpy->widthStep; int channels = cpy->nChannels; char * data = cpy->imageData; for(int i=0;i<height2;i++) for(int j=0;j<width2;j++) for(int k=0;k<channels;k++) { if(data[i*step+j*channels+k]<20) data[i*step+j*channels+k]=255; else data[i*step+j*channels+k]=0; }
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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 int sommecolonne(j,IplImage* image) { int som = 0;// elle va prendre la somme des valeurs des pixels d'une colonne for (int i=0;i<image->width;j++){ for(int k=0;k<image->channels;k++) { som=som+data[i*step+j*channels+k]; } } return(som) } int minimum( int *t, n) // si la colonne à la somme la plus faible alors c'est une ligne qui sépare deux //chiffres { int min=t[0]; for(int i=0;i<n;i++){ if(t[i]<min) min=t[i]; } return(min) } void segmentation() { IplImage* cpy = image->détection matricule(); int width = cpy -> width; int height = cpy-> height; int step = cpy->widthStep; int channels = cpy->nChannels; char * data = cpy->imageData; int *t; for(int j=0;j<width;j++) { t[j]=sommecolonne(j,cpy); } for(int j=0;j<width;j++) { if(t[i]<minimum( t, width) cvLine(cpy, cvPoint(j ,0), cvPoint(j,height), cvScalar(255,0,0,0), 8,1); } IplImage* resize = cvCreateImage(cvSize(250,50),IPL_DEPTH_8U ,0); cvResize( cpy, resize,1); cvNamedWindow( "segmentation",1); cvShowImage("segmentation", resize); }
le problème c'est ça ne marche pas sur mes plaques et qu'il ne prend pas la valeur width et height comme longueur et largeur de l'image
j'avoue que je ne comprends pas ou je me plante
alors si quelqu'un peut m'aider ,ça serait géniale
rebonjour j'ai oublié de préciser que la plaque est une image en fond noir et les chiffre en blanc
merci
Partager