Bonjour,
Mon but est que lorsque l'on détecte un visage, on divise le visage en trois bandes avec les yeux, le nez, la bouche.
J'arrive à détecter les yeux ainsi que le nez quand une face est détecté, mais mon soucis est que je détecte souvent le nez à la place des yeux, ce qui n'est pas possible, enfin sur terre, ailleurs je ne sais pas....

Actuellement je travaille sous opencv2.3.
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
 
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
 
#include <iostream>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
/** Function Headers */
void detectAndDisplay( Mat frame );
 
/** Global variables */
String face_cascade_name = "data/haarcascades/haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";
 
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
 
string window_name = "Capture - Face detection";
RNG rng(12345);
 
/** @function main */
int main( int argc, const char** argv )
{
   CvCapture* capture;
   Mat frame;
 
   //-- 1. Load the cascades
    if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
    if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading\n"); return -1; };
 
   //-- 2. Read the video stream
   capture = cvCaptureFromCAM( 0 );
   if( capture )
   {
     while( true )
     {
       frame = cvQueryFrame( capture );
 
       //-- 3. Apply the classifier to the frame
       if( !frame.empty() )
       { detectAndDisplay( frame ); }
       else
       { printf(" --(!) No captured frame -- Break!"); break; }
 
       int c = waitKey(200);
       if( (char)c == 'c' ) { break; }
      }
   }
   return 0;
 }
 
/** @function detectAndDisplay */
void detectAndDisplay( Mat frame )
{
  std::vector<Rect> faces;
  Mat frame_gray;
 
  cvtColor( frame, frame_gray, CV_BGR2GRAY );
  equalizeHist( frame_gray, frame_gray );
 
  //-- Detect faces
  face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
 
  for( int i = 0; i < faces.size(); i++ )
  {
    Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
    ellipse( frame, center, Size( faces[i].width*0.4, faces[i].height*0.7), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
 
    Mat faceROI = frame_gray( faces[i] );
    std::vector<Rect> eyes;
 
    //-- In each face, detect eyes
    eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(10, 10) );
 
    for( int j = 0; j < eyes.size(); j++ )
     {
       Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
       int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
       circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
     }
    }
  //-- Show what you got
  imshow( window_name, frame );
 }
Si quelqu'un a une piste ou un lien qui explique comment procéder.
J'aimerais aussi remplacer les cercles par des rectangles, pour tout ce qui se trouve dans face, ce serais plus facile à gérer.
Le code viens de ce lien :
http://opencv.itseez.com/doc/tutoria...ight=objdetect

Merci d'avance