doublebin 发表于 2016-10-31 10:53:56

基于支持向量机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:27

赞一个,顺带把你的图像,放在百度网盘,共享一下子啊

doublebin 发表于 2016-11-3 09:14:27

Halcom 发表于 2016-11-1 22:29
赞一个,顺带把你的图像,放在百度网盘,共享一下子啊

链接:http://pan.baidu.com/s/1i4EPJU1 密码:sjnk
我有采集了,四个手势,200张训练图片,四十张测试图片

LJN 发表于 2020-8-21 22:30:37

很有用,让我有了一点思路,谢谢楼主
页: [1]
查看完整版本: 基于支持向量机SVM的图像训练和识别