设为首页 加入收藏

TOP

Opencv常见的内存泄露错误
2014-11-24 08:42:11 来源: 作者: 【 】 浏览:0
Tags:Opencv 常见 内存 泄露 错误

今天花了一个晚上的时间帮一个网友调试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();函数,将会消除这个错误,所以这就是内存不允许对一个不占用内存的指针去使用cvCloneImage()函数,这也是在内存方面常常出现的错误。还有就是在使用完pCapture后没有使用cvReleaseCapture(&pCapture);函数,也是初学者常常犯的错误,以为这种操作时默认的,所以导致对这种错误不知改从何下手,最后补上一句话,那就是一定要有耐心去学会调试,这个很重要。在此特地写下来分享下。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux环境下Qt+Opencv的视频采集 下一篇Android锁屏与解屏相关代码分析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·【C语言】动态内存管 (2025-12-27 06:23:20)
·C语言中的内存管理 - (2025-12-27 06:23:16)
·C语言指南:C语言内 (2025-12-27 06:23:14)
·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)