【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   鹅要长大  阅读(2332)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示