【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

old-src/stateEstimation.cpp: In member function 'void StateEstimation::loadSVMModel()':
old-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 old-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:
old-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;

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。