2011-10-17 3 views
0

OpenCV를 처음 사용하고 새로운 것을 시도합니다. 웹캠을 사용하여 손을 감지하고 싶습니다. 여기 간단한 코드가 있습니다. 그러나 그것은 내게 뭔가를 준다 : HaarCascade.exe 0x000000013f5b140b에서 처리되지 않은 예외 : 0xC0000005 : 0x0000000000000004 위치를 읽는 액세스 위반.OpenCV 라이브러리를 사용하여 C++에서 처리되지 않은 예외가 발생했습니다.

#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

실패했기 때문에 '단언'한다고 주석 처리 했습니까? –

+0

cvGetSeqElem은 0을 반환 할 수 있습니다. – fazo

답변

2

cvLoad()이 파일을 찾지 못해 실패 할 가능성이 있습니다. 당신이 나중에 그것을 사용하기 때문에 그게 문제, 그리고 그것의 경우 NULL은 응용 프로그램 충돌 할 수 있습니다 포인터 :

을하지만 당신은 함수의 반환 테스트하지 않는 한 당신이 결코 알지 못할 것이다 :

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