实际项目总会遇到有很多超参数的情况,用常规的结构体等无法有效的涵盖所有,为了方便用户进行配置使用,因此使用yaml的方式进行编辑配置,因此去调研使用了yaml-cpp的使用方法。
1、yaml-cpp下载和编译
下载方式很简单,github找到yaml-cpp的repo(yaml-cpp)如下所示:
从上面下载zip包到电脑的文件夹下,并进行解压:
打开已安装的cmake界面,配置源码位置和编译结果路径,记得要把YAML_BUILD_SHARED_LIBS勾选上,否则后面在自己项目中使用yaml-cpp的时候会出现库缺失的情况。然后直接点击Configure和Generate,不出意外是可以直接生成成功的。
接着点击cmake-gui上面的open Project直接使用visual studio 2019打开yaml-cpp的源码项目。如果你希望你的lib和dll在Debug/x64下使用,那就配置整个工程的环境为Debug\x64,然后对整个项目重新生成,即可在你的yaml-cpp-master/build/下面生成相对应的lib和dll文件,如下所示:
以上就是整个yaml-cpp的编译的编译过程。
2、实际项目使用
新建工程cpp-demo,并添加相应的库目录、包含目录、以及链接库名称,具体操作如下所示:
- 添加相应附加包含目录:
- 添加相应的附加库目录
- 添加链接器
以读取如下文件为例:
flag: 1
mode: p
L_top_x: 776
L_top_y: 529
R_top_x: 800
R_top_y: 532
R_bottom_x: 1786
R_bottom_y: 952
L_bottom_x: 752
L_bottom_y: 1008
data_path: ./config/detect/1.jpg
save_filepath: ./config/mmdet
需要引入的主要库为:
#include"yaml-cpp/yaml.h"
主要的实现代码如下所示:
#include<iostream>
#include"yaml-cpp/yaml.h"
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
std::string yaml_path = "D:/personal/personal/c++/yolo_detect/Config_yolo.yaml";
YAML::Node config = YAML::LoadFile(yaml_path);
int flag = config["flag"].as<int>();
cout << "flag = " << flag << endl;
std::string mode = config["mode"].as<string>();
cout << "mode = " << mode << endl;
std::vector<Point2d> rect;
rect.emplace_back(Point2d(config["L_top_x"].as<double>(), config["L_top_y"].as<double>()));
rect.emplace_back(Point2d(config["R_top_x"].as<double>(), config["R_top_y"].as<double>()));
rect.emplace_back(Point2d(config["R_bottom_x"].as<double>(), config["R_bottom_y"].as<double>()));
rect.emplace_back(Point2d(config["L_bottom_x"].as<double>(), config["L_bottom_y"].as<double>()));
for (int i = 0; i < rect.size(); i++)
{
cout <<"第"<<i+1<<"点: "<< rect[i].x << " " << rect[i].y << endl;
}
string video_path = config["data_path"].as<string>();
cout << "video_path = " << video_path << endl;
string save_path = config["save_filepath"].as<string>();
cout << "save_path = " << save_path << endl;
return 0;
}
运行结果如下所示:
3、踩过的坑
- 使用cmake-gui进行编译的时候,需要勾选YAML_BUILD_SHARED_LIBS,否则在运行demo项目会出现找不到dll的情况
- 如果出现找不到dll,还有一种可能是dll文件没有加入环境变量或者没有加入到exe运行环境。
参考:
https://blog.csdn.net/briblue/article/details/89515470
END