模式识别 - 恐惧视频特征训练器 部分实现
模式识别 - 恐怖视频特征训练器 部分实现
ExportInterface.cpp:
main.cpp:
恐怖视频特征训练器 部分实现
本文地址: http://blog.****.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; }