首页 > OPENCV > Opencv从图像生成视频

Opencv从图像生成视频

2012年8月9日 发表评论 阅读评论

opencv中的结构体cvCreateVideoWriter支持视频写操作,它的定义如下:

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 非零则为彩色编码,否则输出为灰色帧

示例代码及其注释如下:


#ifdef _DEBUG
#pragma comment ( lib, "cxcore200d.lib" )
#pragma comment ( lib, "cv200d.lib" )
#pragma comment ( lib, "highgui200d.lib" )
#else
#pragma comment ( lib, "cxcore200.lib" )
#pragma comment ( lib, "cv200.lib" )
#pragma comment ( lib, "highgui200.lib" )
#endif
#include "cv.h"
#include "highgui.h"

#include <iostream>
using namespace std;

//视频宽度
#define VIDEO_WIDTH 256
//视频高度
#define VIDEO_HEIGTH 256
//视频文件名
#define VIDEO_NAME "TEST.avi"
//帧率
#define VIDEO_FPS 30
//窗口名称
#define WINDOW_NAME "frame"

int main(int argc,char* argv[])
{
    //创建图片
    IplImage *frame = 0;
    frame = cvCreateImage(cvSize(VIDEO_WIDTH,VIDEO_HEIGTH),IPL_DEPTH_8U,3);
    //创建视频结构体
    CvVideoWriter *VideoWriter;  
    VideoWriter = cvCreateVideoWriter (VIDEO_NAME,CV_FOURCC('M', 'P', '4', '2'), VIDEO_FPS, cvSize( VIDEO_WIDTH, VIDEO_HEIGTH),1);
    //创建字体
    CvFont font;
    cvInitFont (&font, CV_FONT_HERSHEY_COMPLEX, 1, 0.8); 

    cvNamedWindow (WINDOW_NAME, CV_WINDOW_AUTOSIZE);    
    char str[32]; 

    int frame_counter = 0;
    //100帧
    while (frame_counter < 100)
    {    
        cvZero(frame);
        //输出文字到视频
        _snprintf_c(str, 64, "%d", frame_counter);  
        cvPutText (frame, str, cvPoint (10, 20), &font, CV_RGB (255, 0, 0));
        //窗口显示当前帧
        cvShowImage (WINDOW_NAME, frame);
        cvWaitKey(2);
        //将当前帧写入视频文件
        cvWriteFrame (VideoWriter, frame);   

        frame_counter++;  
    }
    //释放内存
    cvReleaseVideoWriter (&VideoWriter);
    cvReleaseImage(&frame);
    cvDestroyWindow (WINDOW_NAME);
    return 0;
}

这里我们的输出结果如下:

播放结果如下:

但是我测试的时候发现一点很重要的,就是视频的高度好像必须是4的整数倍,不然的话输出的视频是会倾斜的,而且颜色也不对,这估计是OPENCV内部的问题吧,或者是编码的问题。比如我将上面代码中的256 改成257,那么输出的结果是向下面那样的:


【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

分类: OPENCV 标签: