opencv 程序bug

在使用OpenCV进行视频处理时,遇到了'runtime error R6025 pure virtual function call'错误。经过排查,发现在获取视频帧时没有正确处理空帧情况,导致程序出错。解决方法是在获取帧后添加判断,如果帧为空则退出循环,避免后续操作引发错误。修复后的代码解决了问题,但原因尚不清楚。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Openv 调试错误

今天,在做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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值