您的位置:首页 > 运维架构

Opencv常见的内存泄露错误

2011-03-10 21:50 369 查看
今天花了一个晚上的时间帮一个网友调试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);函数,也是初学者常常犯的错误,以为这种操作时默认的,所以导致对这种错误不知改从何下手,最后补上一句话,那就是一定要有耐心去学会调试,这个很重要。在此特地写下来分享下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: