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 :

Ameliorer le resultat de la foncton seuillage (threshold)?


Sujet :

C++

  1. #1
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut Ameliorer le resultat de la foncton seuillage (threshold)?
    Nom : question forum.jpg
Affichages : 283
Taille : 93,3 Ko

    Bonjour,

    Voilà je suis debutant dans le domaine, pour mon stage, on me demande d'appliquer à une image la fonction cvsobel de la bibliotheque Opencv puis sur le resultat de cette image appliquer la fonction cvthreshold. Puis je devrais appliquer la transformé de Hough pour detecter le cercle que j'ai entouré en rouge sur le screenshot. Par contre je n'ai pas envie que cette dernière fonction detecte d'autres cercles comme celui juste au dessus par exemple...
    Parce que une fois que j'aurais fait cela il faudra que j'integre l'ensemble de ma fonction dans un programme utilisant une camera et qui devra detecter le cercle lorsque l'on bouge la camera.
    Donc ma question est : est-il possible de modifier les paramètres des fonctions (sobel + threshold) afin de pouvoir mieux se focaliser sur le cercle a traiter?
    Merci a ceux qui pourront me repondre! (je joins le code en dessous)

    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;
    
    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/test threshold/Release/sobel.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 );
      //waitKey(0);
    
      //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*/
    										  
    	);
    
      //imshow( window_name, grad );
    
    cvShowImage("My Window",mono_thres);
    
      waitKey(0);
      cvDestroyWindow( "My Window" );
    
    
      return 0;
      }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Il faut mettre ton code entre des balises de... code (bouton #).

  3. #3
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Euh comment ca??

  4. #4
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    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
    #include <stdlib.h>
    #include "StdAfx.h"
     
    using namespace cv;
     
    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/test threshold/Release/sobel.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*/
     
    	);
     
      //imshow( window_name, grad );
     
    cvShowImage("My Window",mono_thres);
     
      waitKey(0);
      cvDestroyWindow( "My Window" );
     
     
      return 0;
      }
    ah voilà excuse moi je ne connaissais pas

  5. #5
    Membre éprouvé

    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
    Points : 1 086
    Points
    1 086
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ton code sera plus lisible si tu le mets dans ce genre de balise
    Quant à ta question, est-ce que tu es obligé de seuiller immédiatement après le Sobel ? Hough peut te renvoyer plusieurs cercles ; tu pourrais faire le tri toi-même en fonction de leur positions sur l'image et de leur rayon.

  6. #6
    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
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par JackieMIF Voir le message
    Nom : question forum.jpg
Affichages : 283
Taille : 93,3 Ko
    Donc ma question est : est-il possible de modifier les paramètres des fonctions (sobel + threshold) afin de pouvoir mieux se focaliser sur le cercle a traiter ?
    Pour avoir de l'expérience sur cette problématique particulière, la réponse est non : si dans ton image de départ réelle, le contraste des bords du cercle recherché est moins bon que celui d'un autre cercle, il n'y a pas moyen de le faire ressortir plus. Gare aux pièges : des paramètres qui vont faire ressortir le contraste voulu sur une série d'images ne donnent pas nécessairement le même résultat dans d'autres conditions d'éclairage !

    Pour arriver à ce que tu veux faire, il te faut détecter les cercles puis éliminer les faux positifs à l'aide d'un autre critère, une caractéristique de l'image à l'intérieur du cercle par exemple.
    Find me on github

  7. #7
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Merci pour vos réponses, non je ne pense pas etre obligé d'utiliser la fonction seuillage mais je pensais qu'elle pouvait ameliorer la qualité du cercle que je recherche et cacher un peu l'arriere plan pour après appliquer Hough. Ce qui m'inquiete c'est que les deux cercles de l'image l'un au dessus de l'autre font quasiment le meme rayon pour hough (dans ce cas là je devrais me pencher plus sur leur position c'est cela?)

  8. #8
    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
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par JackieMIF Voir le message
    Merci pour vos réponses, non je ne pense pas etre obligé d'utiliser la fonction seuillage mais je pensais qu'elle pouvait ameliorer la qualité du cercle que je recherche et cacher un peu l'arriere plan pour après appliquer Hough.
    Ce n'est pas bête, mais attention à ne pas la rendre trop "méchante". Il existe des méthodes de seuillage dynamique, tu peux essayer avec l'algorithme d'Otsu que cv::threshold supporte. Tu peux aussi appliquer un léger flou de gauss avant le seuillage pour lisser les bords.

    Citation Envoyé par JackieMIF Voir le message
    Ce qui m'inquiete c'est que les deux cercles de l'image l'un au dessus de l'autre font quasiment le meme rayon pour hough (dans ce cas là je devrais me pencher plus sur leur position c'est cela?
    Ne connaissant pas ton projet, on ne sait pas quel critère peut te permettre de les distinguer. Si la position relative des cercles te le permet, n'hésite pas car ce sera alors peu coûteux en calcul. Mais attention : n'importe quel autre objet peut apporter un cercle dans la scène qui ne sera pas le bon.
    Find me on github

  9. #9
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Nom : sobel.jpg
Affichages : 266
Taille : 25,2 Ko

    Pour info, mon objectif et de detecter à l'aide d'une camera ethernet le trou de réglage de feux antibrouillard avec l'image suivante. Mon premier programme utilise la fonction matchTemplate mais le probleme c'est que le programme nessecite une orientation et un reglage parfait de la camera pour detecer l'objet, l'objectif est alors d'avoir un programme plus rapide d'où l'idée de l'utilisation de la fonction Houh qui detecte simplement des formes...

  10. #10
    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
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    C'est super, ça te donne du coup des hypothèses très forte sur l'image de départ. Tu dois pouvoir exploiter la position des cercles et être sûr qu'il n'y en aura pas d'autres !

    L'image que tu mets en pièce jointe est prise à contre-jour. Tu devrais faire attention et éviter ça, ça risque de te compliquer la détection. On peut voir une version sans le contre-jour ?
    Find me on github

  11. #11
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Nom : Unbenannt.jpg
Affichages : 248
Taille : 100,3 Ko

    Voilà le resultat sans le contre jour par contre je trouve moins bon le threshold mais le sobel est 10 fois mieux...

  12. #12
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    C'est bequcoup mieux comme ca, je change les parametres du threshold et je vous renvoie ca, vous me direz ce que vous en pensez!

  13. #13
    Futur Membre du Club
    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
    Points : 8
    Points
    8
    Par défaut
    Nom : Unbenannt~1.jpg
Affichages : 261
Taille : 84,9 Ko

    Voilà le résultat en changeant les paramètres de la fonction threshold je pense pas qu'il y ait de problèmes pour desormais appliquer la transformée de Hough etant donné que le cercle est bien visible Par contre je ne dis pas que je n'aurais pas besoins de vous pour appliquer la transformée de Hough sur ma fonction!!!!

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

Discussions similaires

  1. algorithme d'amelioration des resultats
    Par anoume dans le forum Intelligence artificielle
    Réponses: 1
    Dernier message: 22/01/2009, 11h22
  2. méthode de thresholding ou seuillage
    Par mateo.14 dans le forum MFC
    Réponses: 1
    Dernier message: 22/03/2005, 21h13
  3. Proposer le resultat d'une requête en téléchargement
    Par Lux interior dans le forum XMLRAD
    Réponses: 5
    Dernier message: 17/02/2003, 15h44
  4. [VB6] [Excel] Résultat d'une requete ds une feuille
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 07/01/2003, 17h52
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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