旧的C风格cvMat矩阵可以传递给cvSave()函数,以便于写入XML文件。此函数不接受新的C ++样式cv::Mat
和cv::Mat_
矩阵。
OpenCV参考有一个关于XML持久性的部分,但是这三个类(FileStorage,FileNode和FileNodeIterator)缺少任何描述或示例,我无法弄清楚如何从界面中使用它们。
感谢。
编辑:这实际上涉及 OpenCV 的新 C ++ 界面中的许多其他功能,从版本2.1 < / strong>即可。文档在某些地方非常差,函数参数不一致,并且用户组要么不知道,要么比回答问题有更好的事情要做。我将坚持使用旧的 C 界面一段时间。文件更好,更不用说O'Reilly的书。
答案 0 :(得分:15)
显然它在C ++风格上更容易,但正如你所说,没有任何容易获得的文档。
要在文件中编写cv::Mat
,只需创建一个FileStorage
变量,然后以您使用的样式cout
编写矩阵,以便在屏幕上打印。
cv::Mat someMatrix;
//you create and assign values to someMatrix however you plan to.
FileStorage fs("myFile.yml", FileStorage::WRITE);
fs << "name_to_identify_matrix_by" << someMatrix;
阅读也类似于cin风格,但是你更好地看看下面的链接以便更好地理解。在Data I / O部分的第2页,他们展示了如何使用XML / YAML的示例。
opencv C++ cheatsheet(different than cheatsheet in the documentation PDF)
答案 1 :(得分:9)
以上是正确的,但是备忘单没有显示的是你需要打开文件。这似乎是显而易见的,但我忽略了这样做,因为备忘单没有说我必须这样做。这里是允许您正确写入文件的代码
---------- code:
// write Mat objects to the freakin file
FileStorage fs("CamModel.yml", FileStorage::WRITE);
if (!fs.isOpened()){
fs.open("CamModel.yml", FileStorage::WRITE);
fs << "mtxCam" << cameraMatrix;
fs << "mtxDist" << distCoeffs;
fs.release();
}
// to test that it really worked, read the Mats back in
if (!fs.isOpened()){
fs.open("CamModel.yml", FileStorage::READ);
fs["mtxCam"] >> cameraMatrix;
fs["mtxDist"] >> distCoeffs;
fs.release();
}
没关系,这仍然无效。对不起浪费的帖子。