/*
将一个视频转换为一个极坐标视频
*/
#include "opencv/cv.h"
#include "opencv/highgui.h"
int main(int argc,char** argv)
{
CvCapture* capture = 0;//视频读入设备
capture = cvCaptureFromFile(argv[1]);// 打开视频
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(//创建视频写入设备
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(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;
}
cvCreateVideoWriter
创建视频文件写入器
typedef struct CvVideoWriter CvVideoWriter;
CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );
filename
输出视频文件名。
fourcc
四个字符用来表示压缩帧的 codec 例如, CV_FOURCC('P','I','M','1') 是 MPEG-1
codec, CV_FOURCC('M','J','P','G')是 motion-jpeg codec 等。 在 Win32 下,如果传
入参数-1,可以从一个对话框中选择压缩方法和压缩参数。
fps
被创建视频流的帧率。
frame_size
视频流的大小。
is_color
如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在 Windows 下支持这个标志)。
函数 cvCreateVideoWriter 创建视频写入器结构。
cvWriteFrame
写入一帧到一个视频文件中
int cvWriteFrame( CvVideoWriter* writer, const IplImage* image );
writer
视频写入器结构。
image
被写入的帧。
函数 cvWriteFrame 写入/附加到视频文件一帧。
cvGetCaptureProperty
获得视频获取结构的属性
double cvGetCaptureProperty( CvCapture* capture, int property_id );
capture
视频获取结构。
property_id
属性标识。可以是下面之一:
CV_CAP_PROP_POS_MSEC - 影片目前位置,为毫秒数或者视频获取时间戳
CV_CAP_PROP_POS_FRAMES - 将被下一步解压/获取的帧索引,以 0 为起点
CV_CAP_PROP_POS_AVI_RATIO - 视频文件的相对位置(0 - 影片的开始,1 - 影片的结尾)
CV_CAP_PROP_FRAME_WIDTH - 视频流中的帧宽度
CV_CAP_PROP_FRAME_HEIGHT - 视频流中的帧高度
CV_CAP_PROP_FPS - 帧率
CV_CAP_PROP_FOURCC - 表示 codec 的四个字符 CV_CAP_PROP_FRAME_COUNT - 视频文件中帧的总数
函数 cvGetCaptureProperty 获得摄像头或者视频文件的指定属性。
译者注:
有时候这个函数在 cvQueryFrame 被调用一次后,再调用 cvGetCaptureProperty才会返回正确的数值。
转换效果:
转换前:
转换后: