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

C++ Discussion :

Assembler 2 fonctions entre elles?


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut Assembler 2 fonctions entre elles?
    Bonjour,

    Je souhaite afin de realiser mon programme assembler 2 fonctions entre elles :
    la première applique la fonction sobel puis treshold (seuillage) a une image reélle.
    Et je voudrais appliquer au résultat de cette image (image après seuillage) la fonction de Hough qui detecte les cerlces dans l'image...

    Voici ma première fonction (sobel + threshold) :

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    #include <stdlib.h>
    #include "StdAfx.h"
     
    using namespace cv;
     
    /*************************************** FONCTION SOBEL + THRESHOLD ************************************************/
     
     
    int main( )
    {
     
    	int height,width,step,step_mono,channels;          /*Here i have declared step_mono for handling the widthstep member of a monochrome image*/
     
    	uchar *data,*data_mono;                            /*similarly data mono for handling the data of monochrome image*/
     
    	int i,j,k;
      //Mat src;
      Mat src_gray;
      Mat grad;
      char* window_name = "Sobel Demo - Simple Edge Detector";
      int scale = 1;
      int delta = 0;
      int ddepth = CV_16S;
     
      int c;
     
    /// Load an image
    IplImage* frame=cvLoadImage("D:/Entwicklung/OpenCV/2010/Kopie von assemblage sobel + threshold/Release/image sans contre jour.bmp",1);
     
    if( frame == NULL )
    { return -1; }
     
    Mat src(frame);
     
     
      GaussianBlur(src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
     
      /// Convert it to gray
      cvtColor( src, src_gray, CV_RGB2GRAY );
     
      /// Create window
      namedWindow( window_name, CV_WINDOW_AUTOSIZE );
     
      /// Generate grad_x and grad_y
      Mat grad_x, grad_y;
      Mat abs_grad_x, abs_grad_y;
     
      /// Gradient X
      //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_x, abs_grad_x );
     
      /// Gradient Y
      //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_y, abs_grad_y );
     
      /// Total Gradient (approximate)
      addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );
     
      imshow( window_name, grad );
     
      //Resultat de grad dans IPL ....
      //IplImage  mono_thres=cvCreateImage( cvGetSize(frame), 8, 1 );
     IplImage frame2(grad);     
     
     
     //Faire à la fin
     
     IplImage* mono_thres=cvCreateImage( cvGetSize(&frame2), 8, 1 );
     
     
    	height = frame2.height;                           /*height is a member of IPLIMAGE structure and hence it comes handy like this in such situations, and same goes with below four statements*/
    	width = frame2.width;
    	step = frame2.widthStep;
    	step_mono = mono_thres->widthStep;
    	channels = frame2.nChannels;                      /*Number of channels in the image*/
     
    	data = (uchar *)frame2.imageData;                 /*Image is treated as as unsigned char data hence we use an unsigned char pointer to point to the same*/
    	cvNamedWindow("My Window", CV_WINDOW_AUTOSIZE );
    	data_mono = (uchar *)mono_thres-> imageData;       /*data of mono image is handled by the data_mono*/
     
    	for(i=0;i < height;i++) for(j=0;j < width;j++)      /*I am copying the first channel from the image in "frame" in the monochrome image with the help of this line below..*/ 
    		data_mono[i*step_mono+j*1+0]=data[i*step+j*channels+0];
     
     
    	//cvThreshold(mono_thres,mono_thres,12,               /*70 is the lower cut off*/
    	//40,                                                /*this is the higher cut off*/
    	//CV_THRESH_BINARY                                    /*The type of thresholding,more description in the documentation*/
     
    	cvThreshold(mono_thres,mono_thres,60,               /*70 is the lower cut off*/
    	140,                                                 /*this is the higher cut off*/
    	CV_THRESH_BINARY                                    /*The type of thresholding,more description in the documentation*/
     
    	);
     
      //imshow( window_name, grad );
     
    cvShowImage("My Window",mono_thres);
     
      waitKey(0);
      cvDestroyWindow( "My Window" );
     
     
      return 0;
      }
    Et voici mon deuxième programme (Hough) :

    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
    #include "stdafx.h"
    #include <cv.h>
    #include <highgui.h>
    #include <math.h>
     
     
    using namespace cv;
     
    int main(int argc, char** argv)
    {
        Mat img, gray;
        if( argc != 2 && !(img=imread(argv[1], 1)).data)
            return -1;
        cvtColor(img, gray, CV_BGR2GRAY);
        // smooth it, otherwise a lot of false circles may be detected
        GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
        vector<Vec3f> circles;
        HoughCircles(gray, circles, CV_HOUGH_GRADIENT,
                     2, gray.rows/4, 200, 100 );
        for( size_t i = 0; i < circles.size(); i++ )
        {
             Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
             int radius = cvRound(circles[i][2]);
             // draw the circle center
             circle( img, center, 3, Scalar(0,255,0), -1, 8, 0 );
             // draw the circle outline
             circle( img, center, radius, Scalar(0,0,255), 3, 8, 0 );
        }
        namedWindow( "circles", 1 );
        imshow( "circles", img );
        return 0;
    }
    Sachant que Hough doit etre appliquer a la fin!
    Merci a ceux qui pourrot m'aider à faire cette demarche plutot galère..

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Ce que tu présentes ce ne sont pas des fonctions mais 2 programmes.
    Pour commencer, écris 2 fonctions..
    Ensuite tu les apelles l'une après l'autre.

    J'ai du mal à comprendre où tu bloques.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Bah là où je bloque c'est quand je dois appeller la dernière fonction (resultat de l'image après seuillae) avant d'appliquer Hough puis donner le resultat de Hough...

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    En fait il a récupéré 2 codes sur Internet (ici et ) et il aimerait en plus qu'on les lui merge

  5. #5
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Salut c'est mal conçu !
    Si tu dois faire à chaque fois un programme pour un filtre particulier tu ne t'en sortiras pas !
    La solution la plus simple sous Windows notamment c'est de faire des Dynamic Link Library ( dll ) pour chaque fonction de filtrage ( Hough, Sobel...)
    Ainsi tu pourras moduler ton programme en fonctions des besoins;
    si tu as besoin de la fonction de Sobel tu vas charger la Dynamic Link Library correspondante et la décharger au besoin et ainsi de suite.
    Et appeler les fonctions adéquates de la dll par exemple la fonction de Sobel ou celle de Dough,etc...
    Mais la solution la plus sophistiquée et la plus adaptée c'est de créer ta propre interface de script qui puisse interpréter des scripts et tu auras ainsi un script pour Sobel, un autre pour Hough...
    c'est comme cela que Photoshop fonctionne avec un système de plug-ins.
    Bref développer ton système de plug-ins ce qui apporte une parfaite modularité

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 59
    Par défaut
    Salut

    d'abord ta première fonction affiche une IplImage ( interface C d'OpenCV) , la second utilise cv::Mat (interface C++), mieux vaut rester sur la même interface

    sinon tu as cette fonction de conversion IplImage => cv::Mat
    http://opencv.willowgarage.com/docum...tures.html#mat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Mat(const IplImage* img, bool copyData=false);
    ensuite tu peux changer la première fonction pour renvoyer mono_thres au lieu de l'afficher, et commencer main par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     IplImage *sobel_threshold()
     {
    	...
    	return mono_thres;
     }
     
     int main()
     {
    	IplImage *res1 = sobel_threshold();
    	Mat img(res1, copyData);
        ...	
     }

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Tout d'abord merci d'avoir repondu

    Cob59 : Quand j'ai commencer mon programme je ne pensais pas utiliser la fonction Hough, de plus j'ai reussi à assembler un programme sobel avec un programme threshold de la bibliotheque d'Opencv et le resultat n'est pas si degueu (voir une autre discussion sur ce forum) le probleme est surtout que j'ai debuter à faire du C++ il y a seuleument une semaine depuis le debut de mon stage et j'ai beau lire plein de truc je ne comprends pas tout... Non je ne veux pas qu'on m'assemble le truc sinon mon stage ne servirait à rien mais des infos comme les commentaires suivant le tien m'aide beaucoup...

    Mat M: Mon maitre de stage m'impose d'utiliser OpenCV est ce que ta methode me permet quand meme d'utiliser la bibliothèque???

    Kessoufi : Merci c'est l'un de mes principals probleme, parce que en effet je reprend des codes de la bibliotheque d'Open CV qui m'interesse j'essaye de les faire fonctionner dans Visual Studio individuellement avant de les assembler (pas toujours evident quand tu debute avec un nouveau logiciel) et j'avance pas à pas dans mon projet. En effet certains utilisent des mat et d'autre Ipl mais bon je ne comprends pas specialement toutes les balises. Je vais essayer ta methode

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Le "problème" que tu rencontres n'es pas lié à un quelconque langage, je le placerais même en dehors de tout contexte de programmation.
    Et la remarque de Cob est totalement justifiée dans le sens où
    - on en voit passer, quoi que moins en vacances
    - le code est simple
    - le principe est simple
    - certains commentaires originaux en anglais


    Si je prends 2 peintres, l'un qui passe une couche de bleu sur une planche, l'autre passe une couche de rouge sur une planche, comment faire une planche bleue puis rouge/violet ?

    Il n'y a pas de magie.
    Pour commencer, si tu veux 2 méthodes, tu crées 2 méthodes, et pas 2 programmes.
    Ensuite, tu réfléchis un minimum à ces méthodes et à ce dont tu as besoin à côté. Les paramètres ? Les données nécessaires ?
    Puis tu penses à un algorithme (le mot est bien grand pour notre cas..), qui pourrait être imaginé par un nouveau-né:
    - je prends une feuille
    - je passe un feutre bleu
    - avec la même feuille, je passe un feutre rouge
    - la feuille est maintenant violette

    Je n'ai jamais utilisé opencv, mais c'est strictement identique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Image mon image;
    // blabla j'initialise l'image
    method1(image, ...); // transformation 1 qui modifie image passé en paramètre
    method2(image, ...);
    // image est maintenant transformée par method1 puis method2
    Tu as déjà les 2 méthodes, transformer ça en vraies méthodes est enfantin.

    Mon maitre de stage m'impose d'utiliser OpenCV est ce que ta methode me permet quand meme d'utiliser la bibliothèque???
    Oui elle le permettrait, elle fait ça bien alors on lui laisse gérer les transformations.
    Mais avant de courir on apprend à marcher. Et ton problème c'est de réaliser 2 transformations, pas de créer ShopPhoto.
    Tu verras avec ton tuteur les évolutions par la suite, essaye déjà de répondre à son problème.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Citation Envoyé par JackieMIF Voir le message
    (pas toujours evident quand tu debute avec un nouveau logiciel) et j'avance pas à pas dans mon projet
    salut Mea Culpa il fallait préciser que tu débutes !
    Les solutions que j'ai proposées c'est pour des personnes qui savent programmer..
    Oui il faut créer tes propres fonctions tu vas les appeler selon un ordre défini.

  10. #10
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Honnetement et sans vouloir etre mechant, le programme semble enfantin lorsque notre metier de tout les jours est en rapport avec la programmation ou alors que l'on est passionné dans ce domaine! Cela dit je doute fort que le premier programme que vous avez fait ressemblait à ce dernier que je dois encore integrer dans un programme utilisant une camera permettant de detecter n'importe quelle position de l'objet lorsque celui ci est en mouvement!!!
    Vous etes certes très bon dans ce domaine mais ce n'est pas une raison pour descendre les gens que vous pouvez aider... Et si tu te sens d'humeur à critiquer plutot que d'aider ne commente ca t'economiseras de l'energie.
    Je l'ai déjà precisé je ne cherche en aucun cas a ce qu'on me fasse le travail mais il est totalement legitime pour un etre humain de ne pas comprendre!! Sinon il n'y aurait pas de forum...

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Re voici mon code et voici l'image du resultat, comment est ce possible de n'afficher qu'un seul cercle à un endroit precis?

    Nom : 1er resultat de hough.jpg
