2013-10-13 37 views
0

我想在eclipse中使用opencv2來檢測人臉。 我使用下列程序一樣...在使用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*’

我已經在添加了「haarcascade_frontalface_alt.xml」源文件夾。當我將級聯定義爲CascadeClassifier時,會顯示一些兼容性錯誤。

我其實新的OpenCV ......所以plz幫助

回答

1

,請不要使用過時的C-API,它不會在不久的將來支持。

look here一個更先進的最新版本

順便說一句,如果你有一個指針的東西,你需要訪問它爲:something->,不something.

+0

哎,我能夠做的在您提供的鏈接中提到的程序的幫助下進行人臉檢測。但我真的想弄清楚上述問題的問題......你可以詳細說明你想傳達的任何內容......我將非常感謝你。 – venus

+0

'CvHaarClassifierCascade * cascade;如果(!cascade-> load(face_cascade_name))'你有一個指向CvHaarClassifierCascade的指針,所以你必須使用' - >'而不是'''。此外,指針永遠不會實例化,應該是'CvHaarClassifierCascade * cascade = createHaarClassifierCascade();'或類似的,我忘了。再次堅持新的C++ api並且玩得開心! – berak

+0

感謝您的回覆。這真的很有幫助。 – venus

相關問題