上一篇介绍了OPENCV中SVM的简单使用,以及自带的一个二分类问题。

  例子中的标签是程序手动写的,输入也是手动加的二维坐标点。  

  对于复杂问题就必须使用数据集中的图片进行训练,标签使用TXT文件或程序设置好,下面以 IMM Face Database 中的人脸数据作为示例,

实现人脸的HOG特征提取及SVM识别人脸。

  数据集参考我的http://www.cnblogs.com/chenzhefan/p/7624811.html;只选取其中5类人,每类5副图片作为训练。

  提取人脸HOG特征的维数为1764,具体见代码设置。

 void HogSVM()
{
int ImgWidht = ;
int ImgHeight = ;
vector<string> img_path;
vector<int> img_catg;
int nLine = ;
string buf;
ifstream svm_data("E:\\vswork\\car3\\train\\train.txt");
unsigned long n; for (int catg = ; catg < ; catg++)
{
for (int num = ; num < ; num++)
{
if (getline(svm_data, buf))
{
img_catg.push_back(catg);//图像类别
img_path.push_back(buf);//图像路径
nLine++;
}
} } svm_data.close();//关闭文件 Mat data_mat, res_mat;
int nImgNum = nLine; //读入样本数量
//样本矩阵,nImgNum:行数代表样本的数量,每一行就是由一张图片计算得到HOG的特征向量,
data_mat = Mat::zeros(nImgNum, , CV_32FC1);
res_mat = Mat::zeros(nImgNum, , CV_32FC1); Mat src;
Mat trainImg = Mat::zeros(ImgHeight, ImgWidht, CV_8UC3);//需要分析的图片 for (string::size_type i = ; i != img_path.size(); i++)
{
src = imread(img_path[i].c_str(), ); cout << " processing " << img_path[i].c_str() << endl; resize(src, trainImg, cv::Size(ImgWidht, ImgHeight), , , INTER_CUBIC);
HOGDescriptor *hog = new HOGDescriptor(cvSize(ImgWidht, ImgHeight), cvSize(, ), cvSize(, ), cvSize(, ), ); //构造HOG,具体意思见参考文章1,2
vector<float>descriptors;//结果数组
hog->compute(trainImg, descriptors, Size(, ), Size(, )); //调用计算函数开始计算
if (i == )
{
data_mat = Mat::zeros(nImgNum, descriptors.size(), CV_32FC1); //根据输入图片大小进行分配空间
}
cout << "HOG dims: " << descriptors.size() << endl;
n = ;
for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
{
data_mat.at<float>(i, n) = *iter;
n++;
}
res_mat.at<float>(i, ) = img_catg[i];
cout << " end processing " << img_path[i].c_str() << " " << img_catg[i] << endl;
} CvSVM svm;
CvSVMParams param;
CvTermCriteria criteria;
criteria = cvTermCriteria(CV_TERMCRIT_EPS, , FLT_EPSILON);
param = CvSVMParams(CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria); svm.train(data_mat, res_mat, Mat(), Mat(), param);
svm.save("SVM_DATA.xml"); return;
}

上述函数主要完成提取训练图片的HOG特征,并用SVM训练模型,保存为XML文件方便快速使用。

训练结果如图:

训练完成后即可以使用测试图片进行图片识别了:

 void HogSVMPre()
{
//检测样本
vector<string> img_tst_path;
string buf;
unsigned long n;
int ImgWidht = ;
int ImgHeight = ;
Mat TestImg = Mat::zeros(ImgHeight, ImgWidht, CV_8UC3);
ifstream img_tst("E:\\vswork\\car3\\val\\val.txt");
while (img_tst)
{
if (getline(img_tst, buf))
{
img_tst_path.push_back(buf);
}
}
img_tst.close();
CvSVM svm;
svm.load("SVM_DATA.xml");
Mat test;
char line[];
ofstream predict_txt("SVM_PREDICT.txt");
for (string::size_type j = ; j != img_tst_path.size(); j++)
{
test = imread(img_tst_path[j].c_str(), );//读入图像
resize(test, TestImg, cv::Size(ImgWidht, ImgHeight), , , INTER_CUBIC);//要搞成同样的大小才可以检测到
HOGDescriptor *hog = new HOGDescriptor(cvSize(ImgWidht, ImgHeight), cvSize(, ), cvSize(, ), cvSize(, ), ); //窗口大小,块大小,块滑动增量,cell的大小,bins的个数
vector<float>descriptors;//结果数组
hog->compute(TestImg, descriptors, Size(, ), Size(, )); //调用计算函数开始计算
cout << "The Detection Result:" << endl;
cout << "HOG dims: " << descriptors.size() << endl;
Mat SVMtrainMat = Mat::zeros(, descriptors.size(), CV_32FC1);
n = ;
for (vector<float>::iterator iter = descriptors.begin(); iter != descriptors.end(); iter++)
{
SVMtrainMat.at<float>(, n) = *iter;
n++;
} int ret = svm.predict(SVMtrainMat);
std::sprintf(line, "%s %d\r\n", img_tst_path[j].c_str(), ret);
printf("%s %d\r\n", img_tst_path[j].c_str(), ret);//输出预测的结果,ret的值就代表类别
//getchar();
predict_txt << line;
}
predict_txt.close();
system("PAUSE");
return;
}

