2011-10-17 24 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

あなたはそれが失敗したために 'assert'をコメントアウトしましたか? –

+0

cvGetSeqElemは0を返すことができます。 – fazo

答えて

2

ファイルが見つかりませんでしたので、cvLoad()が失敗した可能性があります。それはあなたが後でそれを使用するため、問題だし、それがNULLだ場合、それはあなたのアプリケーションがクラッシュすることがポインタ:

しかし、あなたは、関数の戻り値をテストしない限り、あなたはこれを知っていることは決してないだろう:

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