阅读35-40个网络摄像头帧后,应用程序崩溃

时间:2011-11-02 06:36:21

标签: c++ opencv

我已经成功检测到从网络摄像头捕获的面部,但是在捕获大约35-40帧后,应用程序崩溃,我只发布了我的代码的相关部分,_Image是我已经实现的类。

_Image *Obj;
CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
if ( !capture ) 
{
   fprintf( stderr, "\n\n---ERROR: capture is NULL---\n" );
}
IplImage * frame = cvQueryFrame( capture );
 // Show the image captured from the camera in the window and repeat
while (1) 
{
    frame = cvQueryFrame( capture );
    if ( !frame ) {
          fprintf( stderr, "ERROR: Webcam frame is null...Unexpected Error - Exiting" );    
          getchar();
          exit(0);
    }
    Obj = new _Image(frame);
    if(Obj==0)
    {
        fprintf( stderr, "\nERROR: Out of Memory!!\n" );
        cvReleaseImage(&frame );
        cvDestroyAllWindows();
        // Release the capture device 
        cvReleaseCapture( &capture );
                        exit(0);
    }
    flag = Obj->detect_face_in_image();
    if(flag!=0)
    {
        Obj->add_frame_name();
        Obj->webcam_reader( *Obj); 
    }
         // Do not release the frame!
    delete Obj;
    cvNamedWindow( "WEBCAM", CV_WINDOW_AUTOSIZE );
    cvShowImage ( "WEBCAM", frame);
    if ( (cvWaitKey(10)) == 27 )
    {
                  cvReleaseImage(&frame );
        cvDestroyAllWindows();
        // Release the capture device 
        cvReleaseCapture( &capture );
                        break;
    }
}   

但是如果改变我的代码来播放AVI文件,我不会遇到这种崩溃,这只发生在网络摄像头上。我得到了Windows XP send or dont send error report,在崩溃之前没有特定的错误消息。

2 个答案:

答案 0 :(得分:1)

只要代码不完整,就无法给出原因。

你正在将Obj传递给Obj-> webcam_reader() - 无论如何,如果Obj已经作为this指针传递了。

根据如何定义webcam_reader,您可以在此时制作Obj的副本(如果您没有通过引用传递)。如果无法安全地复制该对象,则可能会出现问题。如果您没有实现复制构造函数,而是在该类中使用手动分配的动态内存,则可能就是这种情况。在这种情况下,只复制指针并释放两次。

如上所述,人们只能推测原因。

答案 1 :(得分:0)

更改

cvWaitKey(10);

cvWaitKey(25);

或者

cvWaitKey(35);