1

我无法保存并将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): Missing , between the elemen ts) in unknown function, file ......\modules\core\src\persistence.cpp, line 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;
}

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

4

2 回答 2

0

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

于 2012-12-12T16:47:15.247 回答
0

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

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

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

在我看来,删除“:”时,存储到 YAML 也应该有效。

于 2013-04-27T11:58:51.647 回答