Bonjour,

Voila j'ai un petit programme c++ qui m'effectue une recherche de pattern sur une image.
A chaque pattern trouvé je dessine un cercle à l'emplacement du pattern et je ré-éffectue la recherche jusqu'à que je trouve tous les occurrences du partern. J'obtiens alors la localisation de chaque occurrence du pattern sur mon image.

J'utilise la fonction cvMatchTemplate d'openCV mais je trouve cette recherche trop lente! Il y aurait-il un moyen de l'optimiser, en utilisant un autre mode de recherche par exemple (j'utilise CV_TM_CCOEFF_NORMED). Je ne comprend rien aux différents mode expliqué dans la doc : http://opencv.willowgarage.com/docum...tml#index-1172

J'ai également vu qu'un développeur avait ré-implémenter la fonction cvMatchTemplate pour qu'elle soit plus rapide (ici), est-ce que cette solution est viable?

Voici mon code si vous avez des idées pour l'optimiser, il y a surement un moyen mais je n'y connais vraiment pas grand chose à OpenCV et en reconnaissance d'image en général.

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
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
 
int main(int argc, char *argv[])
{
   argv[1] = "capture/pattern1.jpg";
 
   IplImage *templ;
   IplImage *src;
   IplImage *result;
   double   seuil;
   int      x;
   int      y;
   double   min_val = 0;
   double   max_val = 0;
   float    src_x;
   float    src_y;
   CvPoint  max_loc;
   CvPoint  min_loc;
 
   /* Récupération de l'image et du template, format jpeg */
   templ= cvLoadImage(argv[1], 0);
   if(!templ){
            cout<<("Erreur lors du chargement de l'image : ");
            system("pause");
            exit(EXIT_FAILURE);
   }
   src = cvLoadImage("E:\\Image\\Image.jpg", 0);
   if(!src){
            cout<<("Erreur lors du chargement de l'image : %s\n");
            system("pause");
            exit(EXIT_FAILURE);
   }
 
 
   CvRect roi = cvRect(430,200,500,500);
   cvSetImageROI(src,roi);
   src = cvCloneImage(src);
 
    seuil = 0.800000;
 
    bool encore = true;
    fichier << argv[1] << endl;
    while (encore) {
 
       /* Récupération des valeurs nécessaires pour la création de l'image résult   */
       src_x = cvGetSize(src).width;
       src_y = cvGetSize(src).height;
       x = (int)src_x- cvGetSize(templ).width +1;
       y = (int)src_y - cvGetSize(templ).height +1;
       result = cvCreateImage(cvSize(x,y),IPL_DEPTH_32F,1);
 
       /* Utilisation de cvMatchTemplate */
       cvMatchTemplate(src, templ, result, CV_TM_SQDIFF_NORMED);
 
       /* Recherche des résultats */
      min_val = 0;
       max_val = 0;
       max_loc = cvPoint(500,500);
       min_loc = cvPoint(100,100);
       cvMinMaxLoc(result, &min_val, &max_val, &min_loc, &max_loc, 0);
 
       /* J'entoure le template par un cercle */
       if (max_val > seuil)
       {
           int xxx = max_loc.x + 15;
           int yyy = max_loc.y + 20;
          //printf("Template trouvé, eureka !\n");
           cvCircle(src, cvPoint(xxx, yyy), 30, CV_RGB(255, 50, 50), -1, 8, 0);
       }
       else
       {
           //printf("Template non trouvé !\n");
           encore = false;
       }
  }
 
   /* Libération de la mémoire */
  cvReleaseImage(&templ);
   cvReleaseImage(&src);
   cvReleaseImage(&result);
 
 
   }
   return(EXIT_SUCCESS);