C++,OpenCV,如何将vector容器中的cv::Mat类型的矩阵,保存到本地文件?

C++,OpenCV,如何将vector容器中的一系列cv::Mat类型的3*3矩阵,保存到本地文件?
然后怎么把这些数据从文件读取到vector容器中?

将vector容器中的一系列cv::Mat类型的3*3矩阵保存到本地文件,可以使用OpenCV自带的文件存储类cv::FileStorage,具体步骤如下:

保存到文件:

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

int main() {
    std::vector<cv::Mat> mats_vec;  // 保存cv::Mat类型的vector容器
    // ... 在vector容器中添加cv::Mat类型的3*3矩阵 ...

    cv::FileStorage fs("mats.yml", cv::FileStorage::WRITE); // 打开文件存储类
    fs << "mats" << "[";  // 写入节点名

    for (const auto& mat : mats_vec) {  // 遍历vector容器
        fs << "{";
        fs << "mat" << mat;  // 将cv::Mat类型的3*3矩阵写入文件
        fs << "}";
    }

    fs << "]";  // 写入结束节点
    fs.release();  // 释放文件存储类资源

    return 0;
}


上述代码将vector容器中的每个cv::Mat类型的3*3矩阵写入到了名为"mats.yml"的文件中,节点名为"mats"。

从文件读取到vector容器中:

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

int main() {
    std::vector<cv::Mat> mats_vec;  // 保存cv::Mat类型的vector容器

    cv::FileStorage fs("mats.yml", cv::FileStorage::READ);  // 打开文件存储类
    cv::FileNode node = fs["mats"];  // 获取节点名为"mats"的节点
    if (node.type() != cv::FileNode::SEQ) {  // 判断节点类型是否为序列
        std::cerr << "ERROR: Mats node is not a sequence!\n";
        return 1;
    }

    for (const auto& mat_node : node) {  // 遍历节点序列
        cv::Mat mat;
        mat_node["mat"] >> mat;  // 从节点中读取cv::Mat类型的3*3矩阵
        mats_vec.push_back(mat);  // 将读取到的矩阵添加到vector容器中
    }

    fs.release();  // 释放文件存储类资源

    // ... 使用mats_vec容器中的数据 ...

    return 0;
}


上述代码从名为"mats.yml"的文件中读取了名为"mats"的节点,然后遍历节点序列,从每个节点中读取cv::Mat类型的3*3矩阵,最后将读取到的矩阵添加到vector容器中。

答案来自 https://www.wodianping.com/

要看你想写入到什么文件了,xml、yml、txt、csv等

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 请看👉 :[OpenCV][C++编程] cv::mat的定义与赋值
  • 除此之外, 这篇博客: [OpenCV][C++编程] cv::mat的定义与赋值中的 2.2在创建mat变量时赋值 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在采用构造方式创建变量时,直接附在最后一个变量。
    给矩阵中每个像素赋值的参数变量,例如Scalar(0, 0, 255)。_

    cv::Mat a(2, 2, CV_8UC3, cv::Scalar(0,0,255));//创建一个3通道矩阵,每个像素都是0,0,255
    cv::Mat a(2, 2, CV_8UC3, cv::Scalar(0,255));//创建一个2通道矩阵,每个像素都是0,255
    cv::Mat a(2, 2, CV_8UC1, cv::Scalar(255));//创建一个单通道矩阵,每个像素都是255
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^