Hello Mat

 找回密码
 立即注册
查看: 9213|回复: 3

基于支持向量机SVM的图像训练和识别

  [复制链接]

10

主题

15

帖子

0

金钱

新手上路

Rank: 1

积分
15
发表于 2016-10-31 10:53:56 | 显示全部楼层 |阅读模式
在其他地方看了很多关于支持向量机的介绍,很少有关于利用支持向量机进行图片识别训练的,最近在做这方面,把程序贴出来供大家一块学习讨论。训练的图片大小为50*50,50张图片,训练时间非常快,但是训练的图片太少。大部分解释在程序中已给出。
  1. #include<opencv2\features2d\features2d.hpp>
  2. #include<opencv2\core\core.hpp>
  3. #include<opencv2\highgui\highgui.hpp>
  4. #include<cv.h>
  5. #include<opencv.hpp>
  6. #include<iostream>

  7. using namespace std;
  8. using namespace cv;

  9. int main()
  10. {
  11.         /*Mat image1=imread("E:\\text/0.jpg",1);
  12.         Mat image2;
  13.         image1.copyTo(image2);

  14.         cvtColor(image1,image2,CV_BGR2GRAY);
  15.         Mat image3=image2.reshape(1,1);
  16.         normalize(image3.clone(), image3, 0, 1, NORM_MINMAX, CV_32FC1);
  17.         if(!image1.data)
  18.         {
  19.                 cout<<"Do not find the picture"<<endl;
  20.                 return 0;
  21.         }*/

  22.         //设置支持向量机的输入输出量,输入为图片,需要把二维图片转换为一维形式,输入的个数要与输出的个数相同。
  23.         char filename[100];
  24.         //向量机输出量
  25.         int labels[50];
  26.         //向量机输入,为50张图片
  27.         for(int i=0;i<50;i++)
  28.         {
  29.                 labels[i]=i/10;
  30.                 //cout<<labels[i]<<" "<<endl;
  31.         }
  32.         
  33.         Mat labelsMat(50, 1,CV_32SC1, labels);
  34.         Mat trainingDataMat;
  35.         //读取图片,转换为灰度图,直方图均衡化,矩阵转换为向量,归一化,作为向量机的输入。
  36.         for( int i = 0; i < 50; i++){
  37.                sprintf(filename,"E:\\C++/Testpicture/%d.jpg", i);
  38.                Mat Img = imread(filename, 1);

  39.                Mat gray;
  40.                cvtColor(Img, gray,CV_RGB2GRAY);
  41.                equalizeHist(gray,gray);      //直方图均衡化
  42.                Mat ss = gray.clone().reshape(1, 1);   //把矩阵转换为向量
  43.                ss.clone().convertTo(ss, CV_32FC1);
  44.                normalize(ss.clone(), ss, 0, 1, NORM_MINMAX, CV_32FC1);
  45.                trainingDataMat.push_back(ss);

  46.     }

  47.         // 设置SVM参数
  48.     CvSVMParams params;
  49.     params.svm_type    = CvSVM::C_SVC;//C支持向量分类机,允许用异常值惩罚因子C进行不完全分类
  50.     params.kernel_type = CvSVM::LINEAR;//使用线性内核
  51.     params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);//迭代训练过程的中止条件
  52.     // 对SVM进行训练
  53.     CvSVM SVM;
  54.     SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
  55.         
  56.         //利用训练的向量机预测
  57.         Mat sampleMat=imread("E:\\C++/Testpicture/1.jpg",1);
  58.         cvtColor(sampleMat,sampleMat,CV_RGB2GRAY);
  59.         equalizeHist(sampleMat,sampleMat);
  60.         sampleMat=sampleMat.reshape(1,1);
  61.         normalize(sampleMat, sampleMat, 0, 1, NORM_MINMAX, CV_32FC1);
  62.         int result=SVM.predict(sampleMat);

  63.         ////imshow("showimage",image3);
  64.         //cout<<trainingDataMat.cols<<endl<<trainingDataMat.rows;
  65.         //cout<<trainingDataMat;
  66.         cout<<"训练输出:"<<labelsMat<<endl;
  67.         cout<<"识别结果:"<<result<<endl;
  68.         system("pause");
  69.         waitKey(0);
  70. }
复制代码
训练把50在图片分为5类,把第一类图片输入进行预测,输出为第一类:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2016-11-1 22:29:27 | 显示全部楼层
赞一个,顺带把你的图像,放在百度网盘,共享一下子啊
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

10

主题

15

帖子

0

金钱

新手上路

Rank: 1

积分
15
 楼主| 发表于 2016-11-3 09:14:27 | 显示全部楼层
Halcom 发表于 2016-11-1 22:29
赞一个,顺带把你的图像,放在百度网盘,共享一下子啊

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

使用道具 举报

0

主题

16

帖子

1

金钱

新手上路

Rank: 1

积分
8
发表于 2020-8-21 22:30:37 | 显示全部楼层
很有用,让我有了一点思路,谢谢楼主
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-25 08:22 , Processed in 0.223926 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表