2017-07-10 5 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