0

我是 OpenCV 的新手,正在尝试一些东西。我想使用网络摄像头检测手,这是一个简单的代码。但它给了我类似的东西: HaarCascade.exe 中 0x000000013f5b140b 的未处理异常:0xC0000005:访问冲突读取位置 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

感谢您的所有回复。

4

1 回答 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!
于 2011-12-02T21:53:35.837 回答