运行环境:opencv2.3 vs2010 win7 64位
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
//
// 该程序实现视频和图片的相互转换.
// Image_to_video()函数将一组图片合成AVI视频文件.
// Video_to_image()函数将AVI视频文件读入,将每一帧存储为jpg文件.
//
#define NUM_FRAME 300 //只处理前300帧,根据视频帧数可修改
void Video_to_image(char* filename)
{
printf("------------- video to image ... ----------------\n");
//初始化一个视频文件捕捉器
CvCapture* capture = cvCaptureFromAVI(filename);
//获取视频信息
cvQueryFrame(capture);
int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n\tframe numbers : %d\n", frameH, frameW, fps, numFrames);
//定义和初始化变量
int i = 0;
IplImage* img = 0;
char * image_name=NULL;
//char image_name[20];
image_name=(char *)malloc(20*sizeof(char)); //动态分配内存
cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
//读取和显示
while(1)
{
img = cvQueryFrame(capture); //获取一帧图片
cvShowImage( "mainWin", img ); //将其显示
char key = cvWaitKey(20);
sprintf(image_name, "%s%d%s", "d:\\images\\image", ++i, ".jpg");//保存的图片名
//如何将这些图片保存到一个指定的文件夹中? //"d:\\images\\image" 将图片存放在d盘images文件夹下
cvSaveImage(image_name, img); //保存一帧图片
if(i == NUM_FRAME) break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("mainWin");
}
void Image_to_video()
{
int i = 0;
IplImage* img = 0;
char * image_name=NULL;
//char image_name[20];
image_name=(char *)malloc(20*sizeof(char)); //动态分配内存
printf("------------- image to video ... ----------------\n");
//初始化视频编写器,参数根据实际视频文件修改
CvVideoWriter *writer = 0;
int isColor = 1;
int fps = 25; // or 30
int frameW = 400; // 744 for firewire cameras
int frameH = 240; // 480 for firewire cameras
writer=cvCreateVideoWriter("out10.avi",CV_FOURCC('X','V','I','D'),fps,cvSize(frameW,frameH),isColor);
printf("\tvideo height : %d\n\tvideo width : %d\n\tfps : %d\n", frameH, frameW, fps);
//创建窗口
cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );
while(i<NUM_FRAME)
{
sprintf(image_name, "%s%d%s", "d:\\images\\image", ++i, ".jpg");//读取d盘images文件夹下图片
img = cvLoadImage(image_name);
if(!img)
{
printf("Could not load image file...\n");
exit(0);
}
cvShowImage("mainWin", img);
cvWriteFrame(writer, img);
//char key = cvWaitKey(20);
cvReleaseImage(&img);
if( cvWaitKey(20) >= 0 ) break;
}
cvReleaseVideoWriter(&writer);
cvDestroyWindow("mainWin");
}
int main(int argc, char *argv[])
{
char filename[13] = "test.avi";
Video_to_image(filename); //视频转图片
Image_to_video(); //图片转视频
return 0;
}
//--------------------------------------------------------------------------------
关于cvCreateVideoWriter
创建视频文件写入器
typedef struct CvVideoWriter CvVideoWriter; 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等。 在Win32下,如果传入参数-1,可以从一个对话框中选择压缩方法和压缩参数。 fps
- 被创建视频流的帧率。 frame_size
- 视频流的大小。 is_color
- 如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。
函数cvCreateVideoWriter创建视频写入器结构。
对于CV_FOURCC逐个调试,运行结果:
// 各种格式 ——输出视频名称 视频大小 对应编码器的代号
//CV_FOURCC('F','L','V','1')——out1.avi 5.60M FLV1 codec
//CV_FOURCC('P','I','M','1')——out2.avi 5.63M MPEG-1 codec
//CV_FOURCC('M','P','4','2')——out3.avi 4.95M MPEG-4.2 codec
//CV_FOURCC('M','J','P','G')——out4.avi 12.2M motion-jpeg codec
//CV_FOURCC('D','I','V','3')——out5.avi 4.90M MPEG-4.3 codec
//CV_FOURCC('D','I','V','X')——out6.avi 5.08M MPEG-4 codec
//CV_FOURCC('U','2','6','3')——out7.avi 0M H263 codec
//CV_FOURCC('I','2','6','3')——out8.avi 0M H263I codec
//CV_FOURCC('X','V','I','D')——out9.avi 5.08M
//OpenCV中通过CV_FOURCC生成指定编码器的代号
//若将CV_FOURCC(……)改成 -1 将会打开一个编码器的选择窗口.
参考资料: