模式识别 - 恐惧视频特征训练器 部分实现

模式识别 - 恐怖视频特征训练器 部分实现

恐怖视频特征训练器 部分实现


本文地址: http://blog.csdn.net/caroline_wendy/article/details/23763003


本程序已开发完成, 需授权使用, 如有需要, 请站内联系.


恐怖视频特征训练器(HorrorVideoFeatureTrainer), 提取视频的特征, 存储入相应的文本.


实现代码:

ExportInterface.h:

/*! @file
********************************************************************************
<PRE>
模块名 : 导出接口
文件名 : ExportInterface.h
相关文件 : ExportInterface.cpp
文件实现功能 : 导出接口类声明
作者 : C.L.Wang
Email: morndragon@126.com
版本 : 1.0
--------------------------------------------------------------------------------
多线程安全性 : 是
异常时安全性 : 是
--------------------------------------------------------------------------------
备注 : 无
--------------------------------------------------------------------------------
修改记录 :  
日 期              版本   修改人         修改内容 
2014/03/27   1.0    C.L.Wang        Create
</PRE>
********************************************************************************

* 版权所有(c) C.L.Wang, 保留所有权利

*******************************************************************************/

#pragma once

#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <cstring>
#include <ctime>

#include <windows.h>

#include "VideoTraining.h"

/*! @function
********************************************************************************
<PRE>
函数名 : trainVideoSet
功能 : 训练视频集
参数 : 
const string& _featureName, 存储特征文件;
const int _label, 视频标签;
const string& _videoSetPath, 视频集合路径;
const size_t _shotInterval = 100, 镜头;
const size_t _sceneNum = 20, 镜头数;
返回值 : const bool, 是否成功
抛出异常 : 无
--------------------------------------------------------------------------------
复杂度 : 无
备注 : 无
典型用法 : isOK = trainVideoSet (featureName, label, videoSetPath, shotInterval, sceneNum);
--------------------------------------------------------------------------------
作者 : C.L.Wang
</PRE>
*******************************************************************************/ 
const bool trainVideoSet (
	const std::string& _featureName, /*存储特征文件*/
	const int _label, /*视频标签*/
	const std::string& _videoSetPath, /*视频集合路径*/
	const std::size_t _shotInterval = 100, /*镜头*/
	const std::size_t _sceneNum = 20 /*镜头数*/
); 

ExportInterface.cpp:

/*! @file
********************************************************************************
<PRE>
模块名 : 导出接口
文件名 : ExportInterface.cpp
相关文件 : ExportInterface.h
文件实现功能 : 导出接口类实现
作者 : C.L.Wang
Email: morndragon@126.com
版本 : 1.0
--------------------------------------------------------------------------------
多线程安全性 : 是
异常时安全性 : 是
--------------------------------------------------------------------------------
备注 : 无
--------------------------------------------------------------------------------
修改记录 :  
日 期              版本   修改人         修改内容 
2014/03/27   1.0    C.L.Wang        Create
</PRE>
********************************************************************************

* 版权所有(c) C.L.Wang, 保留所有权利

*******************************************************************************/

#include "stdafx.h"

#undef UNICODE

#include "ExportInterface.h"

using namespace std;
using namespace cv;
using namespace vd;

//遍历文件夹
std::shared_ptr<std::vector<std::string> > dfsFileList(const std::string& _folderPath)
{
	static std::shared_ptr<std::vector<std::string> > 
		folderFiles(new std::vector<std::string>); //返回指针, 需要迭代使用

	WIN32_FIND_DATA FindData;
	HANDLE hError;

	int file_count(0);
	std::string filePath(_folderPath); //路径名
	std::string fullFilePath; //全路径名 

	filePath.append("/*.*");
	hError = FindFirstFile(filePath.c_str(), &FindData);
	if (hError == INVALID_HANDLE_VALUE) {
		std::cout << "failed to search files." << std::endl;
		return nullptr;
	}
	while(FindNextFile(hError, &FindData))
	{
		//过虑".", "..", "-q"
		if (0 == strcmp(FindData.cFileName, ".") || 
			 0 == strcmp(FindData.cFileName, "..") || 
			 0 == strcmp(FindData.cFileName, "-q"))
		{
			continue;
		}

		//完整路径
		fullFilePath.append(_folderPath);
		fullFilePath.append("/");
		fullFilePath.append(FindData.cFileName);
		++file_count;

		if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
			//std::cout << file_count << " " << full_file_path << "<Dir>" << std::endl;
			dfsFileList(fullFilePath);
		}else{
			folderFiles->push_back(fullFilePath);
			//std::cout << file_count << " " << full_file_path << std::endl;
		}
		fullFilePath.clear(); //清空目录
	}

	return folderFiles;
}

