2012-03-31 5 views
0

Ich bin neu in OpenCV und C++. Ich habe OpenCV mit Microsoft Visual Studio 2008 (32-Bit) arbeiten und es geschafft, die Filtering Tutorial/Sobel Derivatives und andere Tutorials zu funktionieren.OpenCV Cascade Classifier Tutorial Ausnahme

ich jetzt versuchen, die Cascade Classifier tutorial den Code mit sie im Tutorial liefern:

#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/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(int 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(int 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[i].height)*0.25); 
     circle(frame, center, radius, Scalar(255, 0, 0), 4, 8, 0); 
    } 
    } 
    //-- Show what you got 
    imshow(window_name, frame); 
} 

ich diese Bibliotheken mit dem Linker Eingang hinzugefügt haben: opencv_core230d.lib opencv_calib3d230d.lib opencv_contrib230d.lib opencv_features2d230d.lib opencv_highgui230d.lib opencv_legacy230d.lib opencv_ml230d.lib opencv_imgproc230d.lib opencv_video230d LIB opencv_objdetect230.lib opencv_gpu230d.lib opencv_haartraining_engined.lib

Und ich habe die XML-Dateien im Hauptverzeichnis meiner Visual Studio-Projekt (in dem die Lösung Datei befindet)

Aber ich bekomme die folgende Fehler, wenn ich laufe/debug:

**

First-chance exception at 0x76b1b9bc in OpenCV_CascadeClassifier.exe: Microsoft C++ exception: cv::Exception at memory location 0x002ff1d0.. 
Unhandled exception at 0x77e315de in OpenCV_CascadeClassifier.exe: Microsoft C++ exception: cv::Exception at memory location 0x002ff1d0.. 

**

Es zeigt keine Codezeile an, die falsch ist, aber zeigt mich auf einen Speicherort und zeigt mir den Demontagecode, den ich nicht verstehe.

Frage: Wie erhalte ich den Video-Stream von meiner Webcam mit dem OpenCV-Code in Visual Studio zu kommunizieren? Ist das das Problem oder fehlt mir etwas anderes?

BEARBEITEN: Der Fehler tritt tatsächlich in der ersten Zeile des Ladens der Kaskaden auf. Ich habe versucht, die Kaskaden-Xmls an verschiedenen Orten ohne Erfolg zu platzieren.

Jede Hilfe wird geschätzt.

Antwort

1

Sie Ihre Video-Stream zu OpenCV durch die folgenden Anrufe verbinden:

capture = cvCaptureFromCAM(-1); 

und

frame = cvQueryFrame(capture); 

Der erste Anruf wird die Kamera einrichten - es wird jede verfügbare holen - und die zweite Ruft die Frames ab. Der Code macht viele Annahmen, wenn es schief geht, daher ist es schwierig, die Ursache der Probleme zu bestimmen.

Mein Rat wäre, den Code im Debug-Modus (setzen Sie einen Haltepunkt in der ersten Zeile), kopieren Sie die Xmls an der richtigen Stelle - Sie müssen wahrscheinlich in Ihrem Debug-Ordner oder als Projektstamm - und gehen Sie Zeile für Zeile, bis die Ausnahme ausgelöst wird. Danach kannst du uns sagen, in welcher Zeile das passiert ist und wir können das Problem endgültig lösen.

Mit freundlichen Grüßen Daniel

+0

Hallo dannyxyz22, Vielen Dank für Ihre Antwort. Ich debuggte und der Code scheint sich bei der ersten Lade-XML-Zeile zu beschweren: 'if (! Face_cascade.load (Face_cascade_name)) {printf ("- (!) Fehler beim Laden \ n"); Rückgabe -1; } –

+0

Ich habe versucht, die XML-Dateien an 4 verschiedenen Orten zu platzieren. (einschließlich der zwei Debug-Ordner) –

+0

Ich habe auch versucht, den vollständigen Pfad C: \ Users ... etc für die XML-Dateien anzugeben, und ich habe immer noch einen ähnlichen Fehler. –