当前位置: 首页 > article >正文

C++ OpenCV中读取YAML文件的详解:定义、用途与实用示例

C++ OpenCV中读取YAML文件的详解:定义、用途与实用示例

在计算机视觉和图像处理领域,OpenCV(Open Source Computer Vision Library)是一个广泛使用的开源库。YAML(YAML Ain’t Markup Language)作为一种简洁且易于阅读的配置文件格式,在OpenCV中被广泛应用于存储和加载配置参数、校准数据、模型参数等。本文将详细解释在C++中如何使用OpenCV读取YAML文件,涵盖其定义、用途、使用方法以及实际示例。

目录
  1. YAML简介
  2. OpenCV中的YAML文件
  3. 使用OpenCV读取YAML文件的方法
  4. 示例解析
  5. 常见应用场景
  6. 编程规范与注意事项
  7. 总结

1. YAML简介
  • 定义:YAML是一种人类可读的数据序列化标准,常用于配置文件和数据交换。其语法简洁,支持复杂的数据结构,如映射(字典)、序列(列表)和标量(字符串、整数、浮点数等)。

  • 特点

    • 易读性高:结构清晰,缩进表示层级关系。
    • 支持多种数据类型:包括字符串、数值、布尔值、列表和字典等。
    • 灵活性强:可扩展,适用于多种应用场景。
2. OpenCV中的YAML文件

在OpenCV中,YAML文件常用于以下用途:

  • 配置参数存储:如相机内参、外参、图像处理参数等。
  • 模型参数保存:机器学习模型的权重和偏置等。
  • 校准数据记录:相机校准过程中得到的内外参数。

YAML文件的结构化特性使其成为存储和管理这些数据的理想选择。

3. 使用OpenCV读取YAML文件的方法

OpenCV提供了FileStorage类,用于读写XML、YAML和JSON格式的文件。以下是使用FileStorage读取YAML文件的基本步骤:

  1. 包含必要的头文件

    #include <opencv2/opencv.hpp>
    #include <iostream>
    
  2. 创建FileStorage对象并打开YAML文件

    cv::FileStorage fs("config.yaml", cv::FileStorage::READ);
    if (!fs.isOpened()) {
        std::cerr << "无法打开文件" << std::endl;
        return -1;
    }
    
  3. 读取数据

    • 标量值

      int width, height;
      fs["image_width"] >> width;
      fs["image_height"] >> height;
      
    • 矩阵

      cv::Mat cameraMatrix;
      fs["camera_matrix"] >> cameraMatrix;
      
    • 序列或映射

      cv::FileNode features = fs["features"];
      for (auto it = features.begin(); it != features.end(); ++it) {
          std::string feature = (std::string)*it;
          std::cout << feature << std::endl;
      }
      
  4. 关闭文件

    fs.release();
    
4. 示例解析

以下通过一个具体的示例,展示如何在C++中使用OpenCV读取YAML文件。

4.1 示例YAML文件 (config.yaml)
%YAML:1.0
---
image_width: 1920
image_height: 1080
camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 1000.0, 0.0, 960.0,
           0.0, 1000.0, 540.0,
           0.0, 0.0, 1.0 ]
distortion_coefficients: [0.1, -0.25, 0.001, 0.0005, 0.0]
features:
  - SIFT
  - SURF
  - ORB
4.2 示例代码 (read_yaml.cpp)
#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 打开YAML文件进行读取
    cv::FileStorage fs("config.yaml", cv::FileStorage::READ);
    if (!fs.isOpened()) {
        std::cerr << "无法打开文件: config.yaml" << std::endl;
        return -1;
    }

    // 读取标量值
    int image_width, image_height;
    fs["image_width"] >> image_width;
    fs["image_height"] >> image_height;
    std::cout << "图像宽度: " << image_width << std::endl;
    std::cout << "图像高度: " << image_height << std::endl;

    // 读取矩阵
    cv::Mat cameraMatrix;
    fs["camera_matrix"] >> cameraMatrix;
    std::cout << "相机矩阵: " << std::endl << cameraMatrix << std::endl;

    // 读取数组
    std::vector<double> distortion_coefficients;
    fs["distortion_coefficients"] >> distortion_coefficients;
    std::cout << "畸变系数: ";
    for (const auto& coeff : distortion_coefficients) {
        std::cout << coeff << " ";
    }
    std::cout << std::endl;

    // 读取序列
    cv::FileNode features = fs["features"];
    std::cout << "特征检测算法: ";
    for (auto it = features.begin(); it != features.end(); ++it) {
        std::string feature = (std::string)*it;
        std::cout << feature << " ";
    }
    std::cout << std::endl;

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

    return 0;
}
4.3 编译与运行

