Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/09/2008, à 14:47

dewey01

[OpenCV] problème cvMatchTemplate en C

Bonjour, je suis actuellement en train de développer un petit programme pour retrouver un petit logo sur une page scannée (genre un tampon).
J'ai l'image, je connais le tampon, j'ai donc décidé d'utiliser la fonction cvMatchTemplate sous OpenCV.
Voici mon code:

#include <stdio.h>
#include <stdlib.h>
#include "cv.h"
#include "highgui.h"

int         main()
{
   IplImage *templ;
   IplImage *templ_bis;
   IplImage *src;
   IplImage *result;
   int      n_stamps = 0;
   float    rapporthl = 0;
   float    rapporthl_fix = 0;
   float    seuil;
   int      x;
   int      y;
   int      x2;
   int      y2;
   double   min_val = 0;
   double   max_val = 0;
   float    coeff_resize;
   float    src_x;
   float    src_y;
   float    templ_x;
   float    templ_y;
   CvPoint  max_loc;
   CvPoint  min_loc;

   templ_bis = cvLoadImage("template.jpg", 0);
   src = cvLoadImage("image.jpg", 0);
   seuil = 9000000 ;
   rapporthl_fix = 2714./1968.;
   src_x = cvGetSize(src).width;
   src_y = cvGetSize(src).height;
   templ_x = cvGetSize(templ_bis).width;
   templ_y = cvGetSize(templ_bis).height;
   rapporthl = src_y/src_x;
   coeff_resize = rapporthl_fix/rapporthl;
   if (coeff_resize > 1.01 && coeff_resize < 1.5)
    {
        templ = cvCreateImage(cvSize((int)(templ_x / coeff_resize),
            (int)(templ_y / coeff_resize)), 8, src->nChannels);
        cvResize(templ_bis, templ, CV_INTER_LINEAR);
        seuil = seuil / (coeff_resize * coeff_resize * coeff_resize);
        cvSaveImage("template.jpg",templ);
    }
    else
    {
        templ = cvLoadImage("template.jpg", 0);
    }
   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);
   cvMatchTemplate(src, templ, result, 4);
   max_loc = cvPoint(0,0);
   min_loc = cvPoint(0,0);
   cvMinMaxLoc(result, &min_val, &max_val, &min_loc, &max_loc, 0);
   if (max_val > seuil)
   {
       printf("Template trouvé, eureka !\n");
   }
   else
   {
       printf("Template non trouvé !\n");
   }
   cvReleaseImage(&templ);
   cvReleaseImage(&result);
   cvReleaseImage(&templ_bis);
   return(0);
}

Mon image et mon tampon de test :

imagezg0.th.jpg

templatezz0.jpg

Malheureusement il ne trouve pas le template sad

Merci d'avance pour les éventuelles suggestions.

Hors ligne

#2 Le 08/09/2008, à 08:08

dewey01

Re : [OpenCV] problème cvMatchTemplate en C

Petit up. Je pense que cela provient du paramétrage du seuil, mais je ne trouve rien dans la documentation à ce propos.

Dernière modification par dewey01 (Le 08/09/2008, à 08:50)

Hors ligne

#3 Le 08/09/2008, à 10:08

Karl_le_rouge

Re : [OpenCV] problème cvMatchTemplate en C

T'as essayé de changer de méthodes de comparaison ?
De plus, essaie d'utiliser les constantes définies par OpenCV parce que 4 ça m'évoque pas grand chose ni à moi ni à mon collègue.

Hors ligne

#4 Le 08/09/2008, à 10:20

dewey01

Re : [OpenCV] problème cvMatchTemplate en C

Karl_le_rouge a écrit :

T'as essayé de changer de méthodes de comparaison ?
De plus, essaie d'utiliser les constantes définies par OpenCV parce que 4 ça m'évoque pas grand chose ni à moi ni à mon collègue.

J'ai essayer chaque méthodes, en utilisant les defines mais comme le seuil dépend de la taille du template et de la méthode utilisée, a mon avis cela ne fera pas fonctionné le matching sans bon réglage de ce maudit seuil sad
merci pour la réponse

Edit: Apparemment la valeur retournée de max_val ne change jamais quelque soit le template, je vais essayer d'alleger mon code.

Dernière modification par dewey01 (Le 08/09/2008, à 11:33)

Hors ligne

#5 Le 10/09/2008, à 14:16

dewey01

Re : [OpenCV] problème cvMatchTemplate en C

Voila, j'ai réussi a faire fonctionner le programme, je vous met le code, quelqu'un sera peut-être intéresser.

#include <stdio.h>
#include <stdlib.h>
#include "cv.h"
#include "highgui.h"
 
int         main()
{
   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;
   CvRect   correct;
 
   /* Récupération de l'image et du template, format jpeg */
 
   templ= cvLoadImage("template.jpg", 0);
   src = cvLoadImage("image.jpg", 0);
 
   /* Initialisation du seuil, 0.900000 car pour max_val j'obtiens des valeurs entre
       0.900000 et 1.000000 lorsque le template se trouve sur l'image */
 
   seuil = 0.900000;
 
   /* 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 avec la dernière méthode (un peu a taton comme toi) */
 
   cvMatchTemplate(src, templ, result, CV_TM_CCOEFF_NORMED);
 
   /* Recherche des résultats */
 
   max_loc = cvPoint(0,0);
   min_loc = cvPoint(0,0);
   cvMinMaxLoc(result, &min_val, &max_val, &min_loc, &max_loc, 0);
 
   /* Debugs */
 
   printf("valeur de max_val : %f\n", max_val);
   printf("valeur de seuil : %f\n", seuil);
 
   /* J'entoure le template par un cercle */
 
   if (max_val > seuil)
   {
       printf("Template trouvé, eureka !\n");
       cvCircle(result, cvPoint(max_loc.x, max_loc.y), 10,
        CV_RGB(255, 50, 50), 1, 8, 0);
   }
   else
   {
       printf("Template non trouvé !\n");
   }
   /* Affichage de l'image résult */
 
   cvNamedWindow("test", 1);
   cvShowImage( "test", result);
   cvWaitKey(0);
 
   /* Libération de la mémoire */
 
   cvReleaseImage(&templ);
   cvReleaseImage(&result);
   return(0);
}

J'ai toutefois un dernier souci, lorsque je veux mettre un template avec une lettre de type "A" mais avec un fond transparent, sa chie dans la colle smile

Hors ligne

#6 Le 12/09/2008, à 12:53

dewey01

Re : [OpenCV] problème cvMatchTemplate en C

Petit up pour savoir si c'est possible de comparer une image avec un template qui possède un fond transparent (PNG)

Hors ligne