创建一个写入设备以便逐帧将视频流写入视频文件,用函数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_FPS20 );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 135 );36 37 //创建写入帧38 IplImage* logopolar_frame = cvCreateImage(39 size,40 IPL_DEPTH_8U,41 342 );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_OUTLIERS55 );56 cvWriteFrame(writer, logopolar_frame);57 }58 59 //释放内存60 cvReleaseVideoWriter(&writer);61 cvReleaseImage(&bgr_frame);62 cvReleaseCapture(&capture);63 64 return 0;65 }