2.3 写入AVI视频文件
2016-02-28 21:20
253 查看
创建一个写入设备以便逐帧将视频流写入视频文件,用函数cvCreateVideoWriter()实现。当输出设备被创建以后,调用cvWriterFrame()逐帧将视频流写入文件。最后调用cvReleaseVideoWriter()来释放资源。
涉及函数:
从摄像头或者文件中抓取一帧,并返回这一帧,返回的图像不可以被用户修改或者释放。cvQueryFrame使用已经在CvCapture结构中分配好的内存。
创建视频写入器。
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:如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧。
把图像映射到极指数空间
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)
此函数模仿人类视网膜中央凹视力,并且对于目标跟踪等可用于快速尺度和旋转变换不变模板匹配。
示例程序:
涉及函数:
IplImage* cvQueryFrame( CvCapture* capture );
从摄像头或者文件中抓取一帧,并返回这一帧,返回的图像不可以被用户修改或者释放。cvQueryFrame使用已经在CvCapture结构中分配好的内存。
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:如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧。
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)
此函数模仿人类视网膜中央凹视力,并且对于目标跟踪等可用于快速尺度和旋转变换不变模板匹配。
示例程序:
#include "cv.h" #include "highgui.h" int main(int argc, char** argv) { //打开视频文件 CvCapture* capture = cvCreateFileCapture("E:\\test.avi"); //如果文件不存在,退出 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( "E:\\out.avi", CV_FOURCC('M','J','P','G'), fps, size, 1 ); //创建写入帧 IplImage* logopolar_frame = cvCreateImage( size, IPL_DEPTH_8U, 3 ); /*如果还有帧可以抓取的话,就进入循环。 将原帧映射到极指数空间,再写入到视频写入设备 */ while ((bgr_frame=cvQueryFrame(capture)) != NULL) { cvLogPolar( bgr_frame, logopolar_frame, cvPoint2D32f(bgr_frame->width/2, bgr_frame->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS ); cvWriteFrame(writer, logopolar_frame); } //释放内存 cvReleaseVideoWriter(&writer); cvReleaseImage(&bgr_frame); cvReleaseCapture(&capture); return 0; }
相关文章推荐
- LNMP环境搭建
- UVA12563 Jin Ge Jin Qu hao(背包问题)
- Data Structures And Problem Solving Using Java (Fourth Edition)中译版(Java 修饰词与可见性)
- ionic css布局之bar页眉页脚定义
- 计算机网络学习笔记----互联网分层及协议
- POJ 3122 pie 二分
- 5.1数组(一维部分)
- const形参与非const形参
- CSS——div居中,window.open(0
- HTML窗体指南
- Java自定义比较器实现中文排序
- 【SSME】java.lang.IllegalStateException: Failed to load ApplicationContext
- Redis3.0与Jedis2.7.2 客户端与Spring整合
- 《编写高质量代码:改善C++程序的150个建议》读书笔记2
- LeetCode 26: Remove Duplicates from Sorted Array
- 找出数组中的最小值--递归实现
- js中object的申明方法
- 无线轮播
- HDU 1405 The Last Practice
- Android之使用Android-query框架进行开发