0

簡単なリアルタイムの顔検出コードを書こうとしていますが、どういうわけかうまくいきません。(画像で顔検出コードを試しましたが、機能しますが、以下のコードを使用すると、画面に灰色の画像が表示され、コードが失敗します)

これが私が試したコードです(「顔が検出されました!」を出力ウィンドウに1回出力します)

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");
}
4

1 に答える 1

2
  1. 関数cvFlipおよびcvEqualizeHistogramを呼び出さずに試してください。
  2. 各操作(cvFlip、cvCvtColor、cvEqualizeHistogram)の結果を見てください(cvShowImageを使用してください)-これらの操作のいずれかの結果がグレー画像である可能性があります。
  3. 顔を見つけようとするたびにhaar分類子をロードする必要はありません。最初にロードしてください。ファイルの操作は遅いので、コーディングが速くなるはずです。
于 2012-12-23T22:23:10.593 に答える