Affichages : 77
Taille : 229,2 Ko

    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
    #include <stdlib.h>
    #include <cv.h>
    #include <highgui.h>
    #include <math.h>
     
     
    using namespace cv;
     
     
    /*************************************** FONCTION SOBEL + THRESHOLD ************************************************/
     
     
    int main( )
    {
     
    	int height,width,step,step_mono,channels;          /*Here i have declared step_mono for handling the widthstep member of a monochrome image*/
     
    	uchar *data,*data_mono;                            /*similarly data mono for handling the data of monochrome image*/
     
    	int i,j,k;
      //Mat src;
      Mat src_gray;
      Mat grad;
      char* window_name = "Sobel Demo - Simple Edge Detector";
      int scale = 1;
      int delta = 0;
      int ddepth = CV_16S;
     
      int c;
     
    /// Load an image
    IplImage* frame=cvLoadImage("D:/Entwicklung/OpenCV/2010/Kopie von assemblage sobel + threshold/Release/image sans contre jour.bmp",1);
     
    if( frame == NULL )
    { return -1; }
     
    Mat src(frame);
     
     
      GaussianBlur(src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
     
      /// Convert it to gray
      cvtColor( src, src_gray, CV_RGB2GRAY );
     
      /// Create window
      namedWindow( window_name, CV_WINDOW_AUTOSIZE );
     
      /// Generate grad_x and grad_y
      Mat grad_x, grad_y;
      Mat abs_grad_x, abs_grad_y;
     
      /// Gradient X
      //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_x, abs_grad_x );
     
      /// Gradient Y
      //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT );
      Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
      convertScaleAbs( grad_y, abs_grad_y );
     
      /// Total Gradient (approximate)
      addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );
     
      imshow( window_name, grad );
     
      //Resultat de grad dans IPL ....
      //IplImage  mono_thres=cvCreateImage( cvGetSize(frame), 8, 1 );
     IplImage frame2(grad);     
     
     
     //Faire à la fin
     
     IplImage* mono_thres=cvCreateImage( cvGetSize(&frame2), 8, 1 );
     
     
    	height = frame2.height;                             /*height is a member of IPLIMAGE structure and hence it comes handy like this in such situations, and same goes with below four statements*/
    	width = frame2.width;
    	step = frame2.widthStep;
    	step_mono = mono_thres->widthStep;
    	channels = frame2.nChannels;                        /*Number of channels in the image*/
     
    	data = (uchar *)frame2.imageData;                   /*Image is treated as as unsigned char data hence we use an unsigned char pointer to point to the same*/
    	cvNamedWindow("My Window", CV_WINDOW_AUTOSIZE );
    	data_mono = (uchar *)mono_thres-> imageData;        /*data of mono image is handled by the data_mono*/
     
    	for(i=0;i < height;i++) for(j=0;j < width;j++)      /*I am copying the first channel from the image in "frame" in the monochrome image with the help of this line below..*/ 
    		data_mono[i*step_mono+j*1+0]=data[i*step+j*channels+0];
     
     
    	//cvThreshold(mono_thres,mono_thres,12,             /*70 is the lower cut off*/
    	//40,                                               /*this is the higher cut off*/
        //CV_THRESH_BINARY                                  /*The type of thresholding,more description in the documentation*/
     
    	cvThreshold(mono_thres,mono_thres,60,               /*70 is the lower cut off*/
    	140,                                                /*this is the higher cut off*/
    	CV_THRESH_BINARY                                    /*The type of thresholding,more description in the documentation*/
     
    	);
     
       //imshow( window_name, grad );
     
    cvShowImage("My Window",mono_thres);
     
      waitKey(0);
      //cvDestroyWindow( "My Window" );
     
     
     
      /**************************************************** HOUGH Fonction ***************************************************/
     
     
     
     
        //Mat gray;
        /*if( argc != 2 && !(img=imread(argv[1], 1)).data)
            return -1;*/
     
    	Mat gray(mono_thres);
    	Mat img(mono_thres);
        //cvtColor(img, gray, CV_BGR2GRAY);
     
        // smooth it, otherwise a lot of false circles may be detected
        //GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
        vector<Vec3f> circles;
        HoughCircles(gray, circles, CV_HOUGH_GRADIENT,
                     2, gray.rows/4, 200, 100 );
        for( size_t i = 0; i < circles.size(); i++ )
        {
             Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
             int radius = cvRound(circles[i][2]);
     
             // draw the circle center
             circle( img, center, 3, Scalar(255,0,0), -1, 8, 0 );
     
             // draw the circle outline
             circle( img, center, radius, Scalar(255,0,0), 3, 8, 0 );
        }
        namedWindow( "circles", 1 );
        imshow( "circles", img );
     
    	waitKey(0);
     
      return 0;
      }

    Merci

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Re voici mon code et voici l'image du resultat, comment est ce possible de n'afficher qu'un seul cercle à un endroit precis?
    Tu as envisagé une méthode pour éliminer les faux-positifs ?
    Du genre, sélectionner celui en bas à gauche ou privilégier un intervalle de valeurs pour le rayon du cercle ?

    Autre chose : la doc de la fonction HoughCircles précise que dans la seule implémentation disponible de l'algo (CV_HOUGH_GRADIENT) un filtre de Canny est utilisé pour la détection de contour de l'image fournie. Du coup, est-ce que ton Sobel préalable est bien nécessaire, et ne risque pas plutôt de dégrader les résultats ?

  13. #13
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Je pense que le sobel n'est pas forcement necessaire cela dit je ne pense pas qu'il influt sur le resultat parce que j'ai fait le test threshold et sobel a part avant de les assembler et la fonction Hough detecterait les memes contours maintenant il se peut que je me trompe... Je pense je vais essayer de voir pour utiliser les rayon du cercle. J'ai testé un filtre de canny la semaine dernière pour voir mais il y un reglage a faire a la main il me semble pour trouver le bon contour!

  14. #14
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Est il possible de le faire sans utiliser le filtre de canny?

  15. #15
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    A en croire la doc, HoughCircles peut ajuster les paramètres du Canny, mais pas l'ignorer. Aussi, j'ai tendance à penser que s'ils ont choisi un Canny pour leur détection de contours préalable, c'est que c'est un choix raisonnable. A toi de faire varier les quelques paramètres de HoughCircles pour voir ce qui apporte de meilleurs résultats, compte tenu de tes objectifs et des conditions expérimentales.

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par cob59 Voir le message
    A en croire la doc, HoughCircles peut ajuster les paramètres du Canny, mais pas l'ignorer. Aussi, j'ai tendance à penser que s'ils ont choisi un Canny pour leur détection de contours préalable, c'est que c'est un choix raisonnable. A toi de faire varier les quelques paramètres de HoughCircles pour voir ce qui apporte de meilleurs résultats, compte tenu de tes objectifs et des conditions expérimentales.
    Moi je trouve qu'ils auraient du laisser le choix au programmeur d'appliquer le canny ou pas. Maintenant faut faire avec.

    Au pire tu recodes une transformée de Hough : moi j'avais codé une autre méthode de détection car Hough n'était pas adaptée à mon besoin. Mais pour le tien je pense qu'elle l'est.

  17. #17
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Ok merci puis-je appliquer le canny directement sur le resultat du threshold? Ou est il preferable de reprendre la toute prmiere photo?

  18. #18
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Canny est une méthode de détection de contour tout comme Sobel. Il vaut mieux lui donner l'image en noir et blanc telle quelle.

  19. #19
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Nom : resultat du test canny.jpg
Affichages : 71
Taille : 181,6 Ko

    Ok cool voilà le resultat du test de canny et 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
    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
    84
    85
    86
    87
    /*********************************************************** CANNY ***************************************************/
     
    #include "StdAfx.h"
    #include "bgapi_init.h"
    #include <stdlib.h>
    #include <cv.h>
    #include <highgui.h>
    #include <math.h>
     
     
    using namespace cv;
     
    //Test
     
    IplImage*	g_image = NULL;
    IplImage*	g_gray = NULL;
    int		g_thresh = 100;
    CvMemStorage* 	g_storage = NULL;
     
    void on_trackbar(int){
    	if( g_storage == NULL ){
    		g_gray = cvCreateImage( cvGetSize( g_image ), 8, 1 );
    		g_storage = cvCreateMemStorage(0);
    	} else {
    		cvClearMemStorage( g_storage );
    	}
     
    	CvSeq* contours = 0;
    	cvCvtColor( g_image, g_gray, CV_BGR2GRAY );
    	cvThreshold( g_gray, g_gray, g_thresh, 255, CV_THRESH_BINARY );
    	cvFindContours( g_gray, g_storage, &contours );
    	cvZero( g_gray );
    	if( contours ){
    		cvDrawContours(
    			g_gray,
    			contours,
    			cvScalarAll(255),
    			cvScalarAll(255),
    			100 );
    	}
    	cvShowImage( "Contours", g_gray );
    }
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    	g_image = cvLoadImage( "D:/Robin/Images/image sobel sans contre jour.bmp" );
    	cvNamedWindow( "Contours", 1 );
    	cvCreateTrackbar( "Threshold", "Contours", &g_thresh, 255, on_trackbar );
    	on_trackbar(0);
    	cvWaitKey();
     
     
    /******************************************* HOUGH *******************************************/
     
    	    //Mat gray;
        /*if( argc != 2 && !(img=imread(argv[1], 1)).data)
            return -1;*/
     
    	Mat gray(g_gray);
    	Mat img(g_gray);
        //cvtColor(img, gray, CV_BGR2GRAY);
     
        // smooth it, otherwise a lot of false circles may be detected
        GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
        vector<Vec3f> circles;						
        HoughCircles(gray, circles, CV_HOUGH_GRADIENT,
                     2, gray.rows/4, 200, 100 );
        for( size_t i = 0; i < circles.size(); i++ )																				
        {
             Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
             int radius = cvRound(circles[i][2]);
     
             // draw the circle center
             circle( img, center, 3, Scalar(255,128,0), -1, 8, 0 );
     
             // draw the circle outline
             circle( img, center, radius, Scalar(255,128,0), 2, 8, 0 );
        }
        namedWindow( "circles", 1 );
        imshow( "circles", img );
     
    	waitKey(0);
     
      return 0;
      }

    Voilà j'ai encore quelques questions, une fois que j'ai fait ca j'aimerais reafficher l'image de depart en arriere plan tout en gardant le cercle autout de l'objet... Dite moi si ce n'est pas assez clair quelle fonction pourrais je alors utiliser ou est ce impossible?

  20. #20
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2012
    Messages : 41
    Par défaut
    Est il possible de changer les valeurs de Hough pour obtenir un cerlce autre qu'un cercle blanc (rouge par exemple) j'ai regardé sur le net mais il n'y a que les codes couleurs pour du HTML

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/06/2012, 16h20
  2. Réponses: 0
    Dernier message: 04/05/2011, 13h21
  3. [C#] Comment liés les clases placé dans .cs entre elle
    Par Etienne maheu dans le forum ASP.NET
    Réponses: 13
    Dernier message: 15/04/2004, 12h05
  4. Réponses: 5
    Dernier message: 25/11/2003, 10h02
  5. Listes déroulantes liées entre elles
    Par denisC dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/07/2002, 15h53

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