2011-10-17 231 views
0

我是新來的OpenCV,並試圖一些東西。我想用一個攝像頭檢測的手,這裏是一個簡單的代碼。但它給了我這樣的事情:在HaarCascade.exe 未處理的異常在0x000000013f5b140b:0000005:訪問衝突讀取位置0x0000000000000004。未處理的異常

#include <opencv2/opencv.hpp> 

using namespace cv; 
using namespace std; 

IplImage* img = 0; 

CvHaarClassifierCascade *cascade; 
CvMemStorage *cstorage; 
CvMemStorage *hstorage; 

void detectObjects(IplImage *img); 
int key; 

int main(int argc, char** argv) 
{ 
    CvCapture *capture; 
    IplImage *frame; 

    // loads classifier for hand haar cascade 
    char *filename = "haarcascade_hand.xml"; 
    cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_hand.xml", 0, 0, 0); 

    // setup memory buffer 
    hstorage = cvCreateMemStorage(0); 
    cstorage = cvCreateMemStorage(0); 

    // initialize camera 
    capture = cvCaptureFromCAM(0); 

    // always check 
    //assert(cascade && storage && capture); 

    // create a window 
    cvNamedWindow("Camera", 1); 

    while(key!='q') { 
     // captures frame and check every frame 
     frame = cvQueryFrame(capture); 
     if(!frame) break; 

     // detect objects and display video 
     detectObjects (frame); 

     // quit if user press 'q' 
     key = cvWaitKey(10); 
    } 

    // free memory 
    cvReleaseCapture(&capture); 
    cvDestroyAllWindows(); 
    cvReleaseHaarClassifierCascade(&cascade); 
    cvReleaseMemStorage(&cstorage); 
    cvReleaseMemStorage(&hstorage); 

    return 0; 
} 

void detectObjects(IplImage *img) 
{ 
    int px; 
    int py; 
    int edge_thresh = 1; 
    IplImage *gray = cvCreateImage(cvSize(640,480), 8, 1); 
    IplImage *edge = cvCreateImage(cvSize(640,480), 8, 1); 

    // convert video image color 
    cvCvtColor(img,gray,CV_BGR2GRAY);      

    // set the converted image's origin 
    gray->origin=1;       

    // color threshold 
    cvThreshold(gray,gray,100,255,CV_THRESH_BINARY);  

    // smooths out image 
    cvSmooth(gray, gray, CV_GAUSSIAN, 11, 11); 

    // get edges 
    cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 5); 

    // detects circle 
    CvSeq* circle = cvHoughCircles(gray, cstorage, CV_HOUGH_GRADIENT, 1, gray->height/50, 5, 35); 

    // draws circle and its centerpoint 
    float* p = (float*)cvGetSeqElem(circle, 0); 
    cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(255,0,0), -1, 8, 0); 
    cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(200,0,0), 1, 8, 0); 
    px=cvRound(p[0]); 
    py=cvRound(p[1]); 

    // displays coordinates of circle's center 
    cout <<"(x,y) -> ("<<px<<","<<py<<")"<<endl; 

    // detects hand 
    CvSeq *hand = cvHaarDetectObjects(img, cascade, hstorage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(100, 100)); 

    // draws red box around hand when detected 
    CvRect *r = (CvRect*)cvGetSeqElem(hand, 0); 
    cvRectangle(img, 
     cvPoint(r->x, r->y), 
     cvPoint(r->x + r->width, r->y + r->height), 
     CV_RGB(255, 0, 0), 1, 8, 0); 

    cvShowImage("Camera",img); 
} 

圖片: http://i.imgur.com/Dneiw.png

感謝您對您的所有答覆。

+0

有你爲了縮小這個問題做了什麼努力?有什麼調試告訴了你? –

+0

有你那'assert'註釋掉了,因爲它是失敗? –

+0

cvGetSeqElem可以返回0斷言 – fazo

回答

2

有一個機會cvLoad()失敗,因爲它沒有找到該文件。這是一個問題,因爲你以後使用它,如果它是一個空指針它可以引起程序崩潰:

但你永遠不會知道,除非你測試函數的返回:

cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_hand.xml", 0, 0, 0); 
if (!cascade) 
    // Print something to say it failed!