您当前的位置: 首页 >  opencv

wendy_ya

暂无认证

  • 1浏览

    0关注

    342博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

利用C++和OpenCV3设计支持向量机SVM分类器

wendy_ya 发布时间:2021-03-04 12:58:48 ,浏览量:1

目录
    • 一、代码示例
    • 二、SVM训练过程
      • 2.1 数据准备
      • 2.2 初始化SVM参数
      • 2.3 训练SVM
      • 2.4 保存数据
      • 2.5 加载保存的数据
      • 2.6 测试数据
    • 三、显示支持向量机分类区域
      • 3.1 初始化图像显示区域
      • 3.2 显示SVM决策区域
      • 3.3 显示训练数据
      • 3.4 显示支持向量
    • 四、输出结果

一、代码示例

话不多说,直接上代码:

#include 
#include 
#include
using namespace std;
using namespace cv;
using namespace cv::ml;
int main(int, char**)
{
	//视觉表示的数据
	int width = 512, height = 512;
	Mat image = Mat::zeros(height, width, CV_8UC3);
	//设置训练数据
	int labels[4] = { 1, -1, -1, -1 };
	float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };
	Mat trainingDataMat(4, 2, CV_32FC1, trainingData);
	Mat labelsMat(4, 1, CV_32SC1, labels);
	//训练SVM
	Ptr svm = SVM::create();//创建一个svm对象
	svm->setType(SVM::C_SVC); //设置SVM公式类型
	svm->setKernel(SVM::LINEAR);//设置SVM核函数类型
	svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));//设置SVM训练时迭代终止条件
	svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);//训练数据
	//显示SVM的决策区域
	Vec3b green(0, 255, 0), blue(255, 0, 0);
	for (int i = 0; i setKernel(SVM::LINEAR); ——设置SVM核函数类型,包括CUSTOM、LINEAR、POLY、RBF、SIGMOID、CHI2、INTER,默认值为RBF; 非线性分类中常见的核函数包括:齐次多项式、非齐次多项式、双曲正切、高斯核(Gaussiankernel)、线性核、径向基函数(radialbasis function, RBF)核和、Sigmoid核。

svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); ——设置SVM训练时迭代终止条件,默认值是cv::TermCriteria(cv::TermCriteria::MAX_ITER + TermCriteria::EPS,1000, FLT_EPSILON);

2.3 训练SVM

程序如下:

svm->train(trainingDataMat, ROW_SAMPLE, labelsMat);//训练数据
2.4 保存数据

当遇到较大数据量时,一般需要将数据保存为xml文件,以便在其他程序中得到调用。程序如下:

	//保存模型
	svm->save("svm.xml");
2.5 加载保存的数据

当需要加载2.4中保存的xml文件时,代码为:

Ptr svm = SVM::load("svm.xml");//加载svm对象
2.6 测试数据

测试数据代码如下:

int response = (int)svm->predict(p);

其中,p为CV_32FC1类型数据,response输出SVM预测的数据类型。

三、显示支持向量机分类区域

本例中,由于数据量较小,因此我们可以显示SVM的决策区域,以便更好地了解SVM算法的实现过程。主要步骤如下:

3.1 初始化图像显示区域
//视觉表示的数据
int width = 512, height = 512;
Mat image = Mat::zeros(height, width, CV_8UC3);

将图像显示区域设置为512*512像素大小。

3.2 显示SVM决策区域
//显示SVM的决策区域
	Vec3b green(0, 255, 0), blue(255, 0, 0);
	for (int i = 0; i             
关注
打赏
1659256378
查看更多评论
0.0418s