2011-10-17 187 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!