您的位置:首页 > 运维架构

[OpenCV] 制作个人视频

2016-11-26 13:28 183 查看
        代码为网上找的代码模块拼接而成的。

对输入的一个彩色视频与若干照片,用OpenCV实现以下功能或要求:

1.命令行格式:”xxx.exe 放视频与照片的文件夹路径”(例如MyMakeVideo.exe C:\input)【假如该文件夹下面只有一个avi视频与若干jpg文件】

2.将输入的视频与照片处理成相同长宽后,合在一起生成一个新视频。

3.这个新视频中,编程生成一个片头,然后按幻灯片形式播放这些输入照片,最后按视频原来速度播放输入的视频。

4.新视频中在底部打上含自己学号与姓名等信息的字幕。

#include <opencv2/opencv.hpp>
#include<string>
#include<io.h>
using namespace std;
using namespace cv;
#define NUM_FRAME 300
#define SIZE 7

char path[100];//输入文件路径

//将图片序列转换为视频
void getVideo()
{
int i = 0;
IplImage* img = 0;//读入图像
IplImage* outimg = 0;//修改图像尺寸
char image_name[100];//图像名字
char videoname[100];
strcpy(videoname, path);
strcat(videoname, "//1.avi");

//初始化视频编写器,参数根据实际视频文件修改
CvVideoWriter *writer = 0;
//从文件读入视频
CvCapture* capture = cvCaptureFromAVI(videoname);
//读取和显示
int isColor = 1;
IplImage* frameimg;//从视频中提取的帧图像
int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);//视频的fps
int frameH = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);//视频的高度
int frameW = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);//视频的宽度
writer = cvCreateVideoWriter("..//output//2.avi",-1, 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<SIZE)
{
CvSize Out_Img_size;//图片的大小
Out_Img_size.width = frameW;//使读入图片的大小与视频尺寸相同
Out_Img_size.height = frameH;
sprintf(image_name, "%s%d%s", "img", ++i, ".jpg");//得到图片名字
char imgname[100];
strcpy(imgname, path);
strcat(imgname, "//");
strcat(imgname,image_name);//加上路径
img = cvLoadImage(imgname);//打开图片
outimg = cvCreateImage(Out_Img_size, img->depth, img->nChannels);//创建一张与视频帧大小相同的图像
cvResize(img, outimg, CV_INTER_LINEAR);//让打开的图像重写为指定大小
if (!img)
{
printf("Could not load image file...\n");
exit(0);
}
//设置字体
CvFont font;
cvInitFont(&font, CV_FONT_VECTOR0, 0.5f, 0.5f, 0, 1, 8);
//在图像中显示文本字符串
cvPutText(outimg, "xuehao", cvPoint(frameW - 100, frameH - 60), &font, CV_RGB(255, 255, 255));
cvPutText(outimg, "xingming", cvPoint(frameW - 100, frameH - 30), &font, CV_RGB(255, 255, 255));
char key = cvWaitKey(20);//等待
//将图像写入视频,重复25次是为了使之放映速度变慢
for (int j = 0; j < 25; j++) {
cvShowImage("mainWin", outimg);
cvWriteFrame(writer, outimg);
}
}
i = 0;
while (1)
{
frameimg = cvQueryFrame(capture); //获取一帧图片
if (!frameimg)break;//读到尽头,退出
//设置字体
CvFont font;
cvInitFont(&font, CV_FONT_VECTOR0, 0.5f,0.5f , 0, 1, 8);
//在图像中显示文本字符串
cvPutText(frameimg, "xuehao", cvPoint(frameW - 100, frameH - 60), &font, CV_RGB(255, 255, 255));
cvPutText(frameimg, "xingming", cvPoint(frameW - 100, frameH - 30), &font, CV_RGB(255, 255, 255));
cvShowImage("mainWin", frameimg);
char key = cvWaitKey(20);
//将视频帧写入视频
cvWriteFrame(writer, frameimg);
}
cvReleaseVideoWriter(&writer);
cvDestroyWindow("mainWin");
}

int main(int argc, char* argv[])
{
strcpy(path, argv[1]);
getVideo();
waitKey();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: