2013-10-13 4 views
0

Eclipse에서 opencv2를 사용하여 얼굴을 감지하려고합니다. 나는 이미에서 "haarcascade_frontalface_alt.xml"을 추가 한opencv와 eclipse를 사용하여 facedetect 프로그램에서 'CvHaarClassifierCascade *'사용

#include <cv.h> 
#include"opencv2/highgui/highgui.hpp" 
#include"opencv2/core/core.hpp" 
#include"opencv2/imgproc/imgproc.hpp" 
using namespace cv; 
using namespace std; 

CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade); 
String face_cascade_name = "src/haarcascade_frontalface_alt.xml"; 
CvHaarClassifierCascade* cascade; 

int main(int argc, const char* argv[]) 
{ 
    CvCapture* capture =0; 

    capture = cvCaptureFromCAM(0); 
    IplImage* inputImg=0; 

    if(!cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; 

while(true) 
{ 
    inputImg = cvQueryFrame(capture); 
    if(!inputImg) break; 

    namedWindow("My_capture",CV_WINDOW_AUTOSIZE); 

    CvRect outputImg; 

    outputImg = detectFaceInImage(inputImg, cascade); 
} 

return 0; 
} 
// Perform face detection on the input image, using the given Haar Cascade. 
// Returns a rectangle for the detected region in the given image. 
CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade) 
{ 
    // Smallest face size. 
    CvSize minFeatureSize = cvSize(20, 20); 
    // Only search for 1 face. 
    int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH; 
    // How detailed should the search be. 
    float search_scale_factor = 1.1f; 
    IplImage *detectImg; 
    IplImage *greyImg = 0; 
    CvMemStorage* storage; 
    CvRect rc; 
    double t; 
    CvSeq* rects; 
    CvSize size; 
    int ms, nFaces; 
    storage = cvCreateMemStorage(0); 
    cvClearMemStorage(storage); 
    // If the image is color, use a greyscale copy of the image. 
    detectImg = (IplImage*)inputImg; 
    if (inputImg->nChannels > 1) 
    { 
     size = cvSize(inputImg->width, inputImg->height); 
     greyImg = cvCreateImage(size, IPL_DEPTH_8U, 1); 
     cvCvtColor(inputImg, greyImg, CV_BGR2GRAY); 
     detectImg = greyImg; // Use the greyscale image. 
    } 

    // Detect all the faces in the greyscale image. 
    t = (double)cvGetTickCount(); 
    rects = cvHaarDetectObjects(detectImg, cascade, storage,search_scale_factor, 3, flags, minFeatureSize); 
    t = (double)cvGetTickCount() - t; 
    ms = cvRound(t/((double)cvGetTickFrequency() * 1000.0)); 
    nFaces = rects->total; 
    printf("Face Detection took %d ms and found %d objects\n", ms, nFaces); 
     // Get the first detected face (the biggest). 
    if (nFaces > 0) 
     rc = *(CvRect*)cvGetSeqElem(rects, 0); 
    else 
     rc = cvRect(-1,-1,-1,-1); // Couldn't find the face. 
     if (greyImg) 
     cvReleaseImage(&greyImg); 
     cvReleaseMemStorage(&storage); 
     //cvReleaseHaarClassifierCascade(&cascade); 
return rc; // Return the biggest face found, or (-1,-1,-1,-1). 
} 

하지만이 오류를 얻고있다 ...

../src/test3.cpp:28:15: error: request for member ‘load’ in ‘cascade’, which is of non-class type ‘CvHaarClassifierCascade*’

나도 같은 위해 다음과 같은 프로그램을 사용하고 ... 원본 폴더. 캐스케이드를 CascadeClassifier로 정의 할 때 호환성 오류가 발생합니다.

내가 너무 PLZ

답변

1

이 오래된 C-API를 사용하지 마십시오 도움이 ... OpenCV의 실제로 새로운 오전, 그것은 가까운 장래에 지원되지 않습니다. something.

+0

이봐, 내가 일을 할 수 아니에요, something-> : 당신이 뭔가에 대한 포인터를 가지고있는 경우

BTW보다 최신 버전에 대한

look here, 당신은으로 접근 할 필요가 이미 제공 한 링크에서 언급 한 프로그램의 도움을 받아 얼굴 검색을 할 수 있습니다. 그러나 나는 정말로 위의 문제에 대한 문제를 파악하고 싶습니다 ... 당신이 전달하고 싶은 것을 정교하게 부탁드립니다 ... 당신에게 매우 감사 할 것입니다. – venus

+0

'CvHaarClassifierCascade * cascade; if (! cascade-> load (face_cascade_name))'CvHaarClassifierCascade에 대한 포인터를 가지고 있으므로'.' 대신'->'를 사용해야합니다. 또한, 포인터가 instanciated 적이 없다'CvHaarClassifierCascade * cascade = createHaarClassifierCascade(); 또는 이와 유사한, 나는 잊었다. 다시, 새로운, C++ API를 고수하고 재미있게 지내십시오! 답장을 보내 주셔서 감사합니다. – berak

+0

정말 도움이됩니다. – venus

관련 문제