目录
Opencv3 多分类
/*#include <opencv2\ml\ml.hpp>
using namespace cv;
*/
//训练需要用到的数据
float data[4][4] = {
{ 0.814973, 15.1147, 0.431797, 0.933121 },
{ 0.95266, 3.70758, 0.139839, 0.983595 },
{ 0.973312, 1.95185, 0.0861551, 0.991363 },
{ 0.922384, 6.42396, 0.211111, 0.971575 }
};
int label[4] = { 1, 2, 3, 4 };
//转为Mat以调用
Mat dataMat(4, 4, CV_32FC1, data);
Mat labelMat(4, 1, CV_32SC1, label);
//训练的初始化
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
//开始训练
svm->train(dataMat, ROW_SAMPLE, labelMat);
// save_model
svm->save("svm.xml");
/*
load_model
CvSVM svm;
*/
/*Ptr<SVM> svmtest = Algorithm::load<SVM>("svm.xml"); // SVM::load()是一个静态函数,不能单独用*/
svm->load("svm.xml");
Mat result;
float teatData[4] = { 0.814973, 15.1147, 0.431797, 0.933121 };
Mat query(1, 4, CV_32FC1, teatData);
svm->predict(query, result);
std::cout << "分类结果为:" << endl;
std::cout << result << endl;
int a = result.at<Point2f>(0, 0).x;
std::cout << a << endl;
训练和预测子函数封装(Opencv3)
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\ml\ml.hpp>
#include <iostream>
using namespace std;
using namespace cv;
using namespace cv::ml;
训练
// 训练与保存
/*
Mat train_mat = Mat::zeros(样本数, 特征向量长度, CV_32FC1);
Mat label_mat = Mat::zeros(样本数, 1, CV_32SC1);
//示例:
//训练需要用到的数据
float train_data[4][4] = { { 0.814973, 15.1147, 0.431797, 0.933121 }, { 0.95266, 3.70758, 0.139839, 0.983595 }, { 0.973312, 1.95185, 0.0861551, 0.991363 }, { 0.922384, 6.42396, 0.211111, 0.971575 } };
int labels[4] = { 1, 2, 3, 4 };
//转为Mat以调用
Mat train_Mat(4, 4, CV_32FC1, train_data);
Mat label_Mat(4, 1, CV_32SC1, labels);
train(train_Mat, label_Mat);
*/
void train(Mat train_mat, Mat label_mat)
{
// Mat train_mat = Mat::zeros(样本数, 特征向量长度, CV_32FC1);
// Mat label_mat = Mat::zeros(样本数, 1, CV_32SC1);
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
svm->train(train_mat, ROW_SAMPLE, label_mat);
svm->save("svm.xml");
cout << "训练结束" << endl;
}
预测
// 预测
/*
float teatData[2][4] = { { 0.814973, 15.1147, 0.431797, 0.933121 }, { 0.95266, 3.70758, 0.139839, 0.983595 } };
Mat query(2, 4, CV_32FC1, teatData);
Mat 结果 = class_fier.predict(query);
cout << 结果;
结果.at<Point2f>(0, 0).x;//第一个预测值
*/
Mat predict(Mat query)
{
// Mat query(样本数, 特征向量长度, CV_32FC1, teatData);
Ptr<SVM> svm = Algorithm::load<SVM>("svm.xml");
if (!svm.empty())
{
Mat result;
svm->predict(query, result);
// 多个样本的预测
for (size_t i = 0; i < result.rows; i++)
{
int a = result.at<Point2f>(i, 0).x;
std::cout << a << endl;
}
return result;
}
}