【OpenCV學習】五、寫入AVI視頻文件

將一個視頻文件逐幀保存到另一個視頻文件中,利用此種方法我們可以進行視頻剪輯、拼接等工作。(《學習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;
}

結果:

生成了一個相同的視頻文件。不過原文代碼中第一次獲取視頻幀之後沒有寫入,這裏應該是少一幀的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章