2015-08-01 6 views
2

Как coulod я прочитал данные xml-файлов opencv3.0, написанные cv :: FileStorage, я использую то же решение из этого [post] [1], но нет.Запись и чтение файлов opencv3.0 мл (случайный лес)

Сообщения об ошибках

«C: \ Users \ гггг \ Qt \ 3rdLibs \ OpenCV \ OpenCV-3.0.0 \ Sources \ модули \ ядро ​​\ SRC \ persistence.cpp: 739: ошибка: (- 2) узел не является ни карта, ни пустой коллекции в функции 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 Благодаря

ответ

2

Вы должны использовать:

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; 
} 
+0

Я попробовал, это крах (даже абсолютный путь) – StereoMatching

+0

@StereoMatching это работает для меня .. Я обновил код сниппет. Получите точную ошибку с помощью getFirstTopLevelNode() – Miki

+0

@StereoMatching обратите внимание, что если вы используете int или floats, вы переключаетесь между классификацией и регрессией. Убедитесь, что файл xml отличается. – Miki

0

Использование сохранения() и нагрузки() функции из класса StatModel в общем более безопасный вариант, чтобы должным образом I/O все информация в модели машинного обучения. Это также приводится в качестве устройства ввода/вывода, например, в образцах/CPP/letter_recog.cpp

model_trained->save(filename_model); 

Ptr<RTrees> model_read = StatModel::load<RTrees>(filename_model); 
Смежные вопросы