在《笔记二》中咱们作了视频播放和控制的实现,仅仅算是完成了对视频文件的读取操做;今天咱们来一块儿练习下对视频文件的写入操做:格式转换。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; }