您的位置:首页 > 其它

2.3 写入AVI视频文件

2016-02-28 21:20 253 查看
创建一个写入设备以便逐帧将视频流写入视频文件,用函数cvCreateVideoWriter()实现。当输出设备被创建以后,调用cvWriterFrame()逐帧将视频流写入文件。最后调用cvReleaseVideoWriter()来释放资源。

涉及函数:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: