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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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);
        ...	
     }

  6. #6
    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

  7. #7
    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é

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

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