0

I'm new to OpenCV and trying some stuff. I want to detect a hand using a webcam and here is a simple code. But it gives me something like that: Unhandled exception at 0x000000013f5b140b in HaarCascade.exe: 0xC0000005: Access violation reading location 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);
}

Image: https://i.sstatic.net/WQ8KH.png

Thank you for all your responses.

4
  • Have you made any effort at all to narrow down the problem? What has debugging told you? Commented Oct 17, 2011 at 16:25
  • Have you commented out that assert because it was failing? Commented Oct 17, 2011 at 16:26
  • cvGetSeqElem can return 0. assert that Commented Oct 17, 2011 at 16:38
  • 1
    This kind of exception is usually cause by a null pointer. Since you do no error checking in your code at all, this is not unexpected. Commented Oct 17, 2011 at 16:43

1 Answer 1

2

There's a chance that cvLoad() failed because it didn't found the file. That's a problem because you use it later on, and if it's a NULL pointer it can crash your application:

But you'll never know this unless you test the return of the function:

cascade = ( CvHaarClassifierCascade* )cvLoad( "haarcascade_hand.xml", 0, 0, 0 );
if (!cascade)
    // Print something to say it failed!
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.