由Opencv 机器学习部分在线文档

http://docs.opencv.org/modules/ml/doc/ml.html

得知,这些机器学习方法K-Nearest Neighbors等都继承于基类CvStatModel,此基类中有save,load等方法,http://wiki.opencv.org.cn/index.php/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B8%AD%E6%96%87%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C#CvStatModel 中文解释说save,load方法会调用write和read方法。

在早期opencv中,基类的load和save都是纯虚函数,即子类要加以实现。

class CvStatModel
{
public:
/* CvStatModel(); */
/* CvStatModel( const CvMat* train_data ... ); */
virtual ~CvStatModel();
virtual void clear()=0;
/* virtual bool train( const CvMat* train_data, [int tflag,] ..., const CvMat* responses, ...,
[const CvMat* var_idx,] ..., [const CvMat* sample_idx,] ...
[const CvMat* var_type,] ..., [const CvMat* missing_mask,] <misc_training_alg_params> ... )=0;
*/
/* virtual float predict( const CvMat* sample ... ) const=0; */
virtual void save( const char* filename, const char* name=0 )=0;
virtual void load( const char* filename, const char* name=0 )=0;
virtual void write( CvFileStorage* storage, const char* name )=0;
virtual void read( CvFileStorage* storage, CvFileNode* node )=0;
};

而后来opencv对此做了修改,修改成为了虚函数。如下:

class CV_EXPORTS_W CvStatModel
{
public:
CvStatModel();
virtual ~CvStatModel();
virtual void clear();
CV_WRAP virtual void save( const char* filename, const char* name=0 ) const;
CV_WRAP virtual void load( const char* filename, const char* name=0 );
virtual void write( CvFileStorage* storage, const char* name ) const;
virtual void read( CvFileStorage* storage, CvFileNode* node );
protected:
const char* default_model_name;
};

这个虚函数声明说明,任何继承自CvStatModel的类都可以调用save,load等。

但是在使用KNN时调用save会出错,我们查看ml.hpp 文件发现opencv中K-Nearest Neighbors没有实现load,save,write,read这些函数。如下:

// k Nearest Neighbors
class CV_EXPORTS_W CvKNearest : public CvStatModel
{
public:
CV_WRAP CvKNearest();
virtual ~CvKNearest();
CvKNearest( const CvMat* trainData, const CvMat* responses,
const CvMat* sampleIdx=0, bool isRegression=false, int max_k=32 );
virtual bool train( const CvMat* trainData, const CvMat* responses,
const CvMat* sampleIdx=0, bool is_regression=false,
int maxK=32, bool updateBase=false );
virtual float find_nearest( const CvMat* samples, int k, CV_OUT CvMat* results=0,
const float** neighbors=0, CV_OUT CvMat* neighborResponses=0, CV_OUT CvMat* dist=0 ) const;
CV_WRAP CvKNearest( const cv::Mat& trainData, const cv::Mat& responses,
const cv::Mat& sampleIdx=cv::Mat(), bool isRegression=false, int max_k=32 );
CV_WRAP virtual bool train( const cv::Mat& trainData, const cv::Mat& responses,
const cv::Mat& sampleIdx=cv::Mat(), bool isRegression=false,
int maxK=32, bool updateBase=false );
virtual float find_nearest( const cv::Mat& samples, int k, cv::Mat* results=0,
const float** neighbors=0, cv::Mat* neighborResponses=0,
cv::Mat* dist=0 ) const;
CV_WRAP virtual float find_nearest( const cv::Mat& samples, int k, CV_OUT cv::Mat& results,
CV_OUT cv::Mat& neighborResponses, CV_OUT cv::Mat& dists) const;
virtual void clear();
int get_max_k() const;
int get_var_count() const;
int get_sample_count() const;
bool is_regression() const;
virtual float write_results( int k, int k1, int start, int end,
const float* neighbor_responses, const float* dist, CvMat* _results,
CvMat* _neighbor_responses, CvMat* _dist, Cv32suf* sort_buf ) const;
virtual void find_neighbors_direct( const CvMat* _samples, int k, int start, int end,
float* neighbor_responses, const float** neighbors, float* dist ) const;
protected:
int max_k, var_count;
int total;
bool regression;
CvVectors* samples;
};

此时如果用KNN.save时会调用基类的虚函数,而我们无法知道基类的save是如何实现的。

而在可以保存的svm等方法中发现了,read和write的声明

