基于支持向量机SVM的图像训练和识别
在其他地方看了很多关于支持向量机的介绍,很少有关于利用支持向量机进行图片识别训练的,最近在做这方面,把程序贴出来供大家一块学习讨论。训练的图片大小为50*50,50张图片,训练时间非常快,但是训练的图片太少。大部分解释在程序中已给出。#include<opencv2\features2d\features2d.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<cv.h>
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
/*Mat image1=imread("E:\\text/0.jpg",1);
Mat image2;
image1.copyTo(image2);
cvtColor(image1,image2,CV_BGR2GRAY);
Mat image3=image2.reshape(1,1);
normalize(image3.clone(), image3, 0, 1, NORM_MINMAX, CV_32FC1);
if(!image1.data)
{
cout<<"Do not find the picture"<<endl;
return 0;
}*/
//设置支持向量机的输入输出量,输入为图片,需要把二维图片转换为一维形式,输入的个数要与输出的个数相同。
char filename;
//向量机输出量
int labels;
//向量机输入,为50张图片
for(int i=0;i<50;i++)
{
labels=i/10;
//cout<<labels<<" "<<endl;
}
Mat labelsMat(50, 1,CV_32SC1, labels);
Mat trainingDataMat;
//读取图片,转换为灰度图,直方图均衡化,矩阵转换为向量,归一化,作为向量机的输入。
for( int i = 0; i < 50; i++){
sprintf(filename,"E:\\C++/Testpicture/%d.jpg", i);
Mat Img = imread(filename, 1);
Mat gray;
cvtColor(Img, gray,CV_RGB2GRAY);
equalizeHist(gray,gray); //直方图均衡化
Mat ss = gray.clone().reshape(1, 1); //把矩阵转换为向量
ss.clone().convertTo(ss, CV_32FC1);
normalize(ss.clone(), ss, 0, 1, NORM_MINMAX, CV_32FC1);
trainingDataMat.push_back(ss);
}
// 设置SVM参数
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;//C支持向量分类机,允许用异常值惩罚因子C进行不完全分类
params.kernel_type = CvSVM::LINEAR;//使用线性内核
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);//迭代训练过程的中止条件
// 对SVM进行训练
CvSVM SVM;
SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
//利用训练的向量机预测
Mat sampleMat=imread("E:\\C++/Testpicture/1.jpg",1);
cvtColor(sampleMat,sampleMat,CV_RGB2GRAY);
equalizeHist(sampleMat,sampleMat);
sampleMat=sampleMat.reshape(1,1);
normalize(sampleMat, sampleMat, 0, 1, NORM_MINMAX, CV_32FC1);
int result=SVM.predict(sampleMat);
////imshow("showimage",image3);
//cout<<trainingDataMat.cols<<endl<<trainingDataMat.rows;
//cout<<trainingDataMat;
cout<<"训练输出:"<<labelsMat<<endl;
cout<<"识别结果:"<<result<<endl;
system("pause");
waitKey(0);
}训练把50在图片分为5类,把第一类图片输入进行预测,输出为第一类:
赞一个,顺带把你的图像,放在百度网盘,共享一下子啊 Halcom 发表于 2016-11-1 22:29
赞一个,顺带把你的图像,放在百度网盘,共享一下子啊
链接:http://pan.baidu.com/s/1i4EPJU1 密码:sjnk
我有采集了,四个手势,200张训练图片,四十张测试图片 很有用,让我有了一点思路,谢谢楼主
页:
[1]