2012-03-31 4 views
0

Je suis nouveau sur OpenCV et C++. J'ai OpenCV fonctionnant avec Microsoft Visual Studio 2008 (32 bits) et réussi à obtenir le Filtering Tutorial/Sobel Derivatives et d'autres tutoriels pour travailler.Exception du tutoriel OpenCV Cascade Classifier

J'essaie maintenant Cascade Classifier tutorial en utilisant le code qu'ils fournissent dans le tutoriel:

#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); 
} 

J'ai ajouté ces bibliothèques à l'entrée Linker: 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

Et j'ai les fichiers xml dans le répertoire principal de mon projet Visual Studio (où le fichier de solution réside)

Mais je reçois le texte suivant erreur lorsque je lance/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.. 

**

Il ne montre pas une ligne de code qui est faux mais me pointe vers un emplacement de mémoire et me montre le code de désassemblage que je ne comprends pas.

Question: Comment puis-je obtenir le flux vidéo de ma webcam pour communiquer avec le code OpenCV dans Visual Studio? Est-ce que c'est le problème ou est-ce que je manque quelque chose d'autre?

EDIT: L'erreur se produit réellement dans la première ligne de chargement des cascades. J'ai essayé de placer les xml de cascade dans différents endroits sans succès.

Toute aide est appréciée.

Répondre

1

vous connectez votre flux vidéo à OpenCV à travers les appels suivants:

capture = cvCaptureFromCAM(-1); 

et

frame = cvQueryFrame(capture); 

Le premier appel sera mis à votre caméra vers le haut - il choisira tout disponible - et le second va récupérer les images. Le code fait beaucoup de suppositions quand ça ne va pas, donc c'est difficile de dire la source des problèmes. Mon conseil serait d'exécuter le code en mode débogage (définir un point d'arrêt dans la première ligne), copier les xmls au bon endroit - vous aurez probablement besoin de le mettre dans votre dossier Déboguer ou en tant que racine du projet - et allez ligne par ligne jusqu'à ce que l'exception soit levée. Après cela, vous pouvez nous dire dans quelle ligne cela s'est passé et nous pouvons résoudre le problème pour de bon.

Cordialement, Daniel

+0

Salut dannyxyz22, Merci pour votre réponse. J'ai débogué et le code semble se plaindre à la première ligne de chargement xml: 'if (! Face_cascade.load (face_cascade_name)) {printf ("- (!) Erreur de chargement \ n"); return -1; } ' –

+0

J'ai essayé de placer les fichiers xml dans 4 endroits différents. (y compris les deux dossiers Debug) –

+0

J'ai également essayé de spécifier le chemin complet C: \ Users ... etc pour les fichiers xml et j'ai toujours eu une erreur similaire. –

Questions connexes