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 :

Obtenir une matrice binaire à partir d'un vecteur de points


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut Obtenir une matrice binaire à partir d'un vecteur de points
    Bonjour,
    J'ai écrit un code permettant d'afficher une image et de sélectionner une ROI (Region Of Interest) à l'aide de la souris. J'obtiens de cette façon un vecteur composé des points sélectionnés sur l'image.
    Voici le 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
    //Includes
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <stdio.h>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <vector>
     
    using namespace std;
    using namespace cv;
     
    static int app;
    static vector<Point> vect;
    static Mat img = imread("C:/img.jpg",0);
     
    void on_mouse(int, int, int, int, void* );
     
    int main() 
     
    {
    	app = 0;
    	namedWindow("myWindow", CV_WINDOW_AUTOSIZE);
    	setMouseCallback("myWindow", on_mouse, 0);
        imshow("myWindow", img);
    	waitKey(0);
    	cvDestroyWindow("MyWindow");
     
     
        return 0;
    }
     
    void on_mouse(int evt, int x, int y, int flags, void* param)
    {
     
        if(evt == CV_EVENT_LBUTTONDOWN)
    	{
    		Point pt(x,y);
    		vect.push_back(pt);
    		app++;
     
    		if(app>1)
    			{
    				int size = vect.size();
    				line(img,vect[size-2],vect[size-1],CV_RGB(0,0,0),2);
    				imshow("myWindow", img);
    		}
     
     
    	}
        if(evt == CV_EVENT_RBUTTONDOWN)
    			{
    				int size = vect.size();	
    				line(img,vect[size-1],vect[0],CV_RGB(0,0,0),2);
    				imshow("myWindow", img);
    			}
     
    	}
    Je cherche à obtenir une matrice binaire de même taille que mon image dont chaque élément vaut 0 si cet élément est en dehors du contour créer par les points, et qui vaut 1 s'il est à l’intérieur.
    Sur un autre forum, on m'a conseillé d'utiliser le bout de code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Mat output(img.rows,img.cols,CV_8UC1);//your img
    drawContours(output, contours, 0, Scalar(1), CV_FILLED);//now you have binary image
    Le problème c'est que je ne sais pas comment créer l'élément "contours" à partir de mes points. En créant un vecteur de vecteur de points, mon IDE ne me retourne pas d'erreur mais lorsque j’exécute le code j’obtiens une image composée de bandes noires et grises à la place d'un polygone.

    Toute aide est la bienvenue, merci d'avance.

  2. #2
    Membre éprouvé
    Homme Profil pro
    R&D imagerie 3D / prog embarquée
    Inscrit en
    Mars 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : R&D imagerie 3D / prog embarquée
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2007
    Messages : 417
    Points : 1 247
    Points
    1 247
    Par défaut
    Salut,

    Ce bout de code trouve les contours d'une image couleur :
    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
    void AnalyzeContours(char* imageRGBBuff, int width,int height, double minThreshold, int maxThreshold)
    {
      CvSize    imageSize = cvSize(width, height);
      IplImage* greyScaleImage = cvCreateImage(imageSize, 8, 1);
      IplImage* colorImage = cvCreateImageHeader(imageSize, 8, 3);
     
      colorImage->imageData = imageRGBBuff;
     
      CvMemStorage* storage = cvCreateMemStorage(0);
      CvSeq* contours = 0;
      IplImage* edgeImage = cvCreateImage(imageSize, IPL_DEPTH_8U, 1);
     
      cvCvtColor(colorImage, greyScaleImage, CV_RGB2GRAY); // Transforme l'image couleur en N&B
     
      cvCanny(greyScaleImage, edgeImage, minThreshold, maxThreshold, 3);
     
      cvDilate(edgeImage, greyScaleImage, 0, 1);
     
      cvFindContours(greyScaleImage, storage, &contours, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
    }
    Avec:
    imageRGBBuff = un byte buffer qui représente chaque valeur de pixel par 3 bytes qui représentent ses composante RBG. Le buffer est à 1 dimension et représente l'image en line prone.
    width = la largeur de l'image
    height = la hauteur de l'image
    minThreshold = le threshold 1 de cvCanny. Plus cette valeur est petite, moins il y a d’interruption dans les contours détectés.
    maxThreshold = le threshold 2 de cvCanny. Plus cette valeur est proche de 255, moins tu détectera de contours différents.

    En espérant t'aider... Bon courage !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    Merci de ta réponse djuju,
    malheureusement je ne cherche pas à détecter les contours. J'ai en effet trouvé beaucoup de fonctions sous OpenCV qui réalisent cela en cherchant une solution à mon problème mais ce n'est pas ce que je recherche.

    Mon projet est de réaliser un algorithme de segmentation d'images médicales (scanner du cœur) afin d'extraire uniquement le ventricule gauche. Je dois donc sélectionner manuellement un contour pour initialiser la segmentation.
    C'est pour cette raison que j'ai besoin d'obtenir cette matrice binaire a partir de mes points sélectionnés manuellement.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Lille
    Inscrit en
    Juin 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lille
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2012
    Messages : 22
    Points : 21
    Points
    21
    Par défaut
    J'ai finalement réussi à obtenir ce que je voulais.
    Je poste le code si quelqu’un rencontre le même problème :
    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
    //Includes
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <stdio.h>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <vector>
     
    using namespace std;
    using namespace cv;
     
    static int app;
    static vector<Point> vect;
    static Mat img = imread("C:/img.jpg",0);
    static int row = img.rows;
    static int col = img.cols;
    static Mat src = Mat::zeros( Size( row, col ), CV_8UC1 );
     
    void on_mouse(int, int, int, int, void* );
     
    int main() 
     
    {
    	app = 0;
    	namedWindow("myImage", CV_WINDOW_AUTOSIZE);
    	setMouseCallback("myImage", on_mouse, 0);
    	imshow("myImage", img);
    	waitKey(0);
     
        vector<vector<Point> > contours; 
    	vector<Vec4i> hierarchy;
    	Mat src_copy = src.clone();
        findContours( src_copy, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
     
    	// Create Window and show your results
    	char* source_window = "Contour";
    	namedWindow( source_window, CV_WINDOW_AUTOSIZE );
    	imshow( source_window, src );
    	waitKey(0);
     
    	// Create Mask
    	Mat_<uchar> mask (row,col);
    	for (int j=0; j<row; j++)
    		for (int i=0; i<col; i++)
    			{
    				if ( pointPolygonTest( contours[0], Point2f(i,j),false) >= 0)
    				{mask(j,i)=255;}
    				else
    				{mask(j,i)=0;}
    			}
    	// Display Mask
    	char* mask_window = "Mask";
    	namedWindow( mask_window, CV_WINDOW_AUTOSIZE );
    	imshow( mask_window, mask );
    	waitKey(0);
        return 0;
    }
     
    void on_mouse(int evt, int x, int y, int flags, void* param)
    {
     
        if(evt == CV_EVENT_LBUTTONDOWN)
    	{
    		Point pt(x,y);
    		vect.push_back(pt);
    		app++;
     
    		if(app>1)
    			{
    				int size = vect.size();
    				line(img,vect[size-2],vect[size-1],CV_RGB(0,0,0),2);
    				line(src,vect[size-2],vect[size-1],Scalar( 255 ),1);
    				imshow("myImage", img);
    			}
    	cout<<"Coordonnees du point pt : "<<x<<","<<y<<endl<<"taille de vect : "<<vect.size()<<endl<<"vect du point : "<<vect[vect.size()]<<endl;
     
    	}
     
        if(evt == CV_EVENT_RBUTTONDOWN)
    			{
    				int size = vect.size();
    				Point pt1 = vect[0];
    				line(img,vect[size-1],vect[0],CV_RGB(0,0,0),2);
    				line(src,vect[size-1],vect[0],Scalar( 255 ),1);
    				imshow("myImage", img);
    			}
    }

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/03/2012, 18h38
  2. Construire une matrice a partir d'un vecteur
    Par pevecipierdut dans le forum Débutez
    Réponses: 6
    Dernier message: 15/06/2011, 07h04
  3. Réponses: 1
    Dernier message: 08/07/2008, 10h37
  4. Réponses: 4
    Dernier message: 01/03/2008, 15h04
  5. Réponses: 4
    Dernier message: 05/12/2006, 09h07

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