// SVM model
class CV_EXPORTS_W CvSVM : public CvStatModel
{
public:
// SVM type
virtual void write( CvFileStorage* storage, const char* name ) const;
virtual void read( CvFileStorage* storage, CvFileNode* node );

我们这里省略了大部分,可猜测不同的方法保存是有差别的。

我们没有在KNN代码中找到任何实现write和read的函数,通过运行出错,我们理解为opencv并没有实现对knn的write,这是源于knn的特点的,knn所谓的train也是只是保存样本数据,没有生成分类的模型,这个train函数也不是严格意义的训练。

如果我们想保存这些样本数据,可以通过保存样本特征在文件中,一次读入,可以参考http://www.aishack.in/2010/10/k-nearest-neighbors-in-opencv/

opencv KNN 模型不能保存的问题相关推荐

  1. 运动目标的背景建模-混合高斯背景建模和KNN模型建模的OpenCV代码实现

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 运动检测通常用于分析视频序列中的移动目标,如车辆 ...

  2. 一步步教你轻松学KNN模型算法

    一步步教你轻松学KNN模型算法 ( 白宁超 2018年7月24日08:52:16 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解 ...

  3. KNN模型算法研究与案例分析

    KNN模型算法研究与案例分析( 白宁超 2018年8月29日15:39:13 ) 导读:机器学习算法中KNN属于比较简单的典型算法,既可以做聚类又可以做分类使用.本文通过一个模拟的实际案例进行讲解.整 ...

  4. 【数字图像处理3】(下) 使用Python+OpenCV+EDSR模型,实现超分辨率重建(SR)

    超分辨率重建(SR) Python+OpenCV+EDSR模型 文章目录 超分辨率重建(SR) Python+OpenCV+EDSR模型 注意 1.安装OpenCV contrib模块 2.contr ...

  5. 线性回归之模型的保存和加载

    线性回归之模型的保存和加载 1 sklearn模型的保存和加载API from sklearn.externals import joblib   [目前这行代码报错,直接写import joblib ...

  6. R语言构建xgboost模型:模型的保存(xgb.save)和加载(xgb.load)、或者保存为R二进制文件(xgb.save.raw R binary vector)

    R语言构建xgboost模型:模型的保存(xgb.save)和加载(xgb.load).或者保存为R二进制文件(xgb.save.raw,R binary vector) 目录

  7. R语言KNN模型数据分类实战

    R语言KNN模型数据分类实战 目录 R语言KNN模型数据分类实战 #KNN基本原理 #案例分析 ​#数据集说明

  8. 使用KNN模型进行多标签分类实战(Multilabel Classification)

    使用KNN模型进行多标签分类实战(Multilabel Classification) 详细的:二分类.多分类.多标签分类.多输出分类的概念参考笔者如下博文. 分类家族:二分类.多分类.多标签分类.多 ...

  9. 使用KNN模型进行多输出分类实战(Multioutput Classification)

    使用KNN模型进行多输出分类实战(Multioutput Classification) 详细的:二分类.多分类.多标签分类.多输出分类的概念参考笔者如下博文. 分类家族:二分类.多分类.多标签分类. ...

最新文章

  1. java虚拟机内存分为,深入理解Java虚拟机笔记(一)----内存划分
  2. Maven的安装文字版(Windows/Linux/Mac)
  3. (NO.00001)iOS游戏SpeedBoy Lite成形记(十)
  4. [树链剖分]List wants to travel,Relief grain,hotel加强版,This world need more Zhu
  5. [转]自然语言处理中的Attention Model:是什么及为什么
  6. 移动最小二乘_最小移动以形成弦
  7. 超极本认知六大误区详解:不只是轻薄+长续航
  8. ACL2021 知识图谱、推荐系统相关论文
  9. Communication System--ZOJ 1409
  10. Node.js 4.0 中的 ES 6 特性介绍
  11. python3 模板库 好用_关于3个Python模板库的比较
  12. oracle多关键字查询,Oracle多关键字查询
  13. Android开发从0到1学习(知识+路线)
  14. AUTOSAR中CAN通信协议栈概述
  15. 2021最新!某盘加速下载工具复活了,无需登录,打开即可高速下载(附下载)!
  16. python实战项目分析2—物流
  17. 黑苹果声卡驱动成功后声音出现卡顿的解决办法
  18. codebook算法(背景建模)的原理
  19. 怎么在html中设置天数倒计时,PPT里面怎样设置时间倒计时,求大佬指教?
  20. 从联想ThinkStation工作站,窥见工具文明的新纪元

热门文章

  1. 浅谈主动学习(Active Learning)
  2. 【LeetCode从零单排】No15 3Sum
  3. java 四种实现延迟加载的方法
  4. LESSON 11.4 原理进阶:AdaBoost算法流程详解
  5. 机器学习算法基础——决策树和随机深林
  6. 【学习心得】当程序员思路被打断
  7. 【功能升级】达摩盘3.0全新标签介绍前言
  8. RuoYi(分离版) 使用代码生成器添加子模块(idea版)
  9. Java8 - Future 接口
  10. Apache Kafka-消费端消费重试和死信队列