使用cvCreateVideoWriter函数,可以将视频流写入视频文件;
使用cvLogPolar函数,可以将每一帧图像转换为对数极坐标格式,
最后将转换后的图像序列写入新的视频文件中。
//将一个video转换为灰度级
#include <opencv\cv.hpp>
#include <opencv2\highgui\highgui.hpp>
int main(int argc, char* argv[]) {
CvCapture *capture = 0;
capture = cvCreateFileCapture("movie.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( //初始化视频输出文件
"video.avi",//输出video文件的名字
//CV_FOURCC('M', 'J', 'P', 'G'),//视频压缩的编码格式
CV_FOURCC('M', 'J', 'P', 'G'),//视频压缩的编码格式
fps, //指定视频的帧率
size, //指定视频图像的大小
1); //默认是1
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);//将极化后的图像写入视频流文件
}
cvReleaseVideoWriter(&writer);//释放视频流输出文件
cvReleaseImage(&logpolar_frame);//释放极化图像
cvReleaseCapture(&capture);//释放视频文件
return(0);
}
下面就是视频转化为极坐标格式的画面:
Note:1.视频压缩格式如下:
CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec
CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
2.输出视频流文件务必要使用avi格式,不要采用mp4格式的视频文件。