opencv的ml模块包含opencv机器学习K均值,K近邻,贝叶斯,随机森林,SVM等各种机器学习的算法
本文只简单介绍使用过程
创建训练集
samples,方法多种,同时建立训练集对应的标签labels(responses:响应矩阵)
sample和labels为Mat数据类型
建立模型:
cv::Ptrml::type model=type::create()
参数设置:
。。。。。。(每种模型有其各自的特点)
加载训练集合
CV_WRAP static Ptr<TrainData> create(InputArray samples, int layout, InputArray responses,
InputArray varIdx=noArray(), InputArray sampleIdx=noArray(),
InputArray sampleWeights=noArray(), InputArray varType=noArray());
samples:训练集需要是CV_32F类型(创建的原始数据一般是uchar类型,此时需要进行类型转换,
void GpuMat::**convertTo**(OutputArray dst, int rtype, double alpha, double beta) const)
layout:两种取值1、ROW_SAMPLE一行为一个样本
2、COL_SAMPLE一列为一个样本
response:响应矩阵(或labels:标签)对应样本排列方式,如果ROW_SAMPLE则为一列的矩阵;如果COL_SAMPLE则为一行,同时它应该是CV_32F
varIdx:
sampleIdx:
sampleWeights:权重向量,每个样本的权重
varType:
cv::Ptrml::TrainData tadata=ml::TrainData::create(samples,ml::ROW_SAMPLE, labls);
训练模型
template<typename _Tp> static Ptr<_Tp> train(const Ptr<TrainData>& data, int flags=0)
data:类型为Ptr<TrainData>的数据
flag构建模型的方法标志
model->train(tdata);
保存训练结果
CV_WRAP virtual void save(const String& filename) const;
model->save("***.yml");//也可以是xml文件等等
加载训练模型
template<typename _Tp> static Ptr<_Tp> load(const String& filename, const String& objname=String())
filename:文件名
objname:可选择的要读取节点名称
cv::Ptr<type> model_SVM = Algorithm::load<type>("***.yml");
预测结果
virtual float predict( InputArray samples, OutputArray results=noArray(), int flags=0 ) const = 0;
samples:输入数据矩阵
results:预测结果输出矩阵
flag:模型方法标志,取决于具体模型(是否使用新数据对模型进行更新)