从OpenCV中的文件中读取算法参数

时间:2012-09-06 18:28:46

标签: c++ opencv

我正在尝试从XML文件中读取经过训练的Expectation Maximation模型的参数供以后使用。为了存储我调用的模型

cv::FileStorage fs("model.xml",cv::FileStorage::WRITE);
classifier.write(fs);  //classifier is of type cv::EM

这会创建包含模型数据的文件。这是文件的样子(从头开始的几行):

StatModel.EM 1
<_ type_id="opencv-matrix"> 3 3 d
1.2159868951764311e+01 0. 0. 0. 1.9776824566023249e-01 0. 0. 0.  .2204460492503131e-16     
<_ type_id="opencv-matrix"> 3 3 d
3.2869203526862529e+00 0. 0. 0. 1.1631692248472096e+00 0. 0. 0. 2.2204460492503131e-16     
<_ type_id="opencv-matrix"> 3 3 d
2.9815870012055705e+00 0. 0. 0. 6.5049770685681069e+03 0. 0. 0. 6.8510191786605528e+03 
<_ type_id="opencv-matrix"> 3 3 d 
4.6608996548002040e+00 0. 0. 0. 3.7558131457318683e+02 0. 0. 0. 2.2204460492503131e-16 

请注意,缺少XML标头。现在,为了读取我正在使用的数据

cv::FileStorage fs("model.xml",cv::FileStorage::READ);

必须使用filenode作为参数调用cv :: Algorithm :: read()函数。我不确定要使用哪个节点。因为我希望文件中只有一个节点我试过

classifier.read(fs[0]);

但之后没有训练算法。我需要做什么才能恢复原始参数?

3 个答案:

答案 0 :(得分:4)

我只是使用

        const FileStorage fs(filename, FileStorage::READ);
        EM model;
        if (fs.isOpened()) {
            const FileNode& fn = fs["StatModel.EM"];
            model.read(fn);
        } 

有效。

答案 1 :(得分:3)

相反,使用'write'可以做到:

fs<<"my_model"<<classifier;

然后在打开FileStorage进行阅读后,请按以下方式阅读:

cv::EM EModel;
fs["my_model"] >> EModel;

编辑:以上版本不适用于cv :: EM,因为它不包含在重载中。

This链接提供了一个关于如何在XML / YAML文件中编写和读取自定义类的非常好的示例。根据这个,你为你的类创建“写”和“读”方法,所以你是定义和命名节点的人。

如果您没有自己编写这些方法并且它们是cv :: Algorithm的一部分(可能这是新的,我在2.2中找不到它,我会使用),那么我建议检查xml文件查看已创建的节点的名称,然后使用&gt;&gt;获取它们操作员或做:

FileNode myFilenode = fs["node_name"];
classifier.read(myFilenode);

从您提供的StatModel.EM 1 <_ type_id="opencv-matrix">和链接中的xml示例,我猜这个节点的名称实际上是“_”(如果您在编写时没有提供任何名称,这可能是默认值它)

答案 2 :(得分:0)

替代语法是

    FileStorage fs(filename, FileStorage::READ);
    Mat mat;
    if (fs.isOpened()) {
        fs["mat_name"]>>mat;
    }
    fs.release();