2011-08-13 37 views
0

我嘗試使用vs2010運行facedetect opencv示例。 調試結果「facedetect.exe中0x53fa42bf未處理的異常:0xC0000005:訪問衝突寫入位置0x00000000」。FaceDetect OpenCV2.1示例,訪問衝突寫入位置0x00000000

下面是代碼 txt文件:http://ebooks-libs.com/backup/facedetect-opencv2.1.txt
CPP文件:http://ebooks-libs.com/backup/facedetect.cpp

#include "stdafx.h" 
#include <iostream> 
#include <cstdio> 
#define CV_NO_BACKWARD_COMPATIBILITY 
#include "cv.h" 
#include "highgui.h" 
#ifdef _EiC 
#define WIN32 
#endif 

using namespace std; 
using namespace cv; 

void detectAndDraw(Mat& img, 
        CascadeClassifier& cascade, CascadeClassifier& nestedCascade, 
        double scale); 

String cascadeName ="./data/haarcascades/haarcascade_frontalface_alt.xml"; 
String nestedCascadeName ="./data/haarcascades/haarcascade_eye_tree_eyeglasses.xml"; 

int main(int argc, const char** argv) 
{ 
    CvCapture* capture = 0; 
    Mat frame, frameCopy, image; 
    const String scaleOpt = "--scale="; 
    size_t scaleOptLen = scaleOpt.length(); 
    const String cascadeOpt = "--cascade="; 
    size_t cascadeOptLen = cascadeOpt.length(); 
    const String nestedCascadeOpt = "--nested-cascade"; 
    size_t nestedCascadeOptLen = nestedCascadeOpt.length(); 
    String inputName; 

    CascadeClassifier cascade, nestedCascade; 
    double scale = 1; 

    for(int i = 1; i < argc; i++) 
    { 
     if(cascadeOpt.compare(0, cascadeOptLen, argv[i], cascadeOptLen) == 0) 
      cascadeName.assign(argv[i] + cascadeOptLen); 
     else if(nestedCascadeOpt.compare(0, nestedCascadeOptLen, argv[i], nestedCascadeOptLen) == 0) 
     { 
      if(argv[i][nestedCascadeOpt.length()] == '=') 
       nestedCascadeName.assign(argv[i] + nestedCascadeOpt.length() + 1); 
      if(!nestedCascade.load(nestedCascadeName)) 
       cerr << "WARNING: Could not load classifier cascade for nested objects" << endl; 
     } 
     else if(scaleOpt.compare(0, scaleOptLen, argv[i], scaleOptLen) == 0) 
     { 
      if(!sscanf(argv[i] + scaleOpt.length(), "%lf", &scale) || scale < 1) 
       scale = 1; 
     } 
     else if(argv[i][0] == '-') 
     { 
      cerr << "WARNING: Unknown option %s" << argv[i] << endl; 
     } 
     else 
      inputName.assign(argv[i]); 
    } 

    if(!cascade.load(cascadeName)) 
    { 
     cerr << "ERROR: Could not load classifier cascade" << endl; 
     cerr << "Usage: facedetect [--cascade=\"<cascade_path>\"]\n" 
      " [--nested-cascade[=\"nested_cascade_path\"]]\n" 
      " [--scale[=<image scale>\n" 
      " [filename|camera_index]\n" ; 
     return -1; 
    } 

    if(inputName.empty() || (isdigit(inputName.c_str()[0]) && inputName.c_str()[1] == '\0')) 
     capture = cvCaptureFromCAM(inputName.empty() ? 0 : inputName.c_str()[0] - '0'); 
    else if(inputName.size()) 
    { 
     image = imread(inputName, 1); 
     if(image.empty()) 
      capture = cvCaptureFromAVI(inputName.c_str()); 
    } 
    else 
     image = imread("lena.jpg", 1); 

    cvNamedWindow("result", 1); 

    if(capture) 
    { 
     for(;;) 
     { 
      IplImage* iplImg = cvQueryFrame(capture); 
      frame = iplImg; 
      if(frame.empty()) 
       break; 
      if(iplImg->origin == IPL_ORIGIN_TL) 
       frame.copyTo(frameCopy); 
      else 
       flip(frame, frameCopy, 0); 

      detectAndDraw(frameCopy, cascade, nestedCascade, scale); 

      if(waitKey(10) >= 0) 
       goto _cleanup_; 
     } 

     waitKey(0); 
_cleanup_: 
     cvReleaseCapture(&capture); 
    } 
    else 
    { 
     if(!image.empty()) 
     { 
      detectAndDraw(image, cascade, nestedCascade, scale); 
      waitKey(0); 
     } 
     else if(!inputName.empty()) 
     { 
      /* assume it is a text file containing the 
      list of the image filenames to be processed - one per line */ 
      FILE* f = fopen(inputName.c_str(), "rt"); 
      if(f) 
      { 
       char buf[1000+1]; 
       while(fgets(buf, 1000, f)) 
       { 
        int len = (int)strlen(buf), c; 
        while(len > 0 && isspace(buf[len-1])) 
         len--; 
        buf[len] = '\0'; 
        cout << "file " << buf << endl; 
        image = imread(buf, 1); 
        if(!image.empty()) 
        { 
         detectAndDraw(image, cascade, nestedCascade, scale); 
         c = waitKey(0); 
         if(c == 27 || c == 'q' || c == 'Q') 
          break; 
        } 
       } 
       fclose(f); 
      } 
     } 
    } 

    cvDestroyWindow("result"); 

    return 0; 
} 

