1. 程式人生 > >opencv從攝像頭讀寫視訊檔案

opencv從攝像頭讀寫視訊檔案

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);

不然後出現如下圖所示的錯誤:

Visual Studio的錯誤資訊

控制檯的錯誤資訊