opencv從攝像頭讀寫視訊檔案
阿新 • • 發佈:2019-02-15
opencv從攝像頭讀視訊檔案,並且寫入到本地目錄
程式碼如下:
#include "cv.h"
#include "highgui.h"
int main()
{
CvCapture *capture = cvCaptureFromCAM(0); //使用攝像頭
//如果沒有攝像頭,則直接跳出
if (!capture)
{
cout<<"can not find a camera"<<endl;
return;
}
IplImage *frame = cvQueryFrame(capture); //先捕獲一幀
CvVideoWriter *videoWriter = 0; //寫視訊結構體
int fps = 25; //捕捉幀率 ,影響生產的檔案的播放速度
int isColol=1;
videoWriter = cvCreateVideoWriter("D:\\out.avi",
CV_FOURCC('X', 'V', 'I', 'D'),//-1, //CV_FOURCC('F', 'L', 'V', '1'),
fps,
cvSize(frame->width, frame->height), isColol);
while (frame)
{
cvWriteFrame(videoWriter, frame);
cvShowImage( "video from camera", frame ); //顯示一幀影象
if (cvWaitKey(1000 / fps) == 27)
{
break; //跳出迴圈
}
frame = cvQueryFrame(capture);
}
cvReleaseVideoWriter(&videoWriter);//一定需要釋放
//cvReleaseImage(&frame);
cvReleaseCapture(&capture);
cvDestroyWindow("video from camera");
return 0;
}
其中寫視訊時需要下載xvid編解碼器,自己到網上down一下就行了,直接安裝就好。
可能會出現的問題:
1.opencv中申請一塊記憶體
IplImage *frame = cvQueryFrame(capture); //先捕獲一幀
在程式執行完前需要釋放記憶體,即呼叫
cvReleaseImage(&frame);
以前為了省事,我也經常不釋放,感覺也沒有出現什麼事情。其實那是因為呼叫 “cvReleaseImage(&frame);”時opencv中只釋放了記憶體而沒有去做其餘的事情,而不呼叫的話該語句,系統在程式執行完成後也會把該應用佔用的記憶體釋放掉。
但是在建立一個寫視訊檔案時
CvVideoWriter *videoWriter = 0; //寫視訊結構體時
讀取視訊完畢後一定要釋放掉,即呼叫
cvReleaseVideoWriter(&videoWriter);
因為在呼叫”cvReleaseVideoWriter(&videoWriter);”時,opencv還做了其餘的事情,比如將視訊的一些引數封裝進視訊,以前寫程式碼時總不釋放VideoWriter,導致用播放器播放視訊時不能快進,我估計是播放器不知道視訊的總幀數,當然也就不知道視訊的總時長了。
2.釋放CvCapture 與IplImage時:
cvQueryFrame與cvLoadImage不同的是cvLoadImage為影象分配記憶體空間,而cvQueryFrame使用已經在cvCapture結構中分配好的記憶體。這樣的話,就沒有必要通過cvReleaseImage()對這個返回的影象指標進行釋放,當CvCapture結構被釋放後,每一幀影象所對應的記憶體空間即會被釋放。
//cvReleaseImage(&frame);
cvReleaseCapture(&capture);
不然後出現如下圖所示的錯誤: