如何在OpenCV中保存和读取XML中的新C++样式矩阵对象?

neu*_*rte 13 xml opencv matrix

可以将旧的C风格cvMat矩阵传递给cvSave()函数,以便轻松写入XML文件.此函数不接受新的C++样式cv::Matcv::Mat_矩阵.

OpenCV参考有一个关于XML持久性的部分,但是这三个类(FileStorage,FileNode和FileNodeIterator)缺少任何描述或示例,我无法弄清楚如何从界面中使用它们.

谢谢.

编辑:这其实涉及很多其他的功能,在新的C++接口的OpenCV,为2.1版本.文档在某些地方非常差,函数参数不一致,并且用户组要么不知道,要么比回答问题有更好的事情要做.我将坚持使用旧的C接口一段时间.文件更好,更不用说O'Reilly的书了.

小智 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;
Run Code Online (Sandbox Code Playgroud)

阅读也类似于cin风格,但是你可以更好地看看下面的链接,以便更好地理解.在数据I/O部分的第2页,他们展示了如何使用XML/YAML的示例.

opencv C++ cheatsheet(与文档PDF中的cheatsheet不同)


Not*_*yne 9

以上是正确的,但是cheatsheet没有显示的是你需要打开文件.这似乎是显而易见的,但我忽略了这样做,因为备忘单没有说我必须这样做.这是允许您正确写入文件的代码

----------代码:

// 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();
}
Run Code Online (Sandbox Code Playgroud)

没关系,这仍然行不通.对不起浪费的帖子.