今天花了一个晚上的时间帮一个网友调试opencv的代码,出现了不少错误,其中主要的错误给出它的主函数来分析下:
#include "iostream"
#include "stdio.h"
#include "cv.h"
#include "highgui.h"
//#include "yundongjiance.h"
//#include "zhencha.h"
using namespace std;
void main()
{
IplImage* pImage=NULL;
IplImage* n_pImage=NULL;//当前帧图像
IplImage* m_pImage=NULL;//前一帧图像
IplImage* n_ch = NULL;
IplImage* rImage = NULL; //返回图像
int num=1; //帧数
//m_pImage = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
//创建窗口
cvNamedWindow("video1",1);
cvNamedWindow("video2",1);
cvNamedWindow("video3",1);
//使窗口有序排列bi
cvMoveWindow("video1",30,0);
cvMoveWindow("video2",690,0);
cvMoveWindow("video3",360,400);
CvCapture *pCapture=cvCaptureFromAVI("01.avi"); //抓取视频文件
pImage=cvCreateImage(cvSize(432,324),IPL_DEPTH_8U,3);
for(num=1;num<=10;num++) //取1000帧
{
pImage = cvQueryFrame(pCapture); //逐帧选取
if (!pImage) break;
if(num==1)
{
m_pImage = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
n_pImage = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
n_ch = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
rImage = cvCreateImage(cvSize(pImage->width,pImage->height),IPL_DEPTH_8U,3);
//原点在左上角
m_pImage->origin=1;
n_pImage->origin=1;
n_ch->origin = 1;
m_pImage = cvCloneImage(pImage);
n_pImage = cvCloneImage(pImage);
n_ch = cvCloneImage(pImage);
}
else if(num>1)
{
m_pImage = cvCloneImage(n_pImage);
n_pImage = cvCloneImage(pImage);
n_ch = cvCloneImage(pImage);
//添加检测代码
// rImage = zhencha(m_pImage,n_ch);
// rImage->origin=1;
cvShowImage("video1",n_pImage);
cvWaitKey(10);
cvShowImage("video2",m_pImage);
cvWaitKey(10);
cvShowImage("video3",rImage);
if(cvWaitKey(10)>=0)
break;
}
}
//销毁窗口
//pImage = cvCloneImage(rImage);
//cvReleaseImage(&pImage);
cvReleaseImage(&m_pImage);
cvReleaseImage(&n_pImage);
cvReleaseCapture(&pCapture); //抓取视频文件
cvReleaseImage(&rImage);
cvReleaseImage(&n_ch);
cvDestroyWindow("video1");
cvDestroyWindow("video2");
cvDestroyWindow("video3");
//释放图像和矩阵
return ;
}
闲话少说,下面来说说发生的错误,重点在以下两句代码:
//pImage = cvCloneImage(rImage);
//cvReleaseImage(&pImage);
说实话,我至今都只是根据答案来对错误进行的解释,当我们把视频读取完毕的时候,如果后面出现了一句cvReleaseImage(&pImage);那么将会出现内存错误,因为在读取完视频之后pImage指向的是一个空域,使用cvReleaseImage()函数将会出错,但是如果我们加上一句cvCloneImage();函数,将会消除这个错误,所以这就是内存不允许对一个不占用内存的指针去使用cvReleaseImage()函数,这也是在内存方面常常出现的错误。还有就是在使用完pCapture后没有使用cvReleaseCapture(&pCapture);函数,也是初学者常常犯的错误,以为这种操作时默认的,所以导致对这种错误不知改从何下手,最后补上一句话,那就是一定要有耐心去学会调试,这个很重要。在此特地写下来分享下。