我无法保存并阅读保存到我正在迭代的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;
}
当然可以用这种方式将矩阵保存/读取到节点,不是吗?
答案 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也应该有效。