2

我使用從OpenCV的用於臉部檢測的樣品夾下面的代碼在視頻:人臉檢測樣品與OpenCV的2.4.2 +的Visual Studio 2012 +視窗7(64位)的異常

#include "stdafx.h" 
#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 

using namespace std; 
using namespace cv; 

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

/** Global variables */ 
String face_cascade_name = "lbpcascade_frontalface.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 cascade 
    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(0); 
    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, Size(80, 80)); 

    for(int i = 0; i < faces.size(); i++) 
    { 
     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)); 
     if(eyes.size() == 2) 
     { 
     //-- Draw the face 
     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, 0), 2, 8, 0); 

    for(int j = 0; j < eyes.size(); j++) 
     { //-- Draw the eyes 
     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, 255), 3, 8, 0); 
      } 
     } 

    } 
    //-- Show what you got 
    imshow(window_name, frame); 
} 

我有OpenCV 2.4.2在我的電腦上正常工作,因爲我試過其他簡單的例子,它們工作正常。但是,當我嘗試這個代碼時,它的構建很好。然而,當我運行它,我得到一個異常未處理的錯誤:

Unhandled exception at 0x000007FEEF848158 (opencv_objdetect242.dll) in OpenCVTest2.exe: 0xC0000005: Access violation reading location 0x0000000000000010. 

我試圖步入由一行行的代碼,當我站上罰球線外被調用:

if(!eyes_cascade.load(eyes_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; 

我在我的Visual Studio項目中包含了xml分類器文件。

我做錯了什麼?或者這是一個在Windows as mentioned in some of the comments to this question上使用面部檢測樣本的問題?

回答

4

我想我通過參考OpenCV安裝包中提供的一些示例代碼得到了它的工作。對於任何在未來遇到此問題的人,我都有pasted the code here

0

我通過使用記事本++得到了這個工作。我將所有文件轉換爲ANSI,並刪除了第一行<?xml version="1.0"?>,然後手動重寫。