1. YAML 文件示例

创建一个 test.yaml 文件,内容如下:

%YAML:1.0

param_bool: 0
param_int: 42
param_float: 3.14
param_string: "hello"

2. c++ 使用 opencv 读取 YAML

2.1. 使用 cv::FileStorage 直接读取

创建 test.cpp 并输入以下内容

#include <cstdio>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main() {
    // 读取 YAML 文件
    FileStorage fs("test.yaml", FileStorage::READ);

    // 检查文件是否打开成功
    if (!fs.isOpened()) {
        fprintf(stderr, "Failed to open YAML file.\n");
        return -1;
    }

    // 定义参数变量
    bool   param_bool   = 1;
    int    param_int    = 0;
    float  param_float  = 0.0;
    string param_string = "test";

    // 如果参数名存在, 且值不为空才读取 YAML 给参数变量赋值
    if (!fs["param_bool"].isNone() && !fs["param_bool"].empty()) {
        fs["param_bool"] >> param_bool;
    }
    if (!fs["param_int"].isNone() && !fs["param_int"].empty()) {
        fs["param_int"] >> param_int;
    }
    if (!fs["param_float"].isNone() && !fs["param_float"].empty()) {
        fs["param_float"] >> param_float;
    }
    if (!fs["param_string"].isNone() && !fs["param_string"].empty()) {
        fs["param_string"] >> param_string;
    }

    // 输出参数设置
    printf("param_bool: %d \n", param_bool);
    printf("param_int: %d \n", param_int);
    printf("param_float: %f \n", param_float);
    printf("param_string: %s \n", param_string.c_str());

    // 关闭文件
    fs.release();

    return 0;
}

其运行输出如下

param_bool: 0
param_int: 42
param_float: 3.140000
param_string: hello

2.2. 使用 cv::FileNode 读取

2.1 中代码的给参数变量赋值部分还可以使用 cv::FileNode 方法

// 如果参数名存在, 且值不为空才给参数变量赋值
cv::FileNode node;
node = fs["param_bool"];
if (!node.isNone() && !node.empty()) {
    node >> param_bool;
}
node = fs["param_int"];
if (!node.isNone() && !node.empty()) {
    node >> param_int;
}
node = fs["param_float"];
if (!node.isNone() && !node.empty()) {
    node >> param_float;
}
node = fs["param_string"];
if (!node.isNone() && !node.empty()) {
    node >> param_string;
}

其运行输出如下,与第一种方法一致

param_bool: 0
param_int: 42
param_float: 3.140000
param_string: hello

2.3. CMakeLists.txt

上述代码所需的 CMakeLists.txt 如下:

cmake_minimum_required(VERSION 3.10)

project(test)

find_package(OpenCV REQUIRED)

add_executable(run test.cpp)

target_link_libraries(run ${OpenCV_LIBS})

3. YAML 的补充说明

cv::FileStorage 支持 YAML 1.0YAML 1.1 语法规范。
因此 YAML 文件中需要在首行定义 %YAML:1.0%YAML:1.1,否则将会报错。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