C++_2018-10-14_机器学习——SVM训练示例:分类

目录

简述

原理

代码 

结果

训练和预测子函数封装(Opencv3)

训练  

预测 

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;
	}		
}

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这个任务比较复杂,需要多个库和技术的支持。以下是一个简单的示例代码,用于图像采集、预处理和机器学习: ```C++ #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/ml.hpp> using namespace std; using namespace cv; using namespace cv::ml; int main() { // 1. 图像采集 VideoCapture cap(0); // 打开摄像头 if (!cap.isOpened()) { cerr << "Cannot open camera!" << endl; return -1; } Mat frame; cap >> frame; // 采集一帧图像 // 2. 图像预处理 Mat gray, binary; cvtColor(frame, gray, COLOR_BGR2GRAY); // 转为灰度图像 threshold(gray, binary, 128, 255, THRESH_BINARY); // 二值化 // 3. 机器学习 Ptr<SVM> svm = SVM::create(); // 创建SVM分类svm->setType(SVM::C_SVC); svm->setKernel(SVM::LINEAR); svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); // 定义训练数据和标签 Mat trainData = (Mat_<float>(4, 2) << 0, 0, 0, 1, 1, 0, 1, 1); Mat labels = (Mat_<int>(1, 4) << 0, 1, 1, 0); // 训练SVM分类svm->train(trainData, ROW_SAMPLE, labels); // 预测新数据 Mat test = (Mat_<float>(1, 2) << 0.5, 0.5); float result = svm->predict(test); cout << "Prediction result: " << result << endl; return 0; } ``` 在这个示例中,我们使用OpenCV库来采集摄像头图像,并对图像进行了简单的预处理。然后,我们使用OpenCV的机器学习模块来创建一个SVM分类器,并使用它来预测新的数据。请注意,这只是一个简单的示例代码,实际应用中,需要更多的预处理步骤和更复杂的机器学习模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值