博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.3 写入AVI视频文件
阅读量:4982 次
发布时间:2019-06-12

本文共 3102 字,大约阅读时间需要 10 分钟。

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

 

转载于:https://www.cnblogs.com/chan20160228/p/5225660.html

你可能感兴趣的文章
js --基本语法3 函数,数组,堆棧
查看>>
hdu 3068(最长回文)
查看>>
python已处理的异常
查看>>
假如项目中使用到了多 表查询,怎么办?
查看>>
.net framework 4.0无法在Win7下安装的解决办法
查看>>
Day 8作业
查看>>
一道前端试题
查看>>
spring mvc +easy ui +Mybatis 录入数据
查看>>
洛谷P1047 校门外的树
查看>>
PostgreSQL 9.5,带来 UPSERT 等新特性
查看>>
[转][C#][WebApi]
查看>>
[转]NSIS:使用SectionSetFlags根据不同环境自动勾选特定区段
查看>>
一个五位数ABCDE乘以9,得到EDCBA,求此五位数
查看>>
数据库基本常识【总结】
查看>>
iOS8以后自动计算cell的高度
查看>>
forever 使用
查看>>
Ubuntu PostgreSQL安装和配置(转, 自己学习记录,版权归原作者)
查看>>
python的运算符及优先级与python的表达式
查看>>
挂FORM时找不到对应的功能(function)
查看>>
数论的一点前置知识
查看>>