Salut,

Je reviens après avoir fait des tests avec cvMatchTemplate et cvMatchShapes, j'obtiens encore des résultats incohérents : ces 2 méthodes trouvent plus de similtude avec les template de panneaux différents, qu'avec les template de panneaux identiques.

Je me suis inspiré de la dicussion :

http://www.developpez.net/forums/d60...-forme-simple/

Voici mon code :

Code : 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
 
    //passe l'image en niveau de gris
	IplImage *grayImage = [UIImageCommonUtil UIImage2grayscaleIpl:image];
	//passe le template en niveau de gris
	IplImage *object = [UIImageCommonUtil UIImage2grayscaleIpl:template];
 
	//Egualise l'histograme de la photo (ajuste la luminausité + le contraste)
	IplImage* equalizedImage = cvCreateImage( cvGetSize(grayImage), IPL_DEPTH_8U, 1 );
	cvEqualizeHist( grayImage, equalizedImage );
	cvReleaseImage(&grayImage);
 
	//resize le template pour le faire matcher avec la taille de l'image
	IplImage *resizedObject = cvCreateImage( cvSize(equalizedImage->width , equalizedImage->height ), object->depth, object->nChannels );
	cvResize(object, resizedObject, CV_INTER_LINEAR);
	cvReleaseImage(&object);
 
    //creation de l'image resultat de la bonne taille
    float src_x = cvGetSize(equalizedImage).width;
    float src_y = cvGetSize(equalizedImage).height;
 
    int x = (int)src_x - cvGetSize(resizedObject).width +1;
    int y = (int)src_y - cvGetSize(resizedObject).height +1;
 
    IplImage * result = cvCreateImage(cvSize(x,y),IPL_DEPTH_32F,1);
 
    //utilisation de la fonction de match, methode cross cor
    cvMatchTemplate(equalizedImage,resizedObject, result, 4 );
 
    double min_val = 0;
    double max_val = 0;
 
    CvPoint max_loc = cvPoint(0,0) ;
    CvPoint min_loc = cvPoint(0,0);
 
    //Recherche avec cvMinMaxLoc de la valeur la plus probable d'être un match positif, test par rapport a la valeur de seuil 
 
    cvMinMaxLoc(result,&min_val,&max_val,&min_loc,&max_loc,0);

Pour cvMatchShape j'utilise le même code en remplacant la partie de comparaison avec cette ligne :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
double max_val =  cvMatchShapes(equalizedImage, resizedObject, CV_CONTOURS_MATCH_I1, 0);

Je compare les mêmes images que dans la dicussion : reconnaissance-panneaux-routier-surf


J'obtiens les résultats suivants :

cvMatchTemplate :

Comparaison de l'image de sens interdit avec une icone de sens interdit :

max_val = 444354272


Comparaison de l'image de sens interdit avec une icone de parking :

max_val = 563814144




cvMatchShapes

Comparaison de l'image de sens interdit avec une icone de sens interdit :

max_val = 0.0066527691159631863


Comparaison de l'image de sens interdit avec une icone de parking :

max_val = 0.010805821063653798


Avez vous une idée de ce qui fait échouer la comparaison ?

Merci d'avance pour votre aide!
Vincent