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 :

Pointeur sur fonction, callback & wrapper


Sujet :

OpenCV

  1. #1
    Membre confirmé Avatar de thorium90
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut Pointeur sur fonction, callback & wrapper
    Bonjour a tous,

    Voila quelque jours que je cherche à faire une trackbar sur une image d'openCV hors je ne trouve pas d'exemple qui corresponde à ce que je cherche ou tout du moins que j'arrive à comprendre afin de l'implémenter a ma sauce.

    Problème sans doute simple mais j'aimerai vraiment comprendre ce système car l'issue devrait "bouleverser" ma pensée (assez élémentaire) objet.

    Donc le problème et simple et les doc dessus nombreuse mais je n'arrive décidément pas a coder :

    But : Comment implémenter un pointeur sur fonction membre d'une classe ?

    Dans la FAQ de ce site je pense avoir trouvé ce qui s'en rapproche le + mais trop d'incompréhension m'empêche de le coder pour mon cas
    Rubrique : http://cpp.developpez.com/faq/cpp/?page=fonctions
    Question : Pourquoi ne peut-on pas passer une fonction membre là où on attend un pointeur de fonction ?

    Désolé de ne pas remettre le code d'y a trois jours qui m'a permis de savoir que c'est chez les pointeurs de fonctions que se trouve la solution. Je vous présente là une base épurer de presque tout superflu qui s'occupe de créer un objet ou s'opère les méthodes de traitement d'image et un main qui s'occupe de la partie fenêtre :

    Citation Envoyé par Fichier ClassModel.h :
    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
     
    #ifndef __MODEL__
    #define __MODEL__
     
    #include <cv.h>
    #include <highgui.h>
    #include <cxcore.h>
     
    #include <iostream>
    #include <algorithm>
     
    using namespace std;
     
    //!======================================
    class ClassModel
    {
        private:
            IplImage *imageBase; 
            IplImage *imageBuffer; 
     
        public:
            ClassModel(IplImage *image);
            ~ClassModel();
     
            IplImage* getImgBuffer();
            void thresholdFilter(int);
     
    };
    #endif
    Citation Envoyé par Fichier ClassModel.cpp :
    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
     
     
    #include "ClassModel.h"
    using namespace std;
     
    //!================================================================== CONSTRUCTEUR ==================================================
    ClassModel::ClassModel(IplImage *image)
    {
        int flip = 0;
     
        imageBase = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
        imageBuffer = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
     
        if(image->origin != IPL_ORIGIN_TL)
        {
            flip = CV_CVTIMG_FLIP;
        }
        cvConvertImage(image, imageBase, flip);
     
        imageBuffer = cvCloneImage(imageBase);
     
    }
    //!======================================
    void ClassModel::thresholdFilter(int threshold)
    {
        cvThreshold(imageBase, imageBuffer, (double)threshold, 255, CV_THRESH_BINARY );
    }
    //!======================================
    IplImage* ClassModel::getImgBuffer()
    {
        return (imageBuffer);
    }
    //!======================================
    ClassModel::~ClassModel()
    {
        cvReleaseImage(&imageBase);
        cvReleaseImage(&imageBuffer);
    }
    Citation Envoyé par Fichier main.cpp :

    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
     
    #include "ClassModel.h"
    //#include "StaticCallback.h"
     
    using namespace std;
     
    int main()
    {
        IplImage *img;
     
     
        img = cvLoadImage("image.jpg");
     
        ClassModel image_1(img);
     
        cvNamedWindow("Base NVG", CV_WINDOW_AUTOSIZE);
     
        image_1.thresholdFilter(127);
     
        cvShowImage("Base NVG", image_1.getImgBuffer());
     
        cvWaitKey(0);
     
        cvDestroyWindow("Base NVG");
        cvReleaseImage(&img);
        return 0;
    }
     
    //!=================================================================================
    Dans les essai déja effectué je suis partis dans la voie de faire static ma méthode ou encore une class static dédié a faire le transfert d'info entre le main et ma classe mais je rencontre irrémédiablement des problèmes de portée ou de syntaxe :p

    De ce que j'ai finalement vu dans la FAQ : La fonction static joue le role de "tampon" et doit prendre en paramètre la variable qui sera envoyé a la fonction membre de mon objet tout en re-déclarant un objet mais c'est ce concept qui me parait absurde et que j'ai pas du comprendre ^^

    Donc si vous pouviez m'aider a faire la trackbar dans le main pour pointer sur la fonction membre threshodlFilter(int) de la classModel je vous en serai très reconnaissant.

    Bonne soirée

  2. #2
    Membre confirmé Avatar de thorium90
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Juillet 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 120
    Par défaut
    La je viens de tester ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (Class::*thresholdFilter_ptr)(int) = &ClassModel::thresholdFilter;
    et l'appel de la trackbar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvCreateTrackbar("Seuil", "Base NVG", &seuil, 255, &thresholdFilter_ptr);
    Mais cela me retourne l'erreur suivante :

    cannot convert `void (ClassModel::**)(int)' to `void (*)(int) for argument `5'
    Ceci en gardant ma methode thresholdFilter dans ClassModel en NON STATIC.

Discussions similaires

  1. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  2. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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