void detectAndDraw(Mat& img, 
        CascadeClassifier& cascade, CascadeClassifier& nestedCascade, 
        double scale) 
{ 
    int i = 0; 
    double t = 0; 
    vector<Rect> faces; 
    const static Scalar colors[] = { CV_RGB(0,0,255), 
     CV_RGB(0,128,255), 
     CV_RGB(0,255,255), 
     CV_RGB(0,255,0), 
     CV_RGB(255,128,0), 
     CV_RGB(255,255,0), 
     CV_RGB(255,0,0), 
     CV_RGB(255,0,255)} ; 
    Mat gray, smallImg(cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1); 

    cvtColor(img, gray, CV_BGR2GRAY); 
    resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR); 
    equalizeHist(smallImg, smallImg); 

t = (double)cvGetTickCount(); 
    cascade.detectMultiScale(smallImg, faces,1.1, 2, 0 |CV_HAAR_SCALE_IMAGE,Size(30, 30)); 
     //|CV_HAAR_FIND_BIGGEST_OBJECT 
     //|CV_HAAR_DO_ROUGH_SEARCH 
t = (double)cvGetTickCount() - t; 
printf("detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.)); 
    for(vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++) 
    { 
     Mat smallImgROI; 
     vector<Rect> nestedObjects; 
     Point center; 
     Scalar color = colors[i%8]; 
     int radius; 
     center.x = cvRound((r->x + r->width*0.5)*scale); 
     center.y = cvRound((r->y + r->height*0.5)*scale); 
     radius = cvRound((r->width + r->height)*0.25*scale); 
     circle(img, center, radius, color, 3, 8, 0); 
     if(nestedCascade.empty()) 
      continue; 
     smallImgROI = smallImg(*r); 
     nestedCascade.detectMultiScale(smallImgROI, nestedObjects, 
      1.1, 2, 0 
      //|CV_HAAR_FIND_BIGGEST_OBJECT 
      //|CV_HAAR_DO_ROUGH_SEARCH 
      //|CV_HAAR_DO_CANNY_PRUNING 
      |CV_HAAR_SCALE_IMAGE 
      , 
      Size(30, 30)); 
     for(vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++) 
     { 
      center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale); 
      center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale); 
      radius = cvRound((nr->width + nr->height)*0.25*scale); 
      circle(img, center, radius, color, 3, 8, 0); 
     } 
    } 
    cv::imshow("result", img); 
} 

需要一些幫助如何解決它...

+0

用VS2010的漂亮的調試工具跟蹤它,問題發生在哪裏,哪個功能,哪個類,哪種使用風格等等。這種詢問方式將沒有答案。 – Mustafa

回答

0

訪問衝突錯誤可能意味着你正在訪問一個你沒有設置值的指針。

如果你不懂如何使用調試器(學習!)把printf(「ok1,2,3 .... \ n」);寬鬆通過代碼,並制定出多遠它是gettign這樣你就可以縮小在錯誤發生

0

我得到這個錯誤太與VS2010的OpenCV 2.3,即使在調整的代碼,以便cascadeName使用的完整路徑haarcascade_frontalface_alt.xml後。

我能夠查明問題到的應用程序崩潰行:

if(!cascade.load(cascadeName)) 

的崩潰是從OpenCV的代碼來了,我不知道爲什麼會發生。

+0

我在OS X 10.6.8和OpenCV2 r6123下測試過,它對我來說工作正常。它似乎圍繞視頻饋送的最醜陋的部分(即我的臉)畫了一個圓圈。 – SSteve

+0

是的,我知道它適用於其他平臺。這個問題似乎與Windows版本有關。謝謝。 – karlphillip

+0

@karlphillip您是否找到解決此問題的解決方案? – Ruba

相關問題