IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Reconnaissance d'image (forme simple])


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 117
    Par défaut Reconnaissance d'image (forme simple])
    Bonjour, suite au conseil d'un modo du site, je viens poster ici mes quelques questions.

    Pour notre stage, mon partenaire et moi devons devons coder un programme permettant de savoir ou non si il y a une petite forme (double cercle) dans le coin haut de droite d'une page scannée.

    L'identification de cette forme permettra de savoir si il faut ou non créer un nouveau document pdf (en effet, le scanner numérise toutes les pages et crée un gros pdf avec le tout, mais l'utilisateur souhaite parfois créer plusieurs pdf).

    Étant novice dans ce domaine, on nous a conseiller d'utiliser OpenCV (nous souhaiterions l'utiliser en C), mais voila la doc est vaste et nous ne savons pas trop comment procéder.

    Je suis donc à la recherche d'information sur les possibles fonctions utilisable, le bon liens à lire et autre éventuels conseils.

    Merci d'avance.

  2. #2
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    Pour la detection de cercles va voir du côté de la transformée de Hough et plus particulièrement de la fonction cvHoughCircle.
    Par ailleurs vu que tu connais déja en partie la position de tes cercles sur l'image il te faut te restreindre à cette partie (fonction cvSetImageROI) afin d'éviter un maximum de fausses détection.

    Si ta marque est vraiment caractéristique (tampon encreur par exemple) tu peux très bien envisager un matching de cette zone avec un template du tampon afin de detecter ou non sa présence. (j'ai personnelement réaliser ça pour une detection de tampons de bibliothèque sur des manuscrits. la fonction a utiliser ici est, dans mes souvenirs la fonction cvMatchWithTemplate.

    Attention à l'utilisation d'un bon seuil...
    voila

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 117
    Par défaut
    Citation Envoyé par Vinsss84 Voir le message
    Pour la detection de cercles va voir du côté de la transformée de Hough et plus particulièrement de la fonction cvHoughCircle.
    On a tester aujourd'hui, sa bug un petit peu mais on ne connait pas encore bien la lib c'est normale.

    Citation Envoyé par Vinsss84 Voir le message
    Par ailleurs vu que tu connais déja en partie la position de tes cercles sur l'image il te faut te restreindre à cette partie (fonction cvSetImageROI) afin d'éviter un maximum de fausses détection.
    On y avait penser mais on était pas sur que ce soit possible.

    Citation Envoyé par Vinsss84 Voir le message
    Si ta marque est vraiment caractéristique (tampon encreur par exemple) tu peux très bien envisager un matching de cette zone avec un template du tampon afin de detecter ou non sa présence. (j'ai personnelement réaliser ça pour une detection de tampons de bibliothèque sur des manuscrits. la fonction a utiliser ici est, dans mes souvenirs la fonction cvMatchWithTemplate.

    Attention à l'utilisation d'un bon seuil...
    voila
    La je ne comprend pas tout si tu pouvais me donner quelques explication sur le matching ce serait vraiment cool.

    En tout cas merci beaucoup pour la réponse !

  4. #4
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    Bien alors, le matching c'est simplement mettre en correspondance deux formes semblables.
    En gros tu as d'un côté un fichier image qui contient ton symbole et tu vas aller chercher dans ton image toutes les formes qui sont semblable a celle contenues dans ton template (le petit fichier image contenant ton symbole).
    C'est possible uniquement si ton symbole est toujours a peu de chose près semblable.

    Pour la ROI c'est très simple à mettre en place.
    Bon pour commencer ROI signifie Region of Interest. Ca peut paraître évident mais c'est un terme a connaître.
    En pratique il te suffit de définir un rectangle (cvRect) qui aura pour caractéristiques la poistion dans l'image de la zone qui t'interesse.
    Typiquement si tu veux le coint haut/gauche, avec un rectangle d'une taille 200x200 pixel tu vas faire :

    CvRect roi = cvRect(0,0,200,200);
    cvSetImageROI(image,roi);

    voilou

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 117
    Par défaut
    Merci bien, on va se focaliser dès demain sur la recherche et le fonctionnement des fonctions de matching !

    Merci encore

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 117
    Par défaut
    Citation Envoyé par Vinsss84 Voir le message
    Bien alors, le matching c'est simplement mettre en correspondance deux formes semblables.
    En gros tu as d'un côté un fichier image qui contient ton symbole et tu vas aller chercher dans ton image toutes les formes qui sont semblable a celle contenues dans ton template (le petit fichier image contenant ton symbole).
    C'est possible uniquement si ton symbole est toujours a peu de chose près semblable.
    Question: as-tu des exemple de fonctions qui font du matching, j'ai chercher toute la matinée mais sans succès, l'utilisation de cette fonction n'a pas l'air très courante.

    En ce qui concerne la délimitation d'un zone pour la recherche de notre forme, ce ne sera pas possible car il pourra etre n'importe ou sur la page scannée. Du coup, le temps de recherche ne sera pas trop long avec le matching sur une page A4 ?

    Merci bien

  7. #7
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    le temps de recherche risque en effet d'être long, de l'ordre d'une a deux secondes. mais surtout selon le signe, il risque d'apparaitre un certain nombre de fausses detections. Realiser la recherche sur de version binarisées de la page et du template pourront aider également.

    Mon code pour faire ça, non commenté, non expliqué, pas trop le temps la...

    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
    int Tools::Retrait_Tampon(IplImage *src,  CvRect ROI,char *filename)
    {
        IplImage * templ_bis = cvLoadImage("bibl.jpg",0);
        //IplImage * templ_bis = cvLoadImage("croix.jpg",0);
        IplImage * templ;
        int n_stamps = 0;
        float rapporthl = 0;
        float rapporthl_fix = 0;
        float coeff_resize;
        rapporthl_fix = 2714./1968.;
        float src_x = cvGetSize(src).width ;
        float src_y = cvGetSize(src).height;
        float templ_x = cvGetSize(templ_bis).width ;
        float templ_y = cvGetSize(templ_bis).height;
        rapporthl = src_y/src_x;
        coeff_resize = rapporthl_fix/rapporthl;
        float seuil;
        seuil = STAMP;
        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);
            seuil = seuil / (coeff_resize*coeff_resize*coeff_resize);
     
            cvSaveImage("bibl3.jpg",templ);
        }
        else
        {
            templ = cvLoadImage("bibl.jpg",0);
        }
        Tools::Binarization(src,src,3,1);
        Tools::Binarization(templ,templ,3,1);
        //cvSmooth(src,src,2);
        //cvSmooth(templ,templ,2);
        int x = (int)src_x- cvGetSize(templ).width +1;
        int y = (int)src_y - cvGetSize(templ).height +1;
        IplImage * result = cvCreateImage(cvSize(x,y),IPL_DEPTH_32F,1);
        CvRect correct;
        //FILE * stamp;
        //strcat(filename,".dat");
        //stamp = fopen(filename,"w+");
        cvMatchTemplate(src,templ, result, 4 );
     
        double min_val = 0;
        double max_val = 0;
     
        CvPoint max_loc = cvPoint(0,0) ;
        CvPoint min_loc = cvPoint(0,0);
     
        if (ROI.height != 0)
        {
            cvSetImageROI(result,ROI);
        }
     
        cvMinMaxLoc(result,&min_val,&max_val,&min_loc,&max_loc,0);
     
        if ( max_val > seuil)
        {
     
           cvRect(max_loc.x,max_loc.y,cvGetSize(templ).width,cvGetSize(templ).height);
            cvSetImageROI(src,correct);
     
            cvSet(src,cvScalarAll(255),0);
            cvSetImageROI(src,cvRect(0,0,(int)src_x,(int)src_y));
            //cvSmooth(src,src,2);
            //fprintf(stamp,"Tampon : %i\n x : %i \n y : %i \n",n_stamps,max_loc.x,max_loc.y);
     
     
     
        }
        //printf("valeur trouvée : %d \n",n_stamps);
        //fclose(stamp);
        cvReleaseImage(&templ);
        cvReleaseImage(&result);
        cvReleaseImage(&templ_bis);
        return n_stamps;
     
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int Tools::Binarization(IplImage *src, IplImage *bin_img, int window, int smooth)
    {
        int err_ind = 0;
        //Smoothing the image in order to reduce noice influence
        if (smooth ==1)
        {
            cvSmooth(src,src,2);
        }
     
         cvAdaptiveThreshold(src,bin_img,255,CV_ADAPTIVE_THRESH_GAUSSIAN_C,CV_THRESH_BINARY,window);
     
     
        return err_ind;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Reconnaissance d'image [forme simple]
    Par dewey01 dans le forum Traitement d'images
    Réponses: 9
    Dernier message: 02/09/2008, 12h56
  2. dessin de forme simple
    Par ryu20 dans le forum GTK+
    Réponses: 2
    Dernier message: 05/06/2007, 22h30
  3. [Forms 10g] Execution impossible d'une form simple
    Par sala|-| dans le forum Forms
    Réponses: 7
    Dernier message: 27/02/2007, 21h05
  4. Question de mise en forme simple
    Par ludovic85 dans le forum C#
    Réponses: 4
    Dernier message: 06/02/2007, 20h59
  5. reconnaissance popup image
    Par franfr57 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/12/2006, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo