Opencv常見的記憶體泄露錯誤

來源:互聯網
上載者:User

今天花了一個晚上的時間幫一個網友調試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);函數,也是初學者常常犯的錯誤,以為這種操作時預設的,所以導致對這種錯誤不知改從何下手,最後補上一句話,那就是一定要有耐心去學會調試,這個很重要。在此特地寫下來分享下。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.