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