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等
不知道你这个问题是否已经解决, 如果还没有解决的话:在采用构造方式创建变量时,直接附在最后一个变量。
给矩阵中每个像素赋值的参数变量,例如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