將一個視頻文件逐幀保存到另一個視頻文件中,利用此種方法我們可以進行視頻剪輯、拼接等工作。(《學習OpenCV》P31-33)
打開一個原視頻,獲取其幀率、尺寸等屬性。
主要是建立一個寫入視頻文件的輸出器CvVideoWriter* writer,並利用cvCreateVideoWriter函數設置輸出屬性,依次爲文件名、格式、幀率、尺寸。CV_FOURCC函數要注意,可以利用後面四個字符參數設置很多不同的視頻格式。
然後在循環中,利用cvWriteFrame函數一幀幀把原視頻的幀寫入到writer所指定的新視頻中。
原文用了一個cvLogPolar的極座標轉換,沒看懂什麼意思,輸出了一個奇奇怪怪的視頻,這裏就刪掉了這一步。
#include"cv.h"
#include"highgui.h"
int main(){
CvCapture* capture = 0;
capture = cvCreateFileCapture("D:\\OPENCV實驗\\video1.avi");
if (!capture)
return -1;
IplImage* bgr_frame = cvQueryFrame(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));
CvVideoWriter* writer = cvCreateVideoWriter("D:\\OPENCV實驗\\video2.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size); //設置寫入視頻流
IplImage* logpolar_frame = cvCreateImage(size, IPL_DEPTH_8U, 3);
while ((bgr_frame = cvQueryFrame(capture)) != NULL){
//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);
cvWriteFrame(writer, bgr_frame); //逐幀寫入
}
cvReleaseVideoWriter(&writer);
cvReleaseImage(&logpolar_frame);
cvReleaseCapture(&capture);
return 0;
}
結果:
生成了一個相同的視頻文件。不過原文代碼中第一次獲取視頻幀之後沒有寫入,這裏應該是少一幀的。