c++ 用vector创建的二维数组怎么用cv::FileStorage进行保存
时间: 2024-05-02 12:17:16 浏览: 100
使用OpenCV的`FileStorage`类可以方便地将二维数组存储到文件中。下面是一个示例代码,展示如何使用`FileStorage`类将二维数组保存到文件中:
```c++
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
vector<vector<int>> arr2d = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
FileStorage fs("arr2d.yml", FileStorage::WRITE);
fs << "arr2d" << "[";
for (const auto& row : arr2d)
{
fs << "{";
for (const auto& element : row)
{
fs << element;
}
fs << "}";
}
fs << "]";
fs.release();
return 0;
}
```
在上述代码中,我们首先定义了一个二维数组`arr2d`,然后使用`FileStorage`类创建一个名为`arr2d.yml`的文件,并将二维数组写入该文件中。在写入过程中,我们首先使用`fs << "["`和`fs << "]"`分别将整个数组包围起来,然后使用`fs << "{"`和`fs << "}"`分别将每一行包围起来。最后,我们使用`fs << element`将每个元素写入文件中。请注意,我们使用了auto类型和范围for循环来遍历行和元素,这使得代码更加简洁和易于理解。
读取二维数组的代码如下:
```c++
vector<vector<int>> readArr2d(string filename)
{
vector<vector<int>> arr2d;
FileStorage fs(filename, FileStorage::READ);
if (!fs.isOpened())
{
cout << "Failed to open file" << endl;
return arr2d;
}
FileNode node = fs["arr2d"];
if (node.empty())
{
cout << "Failed to read node" << endl;
return arr2d;
}
for (FileNodeIterator it = node.begin(); it != node.end(); ++it)
{
vector<int> row;
for (FileNodeIterator it2 = (*it).begin(); it2 != (*it).end(); ++it2)
{
int element;
(*it2) >> element;
row.push_back(element);
}
arr2d.push_back(row);
}
return arr2d;
}
```
在上述代码中,我们首先定义了一个函数`readArr2d`,它接受一个文件名作为参数,并返回读取的二维数组。在函数内部,我们使用`FileStorage`类打开指定的文件,并读取名为`arr2d`的节点。然后,我们使用两个嵌套的循环遍历每一行和每个元素,并将它们存储在一个新的二维数组中。最后,我们返回该数组。
请注意,在上述代码中,我们使用了`FileNodeIterator`类来遍历节点。这是因为节点可以具有任意数量的子节点,因此我们需要一个迭代器来遍历它们。
阅读全文