
swito
|
bonjour
merci louis pour votre rep
j ai déjà essayé avec la bibliothèque opencv mon programme s’exécute mais les cercles tracé ne sont les vrais cercles cherché c-t-a dire il trace des grandes cercles aléatoires par contre dans l image traité il y a des centaines des petites image
peut être je sais pas faire un bon paramétrage
voila mon code
#include <cv.h>
#include <highgui.h>
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<cxcore.h>
#include<cvaux.h>
using namespace std;
int main()
{
//Déclaration
IplImage*image_couleur;
IplImage*image_gris;
IplImage*image_binaire;
// IplImage*image_contour;
IplImage*image_filtre;
CvMat*masque3x3;
CvSeq*circles;
CvMemStorage*storage = cvCreateMemStorage(0);
// charger une image
image_couleur=cvLoadImage("im1.jpg");
if (image_couleur == NULL)
{
cout << "impossible d'ouvrir le fichier";
exit(EXIT_FAILURE);
}
//On vérifie l'origine de l'image chargée
//Si elle n'est pas en haut à gauche, il faut la corriger
int flip=0;
if(image_couleur->origin!=IPL_ORIGIN_TL)
{
flip=CV_CVTIMG_FLIP;
}
//Conversion en niveaux de gris
image_gris=cvCreateImage(cvGetSize(image_couleur),image_couleur->depth,1);
if (image_gris == NULL)
{
cout << "impossible de creer image gris";
exit(EXIT_FAILURE);
}
cvCvtColor(image_couleur,image_gris,CV_BGR2GRAY);
image_binaire=cvCreateImage(cvGetSize(image_couleur),8,1);
image_filtre=cvCreateImage(cvGetSize(image_couleur),8,1);
masque3x3= cvCreateMat(3,3,CV_32FC1);
/* for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
float k;
cin >> k ;
cvmSet(masque3x3, i, j, k);
}
}
*/
cvmSet(masque3x3, 0, 0,0);
cvmSet(masque3x3, 1, 0,-1);
cvmSet(masque3x3, 2, 0,0);
cvmSet(masque3x3, 0, 1,-1);
cvmSet(masque3x3, 1, 1,5);
cvmSet(masque3x3, 2, 1, -1);
cvmSet(masque3x3, 0, 2, 0);
cvmSet(masque3x3, 1, 2, -1);
cvmSet(masque3x3, 2, 2, 0);
cvFilter2D(image_gris,image_filtre,masque3x3);
cvSmooth(image_gris,image_gris, CV_GAUSSIAN, 3,3);
cvThreshold(image_filtre,image_binaire,100,255,CV_THRESH_BINARY);
circles = cvHoughCircles(image_gris, storage, CV_HOUGH_GRADIENT,1,image_gris->height/4,84,42,0,0);
for(int i = 0; i < circles->total; i++ )
{
float* p = (float*)cvGetSeqElem( circles, i );
cvCircle( image_gris ,cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );
cvCircle( image_gris ,cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );
}
/*
CvScalar scalaire;
for(int x=0;x<image_gris->width;x++)
{
for(int y=0;y<image_gris->height;y++)
{
scalaire=cvGet2D(image_gris, y, x);
printf ("%3d",scalaire.val[0]);
}
printf("\n");
}
*/
//Création des fenêtres dans lesquelles nous afficherons les images
cvNamedWindow("Affichage image couleur", CV_WINDOW_AUTOSIZE);
cvShowImage("Affichage image couleur", image_couleur);
cvNamedWindow("Affichage image gris",CV_WINDOW_AUTOSIZE);
cvShowImage("Affichage image gris", image_gris);
cvNamedWindow("Affichage image filtre");
cvShowImage("Affichage image filtre",image_filtre);
cvNamedWindow("Affichage image binaire",CV_WINDOW_AUTOSIZE);
cvShowImage("Affichage image binaire",image_binaire);
cvWaitKey(0);
cvDestroyWindow("Affichage image couleur");
cvDestroyWindow("Affichage image gris");
cvDestroyWindow("Affichage image filtre");
cvDestroyWindow("Affichage image binaire");
cvReleaseImage(&image_couleur);
cvReleaseImage(&image_gris);
cvReleaseImage(&image_filtre);
cvReleaseImage(&image_binaire);
cvReleaseMat(&masque3x3);
return 0;
}
|