轉載請註明:http://blog.csdn.net/ding977921830/article/details/50952683。
//#include "stdAfx.h"
#include <opencv2/core/core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
#include <direct.h>//for mk_dir
#include <io.h>//for _acess()
#include <opencv2/imgproc/imgproc.hpp>
#define threshold_diff 20 //設置簡單幀差法閾值
using namespace cv;
using namespace std;
int recursive_mkdir( char *dir );//創建多級目錄
int main(int argc, char** argv)
{ ////////////////////批處理讀入圖片部分參數//////////////////////////////
char* inputDir="F:\\論文視頻庫\\視頻幀庫\\Walking\\"; //一定要加上最後的兩個雙斜線,輸入視頻幀的目錄
char* videoName="Walking.avi"; //輸出的視頻名字
char* outDir="F:\\論文視頻庫\\視頻幀庫\\Walking\\"; //一定要加上最後的兩個雙斜線,輸出的視頻的目錄
int startFrame = 50; //含義:起始幀
int tmpFrame = startFrame; //含義:記錄起始幀
int endFrame = 412; //含義:起始幀,結束幀
int imgW = 768; //含義:視頻幀的寬
int imgH = 576; //含義:視頻幀的高
char* imgExt = ".jpg"; //根據圖片的性質選擇.jpg,.bmp等類型,一定要注意jpg前面那個
//點,當時我缺了這個點,浪費了我一晚上的時間才找到問題
double fps=24; //幀率
int isColor=1; //顏色
int fourcc=CV_FOURCC('X','V','I','D'); //CV_FOURCC('X', 'V', 'I', 'D') 表示是XVID庫進行壓縮,壓縮爲MPEG4格式
IplImage *pImg=NULL;
IplImage *pImg2=NULL;
char cur_fn[255]; //表示某張圖片的絕對路徑
char fullVideoName[255]; //輸出視頻的完整文件名:路徑+文件名
int frameCount = startFrame; //計算運行到第N幀
int frames = 0 ; //總幀數
CvSize size=cvSize(imgW,imgH);
//////////////////////幀差法部分參數////////////////////////////////////////
Mat img_src1,img_src2,img_src3;//3幀法需要3幀圖片
Mat img_dst,gray1,gray2,gray3;
Mat gray_diff1,gray_diff2,gray_diff;//存儲2次相減的圖片
Mat gray;//用來顯示前景的
//判斷輸入文件夾是否存在
if (_access(inputDir,0)==-1)
{
cout<<"the input directory does not exist!"<<endl;
return 0;
}
//判斷輸出文件夾是否創建 若沒有則創建;若爲NULL則默認當前工作目錄
strcpy_s(fullVideoName,"");
if (outDir==NULL)
{
sprintf_s(fullVideoName,"%s",videoName);//把videoName打印成一個字符串保存在fullVideoName 中
}
else
{
if (_access(outDir,0)==-1)
{
recursive_mkdir(outDir);
}
sprintf_s(fullVideoName,"%s%s",outDir,videoName);//將字符串outDir和videoName連接起來,打印,保存在fullVideoName中
}
// pWriter=cvCreateVideoWriter(videoName,fourcc,fps,size,isColor);//CREATE WRITER
while(startFrame<=endFrame)
{
strcpy_s(cur_fn,"");
sprintf_s(cur_fn,"%s%d%s",inputDir,startFrame,imgExt);//need to change
pImg=cvLoadImage(cur_fn,isColor);
sprintf_s(cur_fn,"%s%d%s",inputDir,startFrame-1,imgExt);//need to change
pImg2=cvLoadImage(cur_fn,isColor);
if (!pImg)
{
std::cout<<"can't open an image file"<<std::endl;
}
Mat mtx(pImg); // IplImage格式轉換成Mat格式
Mat mtx2(pImg2); // IplImage格式轉換成Mat格式
img_src1 = mtx;
img_src2 = mtx2;
//img_src3;//3幀法需要3幀圖片
namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
imshow("MyWindow", mtx);
cout<<"運行到第 "<< frameCount<<" 幀 "<<endl;
waitKey(1);
cvtColor(img_src1,gray1,CV_BGR2GRAY);
imshow("video_src1",img_src1);//可以事先不用新建一個窗口
waitKey(5);
cvtColor(img_src2,gray2,CV_BGR2GRAY);
imshow("video_src2",img_src2);//可以事先不用新建一個窗口
waitKey(5);
subtract(gray1,gray2,gray_diff);
for(int i=0;i<gray_diff.rows;i++)
for(int j=0;j<gray_diff.cols;j++)
if(abs(gray_diff.at<unsigned char>(i,j))>=threshold_diff)//這裏模板參數一定要用unsigned char,否則就一直報錯
gray_diff.at<unsigned char>(i,j)=255;
else gray_diff.at<unsigned char>(i,j)=0;
imshow("運動目標foreground",gray_diff);
Mat ero ;
Mat dil ;
Mat ero_dil ;
erode(gray_diff,ero,cv::Mat()); //腐蝕
dilate(gray_diff,dil,cv::Mat()); //膨脹
dilate(ero,ero_dil,cv::Mat()); //腐蝕後再膨脹
imshow("腐蝕後的二值圖片",ero); //可以事先不用新建一個窗口
waitKey(5);
imshow("膨脹後的二值圖片",dil); //可以事先不用新建一個窗口
waitKey(5);
imshow("腐蝕後再膨脹後的二值圖片",ero_dil); //可以事先不用新建一個窗口
waitKey(5);
startFrame++;
frameCount++;
frames++;
}
rename(videoName,fullVideoName);//移動文件到指定文件夾
cout<<"起始幀爲: "<<tmpFrame<<endl;
cout<<"total frames 爲: "<<frames<<" have been write to video."<<endl;
system("pause");
return 0;
}
//該函數借鑑了網上資料,自動創建多級目錄
int recursive_mkdir( char *dir )
{
//
std::string str = dir;
int index = 0;
int i = 0;
while(1)
{
std::string::size_type pos = str.find("\\",index);
std::string str1;
str1 = str.substr(0,pos);
if( pos != -1 && i > 0 )
{
if (_access(str1.c_str(),0)==-1)
{
_mkdir(str1.c_str());
}
}
if( pos==-1 )
{
break;
}
i ++;
index = pos+1;
}
return 0;
}
參考文獻:
1.http://blog.csdn.net/sway_2012/article/details/7786465
2.http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html