2011-11-02 87 views
-1

我已经成功地检测从网络摄像头捕捉的面,但是,我已经发布的我的代码唯一相关的部分捕获约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,崩溃前没有具体的错误信息。

+0

你不提什么样的* *崩溃,你正目睹(访问冲突,堆栈溢出,等...),也没有下落,在此代码发生崩溃。你在调试器中看到了什么? – Johnsyweb

+0

该程序刚刚崩溃,就像你有时从任务管理器中结束任务一样......没有具体的方法来找出确切的原因......我应该如何在这里使用调试器? –

+0

@Johnsyweb - 当我删除'删除Obj'的问题得到解决,但不会导致内存泄漏,如何对付这个? –

回答

1

这是不可能的,只要代码是不完整的,给你的原因。

你传入* obj转换为Obj-> webcam_reader() - 为什么呢,如果obj已经为这个指针传递。

根据webcam_reader是如何定义的,你可能在这点上做的OBJ复印件(如果你不按引用传递)。如果无法安全地复制该对象,则可能会出现问题。如果您没有实现复制构造函数,但在该类中使用手动分配的动态内存,则可能会出现这种情况。在这种情况下,只有一个指针被复制和释放两次。

至于说,人们只能推测的原因。

0

变化

cvWaitKey(10); 

cvWaitKey(25); 

也许

cvWaitKey(35); 
+0

这个修复程序会是什么? – Johnsyweb

+0

网络摄像头有可能因为您想要访问帧比它能够捕获更快而崩溃。这可能不是解决方案,而是一个简单的检查。 – Sam

+0

但看着代码,它也似乎是一个可能的错误是泄漏,或者你试图释放一个受保护的内存。请记住,捕获对象总是返回一个指向同一个内存块的指针,其中新的帧由编解码器(视频)或驱动程序(摄像头)复制,并且不能由您的应用程序释放 – Sam