写和读opencv3.0 ml文件(随机森林)

Write and read opencv3.0 ml files(random forest)

本文关键字:随机 森林 文件 ml opencv3      更新时间:2023-10-16

我如何读取cv::FileStorage编写的opencv3.0 xml文件的数据,我使用与此[post][1]相同的解决方案,但无济于事。

错误信息是

"C:UsersyyyyQt3rdLibsopencvopencv-3.0.0sourcesmodulescoresrc persistent .cpp:739:错误:(-2)该节点既不是映射也不是函数cvGetFileNodeByName中的空集合"

代码:write

    auto rtrees = cv::ml::RTrees::create();
    rtrees->setMaxDepth(10);
    rtrees->setMinSampleCount(2);
    rtrees->setRegressionAccuracy(0);
    rtrees->setUseSurrogates(false);
    rtrees->setMaxCategories(16);
    rtrees->setPriors(cv::Mat());
    rtrees->setCalculateVarImportance(false);
    rtrees->setActiveVarCount(0);
    rtrees->setTermCriteria({cv::TermCriteria::MAX_ITER, 100, 0});
    rtrees->train(features_.reshape(1, labels_.size()),
                  cv::ml::ROW_SAMPLE, labels_);
    rtrees->write(cv::FileStorage("smoke_classifier.xml",
                                  cv::FileStorage::WRITE));

Codes : read
    using namespace cv::ml;    
    cv::FileStorage read("smoke_classifier.xml",
                         cv::FileStorage::READ);
    rtrees->read(read.getFirstTopLevelNode());

知道是怎么回事吗?如何从xml文件加载数据?由于

你应该使用:

rtrees->read(read.root());

测试代码

#include <opencv2opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
    {
        auto rtrees = cv::ml::RTrees::create();
        rtrees->setMaxDepth(10);
        rtrees->setMinSampleCount(2);
        rtrees->setRegressionAccuracy(0);
        rtrees->setUseSurrogates(false);
        rtrees->setMaxCategories(16);
        rtrees->setPriors(cv::Mat());
        rtrees->setCalculateVarImportance(false);
        rtrees->setActiveVarCount(0);
        rtrees->setTermCriteria({ cv::TermCriteria::MAX_ITER, 100, 0 });
        // Some dummy stuff here...
        Mat1f feat(1, 5, 0.f);
        Mat1f labels = (Mat1f(1, 5) << 1, 0, 1, 0, 1);
        rtrees->train(feat, cv::ml::ROW_SAMPLE, labels);
        rtrees->write(cv::FileStorage("smoke_classifier.xml",
            cv::FileStorage::WRITE));
    }
    {
        auto rtrees2 = cv::ml::RTrees::create();
        cv::FileStorage read("smoke_classifier.xml", cv::FileStorage::READ);
        rtrees2->read(read.root());
        int a = rtrees2->getMinSampleCount();
    }
    return 0;
}

使用StatModel类中的save()和load()函数通常是一个更安全的选择,可以正确地输入/输出机器学习模型中的所有信息。这也在samples/cpp/letter_recognition .cpp

中作为输入/输出示例给出。
model_trained->save(filename_model);
Ptr<RTrees> model_read = StatModel::load<RTrees>( filename_model );