【opencv基础】关于SVM中load函数的使用

前言

博主在交叉编译环境移植代码编译的过程中使用SVM出现错误,但是在通常使用的ubuntu系统程序是可以正常运行的,其中有关SVM的load函数的使用。

ubuntu code block

void StateEstimation::loadSVMModel(std::string svm_model_path)
{
    svm_model = cv::ml::SVM::load(svm_model_path.c_str());
    if(svm_model.empty())
    {
       std::cout << "SVM model load err." << std::endl;
    }
}

cross platform code block

void StateEstimation::loadSVMModel(std::string svm_model_path)
// void StateEstimation::loadSVMModel()
{
    // svm_model = cv::ml::SVM::load(svm_model_path.c_str());
    svm_model = cv::ml::SVM::load<cv::ml::SVM>(svm_model_path.c_str());  //OK.
    // svm_model = cv::ml::StatModel::load(svm_model_path);
    // svm_model = cv::ml::SVM::load<cv::ml::SVM>("../model/SVM_model.xml");  //OK.
    if(svm_model.empty())
    {
       std::cout << "SVM model load err." << std::endl;
    }
}

error

src/stateEstimation.cpp: In member function 'void StateEstimation::loadSVMModel()':
src/stateEstimation.cpp:47:49: error: no matching function for call to 'cv::ml::SVM::load(const string&)'
     svm_model = cv::ml::SVM::load(svm_model_path);
                                                 ^
In file included from /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/include/opencv2/opencv.hpp:46:0,
                 from include/stateEstimation.hpp:12,
                 from src/stateEstimation.cpp:12:
/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/include/opencv2/core.hpp:3027:44: note: candidate: template<class _Tp> static cv::Ptr<T> cv::Algorithm::load(const cv::String&, const cv::String&)
     template<typename _Tp> static Ptr<_Tp> load(const String& filename, const String& objname=String())
                                            ^
/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa9hf-neon-poky-linux-gnueabi/usr/include/opencv2/core.hpp:3027:44: note:   template argument deduction/substitution failed:
src/stateEstimation.cpp:47:49: note:   couldn't deduce template parameter '_Tp'
     svm_model = cv::ml::SVM::load(svm_model_path);

交叉编译环境中出错,最开始一直纠结在load的参数类型上,后来发现主要cv::ml::SVM是基于cv::Algorithm的,load函数的调用会有所不同。

cv::ml::SVM::load

static Ptr<SVM> cv::ml::SVM::load(const String& filepath)     

cv::Algorithm::load

 template<typename _Tp >
static Ptr<_Tp> cv::Algorithm::load(const String& filename, const String& objname = String())

调用实例如下

Ptr<SVM> svm = Algorithm::load<SVM>("my_svm_model.xml");

还需要注意的是不同版本对同一个功能的函数调用可能会不同。

参考

1. opencv_algorithm_load;

2. opencv_SVM_load;

posted on 2020-01-16 12:18  鹅要长大  阅读(2224)  评论(0编辑  收藏  举报

导航