2012-12-23 3 views
0

Я пытаюсь написать некоторый простой код обнаружения лица в реальном времени, но почему-то это не работает. (Я пытался проверить код обнаружения на изображении, и он работает, но с кодом ниже я получаю серое изображение на экране, и код не работает)Обнаружение лица в реальном времени в OpenCV

вот код, который я пробовал (он печатает «лицо обнаружено!» Один раз выходное окно)

CvHaarClassifierCascade *cascade; 
CvMemStorage   *storage; 
char *face_cascade="haarcascade_frontalface_alt2.xml"; 
CvRect* r; 
const CvArr* img_size; 
IplImage *grayscale; 

void detectFacialFeatures(IplImage *img) 
{ 
    grayscale = cvCreateImage(cvGetSize(img), 8, 1); 
    cvCvtColor(img, grayscale, CV_BGR2GRAY); 

    CvMemStorage* storage=cvCreateMemStorage(0); 
    cvClearMemStorage(storage); 

    cvEqualizeHist(grayscale, grayscale); 

    cascade = (CvHaarClassifierCascade*)cvLoad(face_cascade, 0, 0, 0); 
    CvSeq* faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize(50, 50)); 

    if(faces) 
    { 
     printf("face detected!"); 
     r = (CvRect*)cvGetSeqElem(faces, 0); 
     cvRectangle(img,cvPoint(r->x, r->y),cvPoint(r->x + r->width, r->y + r->height), CV_RGB(255, 0, 0), 1, 8, 0); 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int c; 
    IplImage* color_img; 
    CvCapture* cv_cap = cvCreateCameraCapture(0); 
    cvSetCaptureProperty(cv_cap, CV_CAP_PROP_FRAME_WIDTH, 640); 
    cvSetCaptureProperty(cv_cap, CV_CAP_PROP_FRAME_HEIGHT, 480); 
    cvNamedWindow("Video",1); // create window 
    for(;;) { 
     color_img = cvQueryFrame(cv_cap); // get frame 

     if(color_img==0) 
     break; 

     cvFlip(color_img, 0, 1); //mirror image 

     detectFacialFeatures(color_img); 
     cvShowImage("Video", color_img); // show frame 

     c = cvWaitKey(10); // wait 10 ms or for key stroke 
     if(c == 27) 
     break; // if ESC, break and quit 
    } 
    /* clean up */ 
    cvReleaseCapture(&cv_cap); 
    cvDestroyWindow("Video"); 
} 

ответ

2
  1. Try без вызова функции cvFlip и cvEqualizeHistogram.
  2. Посмотрите (просто используйте cvShowImage) результат каждой операции (cvFlip, cvCvtColor, cvEqualizeHistogram) - возможно, результатом одной из этих операций является серое изображение.
  3. Вам не нужно загружать классификатор хара каждый раз, когда вы пытаетесь найти лицо - загрузите его в начале. Операции над файлами медленны, поэтому они должны сделать код быстрее.
Смежные вопросы