Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > OpenCV
OpenCV Vos questions sur l'API de traitement d'images OpenCV.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/10/2012, 12h15   #1
alvinleetya
Candidat au titre de Membre du Club
 
Homme
Lille
Inscription : juin 2012
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Santé

Informations forums :
Inscription : juin 2012
Messages : 21
Points : 10
Points : 10
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 :
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 :
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.
alvinleetya est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2012, 21h39   #2
djuju
Membre éprouvé
 
Homme Julien
Chef de projet R&D
Inscription : mars 2007
Messages : 183
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : Canada

Informations professionnelles :
Activité : Chef de projet R&D

Informations forums :
Inscription : mars 2007
Messages : 183
Points : 408
Points : 408
Salut,

Ce bout de code trouve les contours d'une image couleur :
Code :
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 !
djuju est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2012, 11h18   #3
alvinleetya
Candidat au titre de Membre du Club
 
Homme
Lille
Inscription : juin 2012
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Santé

Informations forums :
Inscription : juin 2012
Messages : 21
Points : 10
Points : 10
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.
alvinleetya est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2012, 15h25   #4
alvinleetya
Candidat au titre de Membre du Club
 
Homme
Lille
Inscription : juin 2012
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Santé

Informations forums :
Inscription : juin 2012
Messages : 21
Points : 10
Points : 10
J'ai finalement réussi à obtenir ce que je voulais.
Je poste le code si quelqu’un rencontre le même problème :
Code :
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);
			}
}
alvinleetya est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h06.


 
 
 
 
Partenaires

Hébergement Web