首页 > 代码库 > OpenCV---图片生成视频

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;
}