2017-07-10 72 views
0

我從opencv網站找到了這個代碼並試用了它。我得到了這個問題,在detectAndDisplay顯示錯誤說法不完全類型是不允許的,CascadeClassifier不是一個類型名稱,CvCapture是不確定的,等等...我該如何解決這些錯誤面部檢測解鎖門

#include "C:\opencv\build\include\opencv\objdetect.hpp" 
#include "C:\opencv\build\include\opencv2\highgui.hpp" 
#include "C:\opencv\build\include\opencv2\imgproc.hpp" 

#include <iostream> 
#include <stdio.h> 

using namespace std; 
using namespace cv; 

/** Function Headers */ 
void detectAndDisplay ("Mat frame"); 

/** Global variables */ 
String face_cascade_name = "haarcascade_frontalface_alt.xml"; 
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; 
CascadeClassifier face_cascade; 
CascadeClassifier eyes_cascade; 
string window_name = "Capture - Face detection"; 
RNG rng(12345); 

/** @function main */ 
int main(int argc, const char** argv) 
{ 
    CvCapture* capture;  
    Mat frame;  

    //-- 1. Load the cascades 
    if(!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; };  
    if(!eyes_cascade.load(eyes_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; 

    //-- 2. Read the video stream  
    capture = cvCaptureFromCAM(-1);  
    if(capture)  
    {  
    while(true) 
    { 
     frame = cvQueryFrame(capture);  

     //-- 3. Apply the classifier to the frame  
     if(!frame.empty())  
     { detectAndDisplay(frame); } 
     else  
     { printf(" --(!) No captured frame -- Break!"); break; }  

     int c = waitKey(10);  
     if((char)c == 'c') { break; }  
     }  
    }  
    return 0;  
}  

/** @function detectAndDisplay */  
void detectAndDisplay(Mat frame)  
{  
    std::vector<Rect> faces;  
    Mat frame_gray; 

    cvtColor(frame, frame_gray, CV_BGR2GRAY); 
    equalizeHist(frame_gray, frame_gray);  

    //-- Detect faces  
    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30));  

    for(size_t i = 0; i < faces.size(); i++)  
    { 
    Point center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);  
    ellipse(frame, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);  

    Mat faceROI = frame_gray(faces[i]);  
    std::vector<Rect> eyes;  

    //-- In each face, detect eyes  
    eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30));  

    for(size_t j = 0; j < eyes.size(); j++)  
    { 
     Point center(faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5);  
     int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);  
     circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0);  
    } 
    } 
    //-- Show what you got  
    imshow(window_name, frame); 
} 
+0

CascadeClassifier定義在哪裏? – doctorlove

回答

0

你使用的是Windows?如果你是第一行應該是#include「C:\ opencv \ build \ include \ opencv2 // objdetect.hpp」我想(在objdetect.hpp之前使用雙斜線)。這應該能夠解決CascadeClassifier的問題。

至於CvCapture問題,您正在使用哪個版本的OpenCV?我非常肯定,如果您使用最新版本(3.0或更高版本),不再支持它,並且我不確定舊版本是否仍然可用。請參閱What is the difference between the CvCapture structure and the VideoCapture structure?

我建議使用VideoCapture而不是http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture(看起來像OpenCV 2.4也不支持CvCapture)。他們幾乎是相同的東西,我現在使用VideoCapture,所以它應該工作得很好!

+0

哦。我目前正在使用opencv的2.4.9版本,並且已經清除了一些小錯誤。我會嘗試使用VideoCapture,如果有效,它會很棒。謝謝!!! – james