使用以下命令编译示例代码:

g++ read_yaml.cpp -o read_yaml `pkg-config --cflags --libs opencv4`

运行程序:

./read_yaml
4.4 输出结果
图像宽度: 1920
图像高度: 1080
相机矩阵: 
[1000, 0, 960;
 0, 1000, 540;
 0, 0, 1]
畸变系数: 0.1 -0.25 0.001 0.0005 0 
特征检测算法: SIFT SURF ORB 

解释

  1. 读取标量值image_widthimage_height被读取并输出。
  2. 读取矩阵camera_matrix作为一个3x3的矩阵被读取并打印。
  3. 读取数组distortion_coefficients被读取为一个双精度浮点数的向量并输出。
  4. 读取序列features作为一个字符串序列被读取并依次输出。
5. 常见应用场景
  • 相机校准:存储和加载相机的内参、外参和畸变系数。
  • 配置管理:管理图像处理算法的参数,如滤波器的大小、阈值等。
  • 模型参数保存:保存机器学习模型的权重和偏置,以便在不同环境中加载和使用。
  • 数据交换:在不同模块或程序之间交换配置和参数数据。
6. 编程规范与注意事项
  • 包含防护:确保YAML文件格式正确,避免语法错误。
  • 数据类型匹配:确保读取的数据类型与YAML文件中定义的类型一致,避免类型转换错误。
  • 错误处理:在读取过程中,检查文件是否成功打开,以及各个节点是否存在,避免程序崩溃。
    if (!fs["camera_matrix"].isNone()) {
        fs["camera_matrix"] >> cameraMatrix;
    } else {
        std::cerr << "camera_matrix不存在" << std::endl;
    }
    
  • 文件路径:使用相对路径或绝对路径时,确保文件路径正确,避免路径错误导致文件无法打开。
  • 释放资源:读取完毕后,及时释放FileStorage对象以释放资源。
7. 总结

在C++中,利用OpenCV的FileStorage类读取YAML文件是一种高效且便捷的方法,适用于各种配置和数据存储需求。YAML文件的结构化和可读性使其成为管理复杂数据的理想选择。通过本文的详细解释和示例,读者可以掌握在C++中使用OpenCV读取YAML文件的基本方法,并将其应用于实际项目中,从而提高代码的可维护性和灵活性。

掌握YAML文件的读取和写入,不仅有助于简化配置管理,还能在不同模块之间实现高效的数据交换,进而推动项目的模块化和可扩展性发展。


http://www.kler.cn/a/452594.html

相关文章:

  • outlook Synchronization problem conflict 同步问题
  • 模拟SpringIOCAOP
  • HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构
  • 【微服务】面试 7、幂等性
  • 高性能网络模式:Reactor 和 Proactor
  • 基类指针指向派生类对象,基类指针的首地址永远指向子类从基类继承的基类首地址
  • 函数式编程Lambda表达式
  • PyTorch model.train() 与 model.eval() 的区别及其源码解析:中英双语
  • PostgreSQL 的历史
  • 医疗平板与普通平板对比:优势尽显
  • 嵌入式学习-QT-Day10
  • 下载 AndroidStudio 旧版本方法
  • Max AI prompt1
  • RK356x bsp 5 - 海华AW-CM358SM Wi-Fi/Bt模组调试记录
  • 云手机群控能用来做什么?
  • 【HarmonyOS应用开发——ArkTS语言】购物商城的实现【合集】
  • 12-C语言单向链表
  • git 项目初始化
  • Linux运维常见命令
  • CE第三次作业
  • 挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存
  • 在算力魔方上运行Genesis:一款颠覆性开源生成式物理引擎!
  • 云途领航:现代应用架构助力企业转型新篇
  • 【区块链】深入理解椭圆曲线密码学(ECC)
  • SVM分类-支持向量机(Support Vector Machine)
  • 飞牛 fnos 使用docker部署 OneNav 书签管理器