预测结果:

小样本图片SVM的识别结果还是很不错的。本文的测试图片较少,也不能说明模型到底有多好,但基于opencv SVM的识别分类流程基本是这样了。

有问题欢迎讨论~

opencv SVM多分类 人脸识别的更多相关文章

  1. OpenCV学习 物体检测 人脸识别 填充颜色

    介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...

  2. python与opencv的结合之人脸识别值

    首先还是要感谢http://www.jb51.net/article/67392.htm这位大神的无私奉献,开源的代码,让我省去了很多事,但是就光系统环境的配置就花去了我将近一个星期的时间,真是不容易 ...

  3. 使用OpenCV和Python进行人脸识别

    介绍 人脸识别是什么?或识别是什么?当你看到一个苹果时,你的大脑会立刻告诉你这是一个苹果.在这个过程中,你的大脑告诉你这是一个苹果水果,用简单的语言来说就是识别.那么什么是人脸识别呢?我肯定你猜对了. ...

  4. 利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别

    用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077. ...

  5. opencv+python3.4的人脸识别----2017-7-19

    opencv3.1  +  python3.4 第一回合(抄代码,可实现):人脸识别涉及一个级联表,目前能力还无法理解. 流程:1.读取图像---2.转换为灰度图---3.创建级联表---4.对灰度图 ...

  6. java+opencv+intellij idea实现人脸识别

    首先当然是需要安装opencv了,我用的是opencv2.4.13.下载完之后就可以直接安装了,安装过程也很简单,直接下一步下一步就好,我就不上图了. 接下来在opencv下找到jar包,比如我直接安 ...

  7. ios OpenCv的配置和人脸识别技术

    作为一个好奇心非常重的人,面对未知的世界都想去一探到底. 于是做了个人脸识别的demo. 眼下国内的关于opencv技术文章非常少.都是互相抄袭.关键是抄个一小部分还不全.时间又是非常久之前的了,和如 ...

  8. Opencv级联分类器实现人脸识别

    在本章中,我们将学习如何使用OpenCV使用系统相机捕获帧.org.opencv.videoio包的VideoCapture类包含使用相机捕获视频的类和方法.让我们一步一步学习如何捕捉帧 - 第1步: ...

  9. OpenCV+python 人脸识别

    首先给大家推荐一本书:机器学习算法原理与编程实践 本文内容全部转载于书中,相当于一个读书笔记了吧 绪论 1992年麻省理工学院通过实验对比了基于结构特征的方法与基于模版匹配的方法,发现模版匹配的方法要 ...

随机推荐

  1. 微信小游戏 4M升8M分包加载

    一.微信分包加载 微信分包加载教程 嘛,因为原来的4M太小了,满足不了小游戏内容的需求,现在提升到了8M.这8M可以分包加载,而不需要一次性加载8M. 如果是老版本,则分包加载不起作用,会一次加载8M ...

  2. js & option keycode

    js & option keycode js get option keycode https://keycode.info/ option https://github.com/wesbos ...

  3. 洛谷P13445 [USACO5.4]奶牛的电信Telecowmunication(网络流)

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  4. 获取androdmanifest里面的meta-data

    /* * Copyright 2017 JessYan * * Licensed under the Apache License, Version 2.0 (the "License&qu ...

  5. bzoj1052

    Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄 膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将 ...

  6. BZOJ 3167: [Heoi2013]Sao

    3167: [Heoi2013]Sao Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 96  Solved: 36[Submit][Status][D ...

  7. 【CF888E】Maximum Subsequence(meet in the middle)

    [CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...

  8. 【转】SPI总线协议

    SPI总线协议 By Xiaomin | April 17, 2016| 技术 概述 SPI(Serial Peripheral Interface)总线是主要应用于嵌入式系统内部通信的串行同步传输总 ...

  9. 迭代器Iterator与ConcurrentModificationException详解

    背景:一直以来对迭代器的问题理解不是很透彻,特别是迭代器和异常ConcurrentModificationException之间的联系.通过debug,详细了解其底层的具体实现过程. 简介 Itera ...

  10. 多线程(模拟买票)-----java基础知识总结

    这次的的问题引入的比较深入,如果看了这篇博客,不看下一篇,你会很懵逼. 代码: package com.day13.math; /** * 类说明 :模拟三个窗口同时售票 * @author 作者 : ...