2.3 写入AVI视频文件
创建一个写入设备以便逐帧将视频流写入视频文件,用函数cvCreateVideoWriter()实现。当输出设备被创建以后,调用cvWriterFrame()逐帧将视频流写入文件。最后调用cvReleaseVideoWriter()来释放资源。
涉及函数:
1 IplImage* cvQueryFrame( CvCapture* capture );
从摄像头或者文件中抓取一帧,并返回这一帧,返回的图像不可以被用户修改或者释放。cvQueryFrame使用已经在CvCapture结构中分配好的内存。
1 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
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
若编码器代号为 -1,则运行时会弹出一个编码器选择框。
fps:被创建视频流的帧率。
frame_size:视频流的大小。
is_color:如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧。
1 void cvLogPolar( const CvArr* src, CvArr* dst, CvPoint2D32f center, double M, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
把图像映射到极指数空间
src:输入图像
dst:输出图像
center:变换中心
M:幅度的尺度参数
flags:插值方法和以下选择标志的结合
CV_WARP_FILL_OUTLIERS -填充输出图像所有像素,如果这些点有和外点对应的,则置零。
CV_WARP_INVERSE_MAP - 表示矩阵由输出图像到输入图像的逆变换,并且因此可以直接用于像素插值。否则,函数从map_matrix中寻找逆变换。
fillval 用于填充外点的值。
函数cvLogPolar用以下变换变换输入图像:
正变换 (CV_WARP_INVERSE_MAP 未置位):
dst(phi,rho)<-src(x,y)
逆变换 (CV_WARP_INVERSE_MAP 置位):
dst(x,y)<-src(phi,rho),
这里,
rho=M * log(sqrt(x^2+y^2))
phi=atan(y/x)
此函数模仿人类视网膜中央凹视力,并且对于目标跟踪等可用于快速尺度和旋转变换不变模板匹配。
示例程序:
1 #include "cv.h" 2 #include "highgui.h" 3 4 int main(int argc, char** argv) 5 { 6 //打开视频文件 7 CvCapture* capture = cvCreateFileCapture("E:\\test.avi"); 8 9 //如果文件不存在,退出 10 if(!capture) 11 return -1; 12 13 //从视频文件中抓取一帧 14 IplImage* bgr_frame = cvQueryFrame(capture); 15 16 //获得帧数,为创建写入设备做准备 17 double fps = cvGetCaptureProperty( 18 capture, 19 CV_CAP_PROP_FPS 20 ); 21 22 //获得每一帧的尺寸 23 CvSize size = cvSize( 24 (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH), 25 (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT) 26 ); 27 28 //创建写入设备 29 CvVideoWriter* writer = cvCreateVideoWriter( 30 "E:\\out.avi", 31 CV_FOURCC('M','J','P','G'), 32 fps, 33 size, 34 1 35 ); 36 37 //创建写入帧 38 IplImage* logopolar_frame = cvCreateImage( 39 size, 40 IPL_DEPTH_8U, 41 3 42 ); 43 44 /*如果还有帧可以抓取的话,就进入循环。 45 将原帧映射到极指数空间,再写入到视频写入设备 46 */ 47 while ((bgr_frame=cvQueryFrame(capture)) != NULL) 48 { 49 cvLogPolar( 50 bgr_frame, 51 logopolar_frame, 52 cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2), 53 40, 54 CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS 55 ); 56 cvWriteFrame(writer, logopolar_frame); 57 } 58 59 //释放内存 60 cvReleaseVideoWriter(&writer); 61 cvReleaseImage(&bgr_frame); 62 cvReleaseCapture(&capture); 63 64 return 0; 65 }