c++ - 写入和读取opencv3.0 ml文件(随机森林)

标签 c++ opencv

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

错误信息是

"C:\Users\yyyy\Qt\3rdLibs\opencv\opencv-3.0.0\sources\modules\core\src\persistence.cpp:739: error: (-2) 节点既不是 map 也不是函数 cvGetFileNodeByName 中的一个空集合”

代码:写

    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 <opencv2\opencv.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;
}

关于c++ - 写入和读取opencv3.0 ml文件(随机森林),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31760824/

相关文章:

opencv - opencv如何在高斯混合中存储矩阵值?按什么顺序?

c++ - 从 MATLAB 运行多进程应用程序

c++ - 如何编写 C 或 C++ 程序来充当内存和 CPU 周期填充器?

c++ - 栈内存分配

c++ - to_string 函数追加零

android - 如何使用 JNI+OpenCV+NDK 获取原始的 android 相机传感器图像数据?

c++ - 根据 Rcpp.h 为自定义类扩展 Rcpp::as

python - 使用根多项式回归的颜色检查器进行的颜色校准未提供正确的结果

opencv - 为什么在 OpenCV 3.x 中有一个 opencv2 文件夹?

opencv - cvBlobsLib 查找重叠的 blob