OpenCV中的实时人脸检测

OpenCV中的实时人脸检测,opencv,computer-vision,real-time,face-detection,Opencv,Computer Vision,Real Time,Face Detection,我试图写一些简单的实时人脸检测代码,但不知怎么的,它不起作用。(我在图像上尝试了人脸检测代码,但使用下面的代码,我在屏幕上得到了一个灰色图像,代码失败) 这是我尝试过的代码(它将“face detected!”打印一次到输出窗口) 尝试不调用函数cvFlip和CVHistogram 查看(仅使用cvShowImage)每个操作的结果(cvFlip、CVTcolor、CVT直方图)-这些操作之一的结果可能是灰色图像 您不必在每次尝试查找人脸时都加载haar分类器—在开始时加载它。对文件的操作速度很

我试图写一些简单的实时人脸检测代码,但不知怎么的,它不起作用。(我在图像上尝试了人脸检测代码,但使用下面的代码,我在屏幕上得到了一个灰色图像,代码失败)

这是我尝试过的代码(它将“face detected!”打印一次到输出窗口)

  • 尝试不调用函数cvFlip和CVHistogram
  • 查看(仅使用cvShowImage)每个操作的结果(cvFlip、CVTcolor、CVT直方图)-这些操作之一的结果可能是灰色图像
  • 您不必在每次尝试查找人脸时都加载haar分类器—在开始时加载它。对文件的操作速度很慢,因此应该可以让您更快地编写代码
    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");
    }