今天,在做opencv程序时,遇到“runtime error R6025 pure virtual function call”错误,找了相关的资料后,发现opencv这类错误说的最多的是缺少销毁窗口函数等,然而我的错误肯定不是这样的,因为我有销毁窗口函数,而且通过调试,我发现我的这个错误是在最后运行return语句后出现的,虽然仍然不清楚为什么,但是仍然把这个错误记录下来,并且把解决方案写下来。
首先,我在改写程序时,出现如下错误:
程序源码:
// frame_3diff.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <highgui.h>
#include <cv.h>
#include <cxcore.h>
#define threshold_diff1 10 //设置简单帧差法阈值
#define threshold_diff2 10 //设置简单帧差法阈值
using namespace cv;
using namespace std;
int main(int argc,unsigned char* argv[])
{
IplImage* img_src1,*img_src2,*img_src3;//3帧法需要3帧图片
IplImage* gray1,*gray2,*gray3;
IplImage* gray_diff1,*gray_diff2;//存储2次相减的图片
IplImage* gray;//用来显示前景的
CvCapture* capture = 0;
bool pause=false;
capture = cvCreateFileCapture("H:\\123\\qiang\\Debug\\test.avi");
cvNamedWindow("foreground",CV_WINDOW_AUTOSIZE);
IplImage* img_src=0;
for (;;)
{
if(!false)
{
img_src1 = cvQueryFrame(capture);
gray = cvCreateImage(cvGetSize(img_src1),img_src1->depth,1);//灰度图
gray1 = cvCreateImage(cvGetSize(img_src1),img_src1->depth,1);//灰度图
gray2 = cvCreateImage(cvGetSize(img_src1),img_src1->depth,1);//灰度图
gray3 = cvCreateImage(cvGetSize(img_src1),img_src1->depth,1);//灰度图
gray_diff1 = cvCreateImage(cvGetSize(img_src1),img_src1->depth,1);//灰度图
gray_diff2 = cvCreateImage(cvGetSize(img_src1),img_src1->depth,1);//灰度图
cvShowImage("video_src",img_src1);
cvCvtColor(img_src1,gray1,CV_BGR2GRAY);
waitKey(5);
img_src2 = cvQueryFrame(capture);
cvCvtColor(img_src2,gray2,CV_BGR2GRAY);
cvShowImage("video_src",img_src2);
waitKey(5);
img_src3 = cvQueryFrame(capture);
cvCvtColor(img_src3,gray3,CV_BGR2GRAY);
cvAbsDiff(gray2,gray1,gray_diff1);//第二帧减第一帧
cvAbsDiff(gray3,gray2,gray_diff2);//第三帧减第二帧
for(int i=0;i<gray_diff1->height;i++)
{
unsigned char *ptr1=(unsigned char*)(gray_diff1->imageData+ i*gray_diff1->widthStep);
unsigned char *ptr2=(unsigned char*)(gray_diff2->imageData+ i*gray_diff2->widthStep);
for(int j=0;j<gray_diff1->width;j++)
{
if(ptr1[j]>=threshold_diff1)
ptr1[j]=255;
else ptr1[j]=0;
if(ptr2[j]>=threshold_diff2)//第二次相减阈值处理
ptr2[j]=255;
else ptr2[j]=0;
}
}
cvAnd(gray_diff1,gray_diff2,gray);
cvShowImage("foreground",gray);
}
char c=(char)waitKey(10);
if (c==27)
{
break;
}
}
cvReleaseImage(&gray);
cvReleaseImage(&gray1);
cvReleaseImage(&gray2);
cvReleaseImage(&gray3);
cvReleaseImage(&gray_diff1);
cvReleaseImage(&gray_diff2);
cvReleaseCapture(&capture);
cvDestroyAllWindows();
return 0;
}
上述程序之所以出现上面的bug,是因为当img_src3 = cvQueryFrame(capture);获取到的图片为空时,后面函数运行就会出错,所以应该在img_src3 = cvQueryFrame(capture);后加上判断退出语句:if(!img_src3) {return -1;}而且在char c=(char)waitKey(10);之前加上img_src3=NULL;然而这样修改后虽然解决上面的bug,但是却弹出另一个bug:
此时再次修改如下:将上面的if(!img_src3) {return -1;}修改为:if(!img_src3) {break;}即可
还请各位高手解释,虽然解决了bug,但是我还是不明白;
我的运行平台是windowsXP2003+vs2008+opencv2.1。