前言
对于这一周的视频去重工作总结,主要使用的环境为vs2015+opencv3.3+ffmpeg,将其中的一些关键细节点进行总结。
其中重点是在编写代码时所遇到的c++的一些基础点如:类型间的转换、建立hash哈希表、创建打开保存文件等操作。
c++知识点积累
1 . 将多个string字符串累加到一个向量中:
定义及实现如下:
vector<std::string> vecString;
string rstVideo1;
string rstVideo2;
vecString.push_back(rstVideo1);
vecString.push_back(rstVideo2);
2 . string与const char* 及char*类型转换:
参考这里;
(1) const char*转换为 string,直接赋值即可
const char* tmp = “ds”.
string s = tmp;
(2) string转换为const char*,利用c_str(),因为c_str()是string中的方法。
string s = “ds”;
const char*tmp = s.c_str();
(3) const char*转化为char*,利用如下:
const char* tmp = "ds";
char* p = const_cast<char*>(tmp);
(4) char*转化为const char*,直接赋值即可。
char* p = "ds".
const char* tmp = p;
(5)char*转化为string,直接赋值即可。
char* p = "ds".
string str = p;
(6)string转化为char*,走两步,先是string->const char*,然后是const char*->char*
string str = "ds";
char* p = const_cast<char*>(str.c_str()):
3 . 建立Hash表
从向量vecString1中依次读取其中的字符串,插入
#include <unordered_map>
unordered_map<string,double> umap;
unordered_map<string,double>::iterator it;
//插入元素,建立hash表
for(int m=0;m<vecString.size();++m){
string rstVideo_copy = vecString[m];
umap.insert(make_pair(rstVideo_copy,m));
}
//查找key是否存在hash表中
it = umap.find(rstVideo_copy2);
if(it == umap.end()){
cout << "find failed!" << endl;
}
//遍历hash表
for(it == umap.begin();it != umap.end(); it++){
cout << it->first << " " <<it->second << endl;
}
4 . 保存.yml文件:
将向量vecString写入到文件中对应的key : rstVideo下
FileStorage fs("VideoHah.yml",WRITE);
fs << "rstVideo" << vecString;
fs.release();
从文件中对应的key : rstVideo下读取向量vecString
FileStorage fs1("VideoHash.yml",READ);
fs1["rstVideo"] >> vecString1;
fs1.release();
判断文件是否打开成功
if(fs1.open("VideoHash.yml",READ)){
cout << "open successed" << endl;
}
5 . 打开指定目录下的所有文件
string path1 = "trainVideo";
string exten = "*";
bool addPath = false;
char file_root[255] = {0};
Directory dir;
//得到文件目录名字,判断下面有多少文件,遍历输出文件名
vector<string> filenames = dir.GetListFiles(path1,exten,addPath);
for(int j=0;j<filenames.size();j++){
sprintf_s(file_root,"%s\\%s",path1,filenames[j].c_str());
cout << "file_root" << file_root << endl;
}
6 . 判断文件目录是否存在,不存在则自动创建
// 循环创建img路径下的第j个文件夹
char szFolder[255] = {0};
sprintf_s(szFolder,"img\\%d\\",j);
int n = SHCreateDirectoryEx(NULL,szFolder,NULL);
总结
后续仍在进行中,仍有很多知识点尚未记录其中,日后会继续添加,未完待续…..