j'aimerais extraire les points caractéristiques dans un visage pour l'identifier. Je n'ai pas trouvé de solutions pour localiser ces points dans une image à part l'utilisation de cvSnakeImage. J'ai parcouru la documentation de cette fonction que je ne maîtrise pas beaucoup et j'ai trouvé un exemple sur : http://www.lund.gl/ImageProcess/Customizing/Customizing2.html
Je l'ai adapté sur une image contenant un oeil, mais je n'obtiens pas du tout le contour de l'oeil bien que je modifie le nombre de points de Snake, le nombre maximale d'itérations,etc. J'ai aussi essayé sur un visage complet, ça ne marche pas mieux. Pourriez-vous m'aider svp? Merci
Voici le code adapté (j'utilise les cascades de Haar pour extraire les yeux êt dans la suite du traitement je m'intéresse à la région de l'oeil gauche:
//On récupère le pixel de coordonnées (x,y)
scalaire=cvGet2D(img, y, x);
//Si le niveau de gris est inférieur à p_min, il devient p_min
if(scalaire.val[0]<p_min)
{
p_min=scalaire.val[0];
}
//Si le niveau de gris est supérieur à p_max, il devient p_max
if(scalaire.val[0]>p_max)
{
p_max=scalaire.val[0];
}
}
}
//p_min est maintenant le nvg minimum et p_max le nvg maximum
//On parcourt l'image une seconde fois
for(int x=0; x<img->width; x++)
{
for(int y=0; y<img->height; y++)
{
//On récupère le pixel (x,y)
scalaire=cvGet2D(img, y, x);
int ThressValue = 120;
float alpha = 3;
float beta = 5;
float gamma = 2;
CvSize win;
CvTermCriteria criteria;
int jumpPoint;
CvPoint *WholePointArray;
CvPoint *PointArray;
const int NUMBER_OF_SNAKE_POINTS= 90;
PointArray = (CvPoint *)malloc(NUMBER_OF_SNAKE_POINTS * sizeof(CvPoint));
cvCopyImage( m_Ipl,IplTmp3); //IplTmp3 is the image to draw temp results to
cvCopyImage( m_Ipl, IplTmp1);//(src,dst) copy to Working ipl image (IplTmp1 and IplTmp2 is working containers)
// Make a average filtering
cvSmooth(IplTmp1,IplTmp2,CV_BLUR,31,15);
//Do a threshold
cvThreshold(IplTmp2,IplTmp1,ThressValue,255,CV_THRESH_BINARY);
// expand the thressholded image of ones -smoothing the edge.
//And move start position of snake out since there are no ballon force
cvDilate( IplTmp1, IplTmp2, NULL, 3);
//Find the contours
CvMemStorage *storage;
CvSeq* contour = NULL;
storage = cvCreateMemStorage (0);
cvFindContours( IplTmp2,storage, &contour,sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_NONE );
//Run through the found coutours
while( contour != NULL )
{
if ( contour ->total >= NUMBER_OF_SNAKE_POINTS)
{
cvSmooth(m_Ipl,IplTmp2,CV_BLUR,7,3);
WholePointArray = (CvPoint *)malloc(contour->total * sizeof(CvPoint));
cvCvtSeqToArray(contour, WholePointArray, CV_WHOLE_SEQ); //Copy the contour to a array
// Number of jumps between the desired points (downsample only!)
jumpPoint = (int)(contour->total / NUMBER_OF_SNAKE_POINTS);
for (int i=0; i < NUMBER_OF_SNAKE_POINTS; i++)
{
PointArray[i].x = WholePointArray[ (int)( i*jumpPoint)].x;
PointArray[i].y = WholePointArray[ (int)( i*jumpPoint)].y;
}
// Now for the snake
criteria.max_iter = 100; // Do max N iterations
criteria.epsilon = 1; // If only N points is moved then terminate
criteria.type = CV_TERMCRIT_EPS|CV_TERMCRIT_ITER;
win.width = 21; // search for energi minimizing in this area around snake points
win.height = 21; // Be sure that width and heigth is uneven
/* reconsideration de l'image en entier */
cvResetImageROI( image );
//Clean up
free (contour);
free(PointArray);
cvReleaseMemStorage(&storage);
//Save result
cvCopyImage( IplTmp3, m_Ipl);//(src,dst)
// Clean up
cvReleaseImage(&IplTmp1);
cvReleaseImage(&IplTmp2);
cvReleaseImage(&IplTmp3);
return 0;
}
OpenCV: cvSnakeImage
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.