OpenCV---图片生成视频

时间:2023-03-10 03:31:36
OpenCV---图片生成视频
/**
It is a batch processing interface.
*/
#include "stdafx.h"
#include <windows.h>
#include <Shlwapi.h>
#include <iostream>
#include <string>
#include <vector>
#include <opencv.hpp>
#pragma comment(lib,"shlwapi.lib") //注意放置的位置
using namespace std;
using namespace cv; /******************************************
func:findfile
decs:find all file name in a directory @param dir the aerial image set directory
@param fileset image file name set in the 'dir' @return null
******************************************/
void findFile(string dir,vector<string> &fileset)
{
WIN32_FIND_DATAA stFD ; //存放文件信息的结构体
HANDLE h;
string temp; temp=dir+"\\*";
h=FindFirstFileA(temp.c_str(),&stFD); //构建文件夹句柄 while(FindNextFileA(h,&stFD)) //提取文件夹句柄相应文件夹所包括的文件
{
temp=dir+"\\"+stFD.cFileName; if(temp==dir+"\\..") //上一级路径
{
continue;
}
else if(PathIsDirectoryA(temp.c_str()) ) //包括子文件夹
{
findFile(temp,fileset); //递归调用
}
else
{
//cout<<stFD.cFileName<<endl; //打印文件名称
fileset.push_back(stFD.cFileName);
}
} return ;
} /******************************************
func:make_video
decs:generate video based on image set @param dir the image set path
@param videoPath video path
@param frameRate frame rate @param return null
******************************************/
void make_video(string dir, string videoPath,int frameRate)
{
vector<string> fileset;
Size frameSize;
VideoWriter writer; findFile(dir,fileset); vector<string>::iterator it=fileset.begin();
string filename; while(it!=fileset.end())
{
cout<<"---------------------------------------------"<<endl;
filename=dir+*it;
cout<<filename<<endl;
it++; Mat frame;
frame = imread(filename); // 读入图片
if (!writer.isOpened())
{
frameSize.width = frame.cols;
frameSize.height = frame.rows; if (!writer.open("matching_video.avi", CV_FOURCC('D','I','V','X') , frameRate, frameSize, true))
{
cout << "open writer error..." << endl;
return -1;
}
}
// 将图片数据写入
writer.write(frame);
// 显示
imshow("video", frame);
waitKey(frameRate);
} return;
} int main(void)
{
string dir,videoPath;
int frameRate; //dir=".\\shan_xi_aerial\\";
//dir="E:\\pic\\shan_xi_aerial\\";
dir="D:\\我的文档\\Documents\\Visual Studio 2010\\Projects\\speed_sift\\speed_sift\\result\\";
videoPath="matching_video.avi";
frameRate=25;
make_video(dir,videoPath,frameRate); cout<<"Generate video \""<<videoPath<<"\" OK!!!"<<endl;
system("pause");
return 0;
}