从OpenCV FileNodeIterator保存/读取矩阵

时间:2012-12-12 15:37:05

标签: c++ opencv

我无法保存并阅读保存到我正在迭代的cv::Mat中的cv::FileNode。我可以使用

将矩阵写入文件
// Data to save
std::vector<cv::Mat> masks;
masks.push_back(cv::Mat::ones(3,3,CV_8UC1));
masks.push_back(cv::Mat::zeros(2,2,CV_8UC1));

// Open file for writing
cv::FileStorage fs(file, cv::FileStorage::WRITE);

// Create node
fs << "data" << "[";
for (size_t i=0; i<masks.size(); ++i)
{
    // Fill each node with data
    fs << "{:";
    // Write other data...
    fs << "mask" << masks.at(i);
    fs << "}";
}
fs << "]";

以这种方式编写文件不会导致任何问题。但是,随后打开此文件会导致出现未处理的异常:

  

读取OpenCV错误:解析错误(testPR.yml(7):缺少,介于两者之间   元素未知功能,文件   ...... \ modules \ core \ src \ persistence.cpp,第12行63

要读取矩阵,我尝试这样做:

// Open file for reading
cv::FileStorage fs(file, cv::FileStorage::READ);   ///< This causes an exception

// Open node
cv::FileNode d = fs["data"];
cv::FileNodeIterator it = d.begin(), it_end = d.end();

for( ; it!= it_end; ++it)
{
    // Read other data...
    cv::Mat mask;
    (*it)["mask"] >> mask;
}

当然可以用这种方式将矩阵保存/读取到节点,不是吗?

2 个答案:

答案 0 :(得分:0)

事实证明,解决这个问题的方法是将数据保存在.xml而不是.yml文件中,尽管我不知道为什么会这样。

答案 1 :(得分:0)

当我查看http://docs.opencv.org/modules/core/doc/xml_yaml_persistence.html

  

在YAML(但不是XML)中,映射和序列可以用类似Python的紧凑内联形式编写。在上面的示例中,矩阵元素以及每个特征(包括其lbp值)以这种内联形式存储。要以紧凑的形式存储映射/序列,请在开头字符后加上“:”,例如:使用“{:”而不是“{”和“[:”而不是“[”。当数据写入XML时,将忽略那些额外的“:”。

也许 {:不能在没有 [:的情况下使用,但我无法找到有关此功能的其他文档。但是关于将其存储在XML中的解决方案:额外的&#34;:&#34;被忽略......

从我的观点来看,在删除&#34;:&#34;时,存储到YAML也应该有效。