之前开始学opencv的时候就看到opencv里面有机器学习模块(machine learning,ML),但是一直以来跟着这么多书籍学习都没有发现有提及过(毕竟opencv是针对图像处理方面的,所以大部分书籍都以介绍图像处理方面的为主)。无意中,在《OpenCV和Visual Studio图像识别应用开发》一书中看到有ML模块的介绍,所以就打算写下这一篇学习笔记~
在opencv中,ML模块是一组统计分类、回归分析、数据聚类的类与统计模式函数。
下面直接给出基于opencv的ML库的SVM代码:
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\ml\ml.hpp>
using namespace cv;
int main()
{
//要呈现的数据.image是用来画图的
int width = 512, height = 512;
Mat image = Mat::zeros(width, height, CV_8UC3);//CV_[位数][带符号与否]C[通道数]
//直接使用Mat构造函数
/*Mat::Mat(Size size, int type, const Scalar& s)
创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s*/
//标签
float labels[4] = { 1.0,-1.0,-1.0,-1.0 };
Mat labelsMat(4, 1, CV_32FC1, labels);
//设置训练数据
float trainingData[4][2] = { {501,10},{255,10},{501,255},{10,501} };
Mat trainingDatMat(4, 2, CV_32FC1, trainingData);
//设置SVM参数
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
//训练SVM
CvSVM SVM;
SVM.train(trainingDatMat, labelsMat, Mat(), Mat(), params);
Vec3b green(0, 255, 0), blue(255, 0, 0);//opencv里面存储为BGR
//显示SVM的决定区
for (int i = 0;i < image.rows;++i)
{
for (int j = 0;j < image.rows;++j)
{
Mat sampleMat = (Mat_<float>(1, 2) << j, i);//构建一个Mat矩阵sampleMat,大小为1*2,元素为j和i的
float response = SVM.predict(sampleMat);//输入为预测的,输出为估计的
if (response == 1)
{
image.at<Vec3b>(i,j) = green;//当为1类时,绿色
}
else if (response == -1)
{
image.at<Vec3b>(i,j) = blue;//当为-1类时,绿色
}
}
}
//显示训练数据
int thickness = -1;
int lineType = 8;
circle(image, Point(501, 10), 5, Scalar(0, 0, 0), thickness, lineType);
circle(image, Point(255, 10), 5, Scalar(255, 255, 255), thickness, lineType);
circle(image, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);
circle(image, Point(10, 501), 5, Scalar(255, 255, 255), thickness, lineType);
//显示支持向量
thickness = 2;
lineType = 8;
int c = SVM.get_support_vector_count();
for (int i = 0;i < c;++i)
{
const float* v = SVM.get_support_vector(i);
circle(image, Point((int)v[0], (int)v[1]), 6, Scalar(128, 128, 128), thickness, lineType);
}
//显示结果
imshow("SVM结果", image);
waitKey(0);
}
结果如下图所示:
好~本博文就告一段落,接下来有新的体会会及时更新哈~