创建一个写入设备以便逐帧将视频流写入视频文件,用函数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 }

 

版权声明:本文为chan20160228原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/chan20160228/p/5225660.html