使用OpenCV库的c++中未处理的异常

Unhandled exception in C++ using OpenCV libraries

本文关键字:未处理 异常 c++ OpenCV 库的 使用      更新时间:2023-10-16

我是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);
}

图片:https://i.stack.imgur.com/WQ8KH.png

感谢您的回复。

cvLoad()有可能因为没有找到文件而失败。这是一个问题,因为你以后使用它,如果它是一个NULL指针,它可以崩溃你的应用程序:

但是你永远不会知道这一点,除非你测试函数的返回:

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