Opencv从图像生成视频
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