OpenCV 与 SVM
一、SVM概述
支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来分类及回归分析。同样地,在OpenCV中已经有相关的库函数CvSVM实现了。一如既往地,我们不详细介绍SVM的算法原理,只是简单地介绍OpenCV是如何调用SVM的。本文参考:http://blog.csdn.net/qq_15947787/article/details/51375349
如果想要详细了解SVM的算法原理及证明过程,推荐以下参考网址:http://www.dataguru.cn/thread-371987-1-1.html 和 http://blog.csdn.net/alvine008/article/details/9097105
二、 设置参数及初始化
CvSVMParams
params;
params.svm_type
= CvSVM
::C_SVC;
params.kernel_type
= CvSVM
::LINEAR;
params.term_crit
= cvTermCriteria(CV_TERMCRIT_ITER,
100,
1e-6);
CvSVM SVM;
SVM
.train(trainingDataMat, labelsMat, Mat(), Mat(),
params);
三、 预测数据标签
int width =
512, height =
512;
Mat
image = Mat::zeros(height, width, CV_8UC3);
Vec3b green(
0,
255,
0), blue(
255,
0,
0);
for(
int i =
0; i<
image.rows; i++)
{
for(
int j=
0; j<
image.cols; j++)
{
Mat sampleMat = (Mat_<
float>(
1,
2) << i, j);
float response = SVM.predict(sampleMat);
if(response ==
1)
image.at<Vec3b>(j,i) = green;
else if(response == -
1)
image.at<Vec3b>(j,i) = blue;
}
四、 完整的示例代码及结果显示:
#include
"stdafx.h"
#include <fstream>
#include <iostream>
#include <opencv2/opencv.hpp>
using
namespace std;
using
namespace cv;
#define COUNT
21
int main()
{
float data[COUNT][
2] = {
0 };
ifstream in1(
"data.txt");
for (
int i =
0; i < COUNT; i++)
{
in1 >> data[i][
0];
in1 >> data[i][
1];
}
in1.close();
float label[COUNT] = {
0 };
ifstream in2(
"label.txt");
for (
int i =
0; i < COUNT; i++)
{
in2 >> label[i];
}
in2.close();
Mat trainData(COUNT,
2, CV_32FC1, data);
Mat trainLabel(COUNT,
1, CV_32FC1, label);
CvSVM svm;
CvSVMParams param;
param.svm_type = CvSVM::C_SVC;
param.kernel_type = CvSVM::LINEAR;
param.term_crit = cvTermCriteria(CV_TERMCRIT_ITER,
100,
1e-6);
svm.train(trainData, trainLabel, Mat(), Mat(), param);
Vec3b green(
0,
255,
0), blue(
255,
0,
0), red(
0,
0,
255), gray(
125,
125,
125);
Mat
image = Mat::zeros(
500,
500, CV_8UC3);
for (
int i =
0; i <
image.cols; i++)
{
for (
int j =
0; j <
image.rows; j++)
{
Mat sampleMat = (Mat_<
float>(
1,
2) << i,j);
float response = svm.predict(sampleMat);
if (response ==
3)
image.at<Vec3b>(j,i) = green;
if (response ==
2)
image.at<Vec3b>(j, i) = gray;
if (response ==
1)
image.at<Vec3b>(j, i) = blue;
if (response ==
0)
image.at<Vec3b>(j, i) = red;
}
}
for (
int i =
0; i < COUNT; i++)
{
Point p(data[i][
0], data[i][
1]);
if (label[i] ==
0)
circle(
image, p,
3, Scalar(
255,
255,
0), -
1,
8);
if (label[i] ==
1)
circle(
image, p,
3, Scalar(
255,
0,
255), -
1,
8);
if (label[i] ==
2)
circle(
image, p,
3, Scalar(
0,
255,
255), -
1,
8);
if (label[i] ==
3)
circle(
image, p,
3, Scalar(
0,
0,
0), -
1,
8);
}
imshow(
"result",
image);
imwrite(
"output.jpg",
image);
waitKey(
0);
return 0;
}
data
100 250
250 450
150 160
300 420
210 120
90 20
70 60
330 210
80 200
400 120
420 200
300 300
50 130
270 300
320 310
490 450
480 480
420 400
250 250
230 270
400 300
label
0
1
0
2
0
0
0
1
0
3
3
1
0
1
1
2
2
2
0
0
2
图片结果:
转载请注明原文地址: https://ju.6miu.com/read-39330.html