//训练视频
const bool transVideo(
	const std::string& _featureName, /*存储特征文件*/
	const int _label, /*视频标签*/
	const std::string& _videoName, /*视频名称*/
	const std::size_t _shotInterval = 100, /*镜头*/
	const std::size_t _sceneInterval = 2000 /*镜头数*/
) 
{
	const std::string& featureName(_featureName);
	const int label(_label);
	const std::string videoName(_videoName);
	const unsigned int shotInterval(_shotInterval);
	const unsigned int sceneInterval(_sceneInterval);

	VideoTraining iVT(featureName, label, videoName, shotInterval, sceneInterval);
	if (!iVT.trainVideoFeatures()) {
		std::cout << "Failed to train video : " << _videoName << std::endl;
		return false;
	}

	return true;
}

//训练视频集合
const bool trainVideoSet (
	const std::string& _featureName, /*存储特征文件*/
	const int _label, /*视频标签*/
	const std::string& _videoSetPath, /*视频集合路径*/
	const std::size_t _shotInterval, /*镜头*/
	const std::size_t _sceneNum  /*镜头数*/
) 
{
	const std::string& featureName(_featureName);
	const int label(_label);
	const std::string videoSetPath(_videoSetPath);
	const unsigned int shotInterval(_shotInterval);
	const unsigned int sceneInterval(_shotInterval*_sceneNum);

	std::shared_ptr<std::vector<std::string> > folderFiles;
	folderFiles = dfsFileList(videoSetPath);
	if (folderFiles) 
	{
		for (size_t i=0; i != folderFiles->size(); ++i) {
			std::cout << i+1 << " : " << (*folderFiles)[i] << std::endl;

			clock_t start = clock();
			if (!transVideo(featureName, label, (*folderFiles)[i], shotInterval, sceneInterval)){
				return false;
			}
			clock_t end = clock(); 

			double time = static_cast<double>(end-start)/CLOCKS_PER_SEC; 
			std::cout << " time = " << time << std::endl;
		}
	}

	return true;
}

main.cpp:

/*! @file
********************************************************************************
<PRE>
模块名 : 主函数
文件名 : main.cpp
相关文件 : 无
文件实现功能 : 主函数实现
作者 : C.L.Wang
Email: morndragon@126.com
版本 : 1.0
--------------------------------------------------------------------------------
多线程安全性 : 是
异常时安全性 : 是
--------------------------------------------------------------------------------
备注 : 无
--------------------------------------------------------------------------------
修改记录 :  
日期                版本   修改人         修改内容 
2014/04/02   1.0    C.L.Wang        Create
</PRE>
********************************************************************************

* 版权所有(c) C.L.Wang, 保留所有权利

*******************************************************************************/

#include "stdafx.h"

#include <iostream>
#include <vector>
#include <string>

#include "ExportInterface.h"

void help() 
{
	std::cout << "版权归C.L.Wang所有, 未经授权, 严禁使用, 如有需要, 请邮件联系." << std::endl;
	std::cout << "Email: morndragon@126.com " << std::endl;
	std::cout << "Usage: HorrorVideoFeatureTrainer [feature_file(txt)] ";
	std::cout << "[video_label(number)] [video_folder(path)] ";
	std::cout << "[shot_interval(number-default)] [scene_num(number-default)]" << std::endl;
	std::cout << "[feature_file(txt)]: 存储特征的文本名, 可以使用txt类型, 如\"feature.txt\". " << std::endl;
	std::cout << "[video_label(number)] : 视频的标签, 整数, 如\"0\"(建议: 0, 负样本; 1, 正样本). " << std::endl;
	std::cout << "[video_folder(path)]: 视频的文件夹, 路径, 如\"X:/negative\". " << std::endl;
	std::cout << "[shot_interval(number-default)]: 镜头间隔, 整数, 默认100, 可以使用缺省值. " << std::endl;
	std::cout << "[scene_num(number-default)]: 场景镜头数, 整数, 默认20, 可以使用缺省值. " << std::endl;
}

int main(int argc, char** argv)
{
	help();
	if (argc < 4) {
		std::cerr << std::endl << "*****Sorry, Lack of parameters! *****" << std::endl << std::endl;;
		help();
		return -1;
	}


	const std::string& featureName(argv[1]);
	const int label(atoi(argv[2]));
	const std::string& videoSetPath(argv[3]); 
	std::size_t shotInterval = 100; /*镜头*/
	std::size_t sceneNum = 20; /*镜头数*/

	if (argc == 5) {
		shotInterval = atoi(argv[4]);
	}

	if (argc == 6) {
		sceneNum = atoi(argv[5]);
	}

	//const std::string& featureName("NegtiveFeatureFile.txt"); /*存储特征文件*/
	//const int label(0); /*视频标签*/
	//const std::string& videoSetPath("E:/Work/violence/负样本切割"); /*视频集合路径*/
	//const std::size_t shotInterval = 100; /*镜头*/
	//const std::size_t sceneNum = 20; /*镜头数*/

	if (!trainVideoSet (featureName, label, videoSetPath, shotInterval, sceneNum)) {
		std::cout << "Trainer Error! " << std::endl;
	} else {
		std::cout << "Trainer Over! " << std::endl;
	}

	return 0;
}


模式识别 - 恐惧视频特征训练器 部分实现