Opencv常见的内存泄露问题
发布时间:2021-11-30 12:52:50 所属栏目:教程 来源:互联网
导读:今天花了一个晚上的时间帮一个网友调试opencv的代码,出现了不少错误,其中主要的错误给出它的主函数来分析下: #include iostream #include stdio.h #include cv.h #include highgui.h //#include yundongjiance.h //#include zhencha.h using namespace std
今天花了一个晚上的时间帮一个网友调试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);函数,也是初学者常常犯的错误,以为这种操作时默认的,所以导致对这种错误不知改从何下手,最后补上一句话,那就是一定要有耐心去学会调试,这个很重要。在此特地写下来分享下。 ![]() (编辑:泉州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |