我已经成功检测到从网络摄像头捕获的面部,但是在捕获大约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 :(得分:1)
只要代码不完整,就无法给出原因。
你正在将Obj传递给Obj-> webcam_reader() - 无论如何,如果Obj已经作为this指针传递了。
根据如何定义webcam_reader,您可以在此时制作Obj的副本(如果您没有通过引用传递)。如果无法安全地复制该对象,则可能会出现问题。如果您没有实现复制构造函数,而是在该类中使用手动分配的动态内存,则可能就是这种情况。在这种情况下,只复制指针并释放两次。
如上所述,人们只能推测原因。
答案 1 :(得分:0)
更改
cvWaitKey(10);
到
cvWaitKey(25);
或者
cvWaitKey(35);