在《筆記二》中咱們作了視頻播放和控制的實現,僅僅算是完成了對視頻文件的讀取操做;今天咱們來一塊兒練習下對視頻文件的寫入操做:格式轉換。ide
打開一個視頻文件play.avi,讀取文件內容,將每一幀圖像轉換爲對數極座標格式最後將轉換後的圖像序列寫入新的視頻文件play1.avi中。以下圖對比效果:函數
#include "stdafx.h" #include "cv.h" #include "highgui.h" int main(int argc,char** argv) { if(argc == 3) { CvCapture* capture = 0; capture = cvCreateFileCapture(argv[1]); //從指定文件獲取視頻流 if(!capture) return -1; IplImage *bgr_frame = cvQueryFrame(capture); //從讀取的視頻流capture中讀取一幀 double fps = cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);//獲取視頻幀率 CvSize size = cvSize((int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH), (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT)); //獲取視頻流中幀的尺寸 /*cvCreateVideoWriter(新建視頻文件名,視頻壓縮編碼格式,幀率,尺寸)*/ CvVideoWriter * writer = cvCreateVideoWriter(argv[2],CV_FOURCC('M','J','P','G'), fps,size); //建立視頻文件寫入器 IplImage* logpolar_frame = cvCreateImage(size,IPL_DEPTH_8U,3); while((bgr_frame = cvQueryFrame(capture)) != NULL) { /* 將圖像映射到極座標cvLogPolar(原圖像,輸出圖像,轉換中心,量級水平,標誌位)*/ cvLogPolar(bgr_frame,logpolar_frame,cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2),40,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS); cvWriteFrame(writer,logpolar_frame);//(視頻寫入器,要吸入的幀) } cvReleaseVideoWriter(&writer); cvReleaseImage(&logpolar_frame); cvReleaseCapture(&capture); } return 0; }