基于HOG特征的SVM分类器实现
在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。HOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征
一、计算HOG
void calculateHog(const Mat& src, vector<float>& descriptors,size windowSize,size blockSize,size cellSize)
{
//梯度方向数 nbins=9
HOGDescriptor myHog = HOGDescriptor(src.size(), windowSize, blockSize, cellSize,9);
myHog.compute(src.clone(), descriptors, Size(1, 1), Size(0, 0));
}
二、SVM
因此容易写得一个基于HOG特征SVM分类器
#ifndef HOGSVM_H
#define HOGSVM_H
#include "cvHeadspace.h"
#include <iostream>
#include <vector>
using namespace cv;
using namespace cv::ml;
class HogSVM
{
public:
HogSVM(std::string xmlFilePath,Size sWindow,Size sBlock,Size sCell,int enBins=9)
{
mySVM = Algorithm::load<SVM>(xmlFilePath);
HogDesSize[0]=sWindow;
HogDesSize[1]=sBlock;
HogDesSize[2]=sCell;
nbins=enBins;
}
int getLabel(const Mat &src)
{
std::vector<float> imageDescriptor;
calculateHog(src, imageDescriptor,HogDesSize[0],HogDesSize[1],HogDesSize[2]);
Mat testDescriptor = Mat::zeros(1, imageDescriptor.size(), CV_32FC1);
for (size_t i = 0; i < imageDescriptor.size(); i++)
{
testDescriptor.at<float>(0, i) = imageDescriptor[i];
}
float label = pHogSVM->predict(testDescriptor);
return (int)label;
}
private:
void calculateHog(const Mat& src, std::vector<float>& descriptors,size windowSize,size blockSize,size cellSize)
{
//梯度方向数 nbins默认为9
HOGDescriptor myHog = HOGDescriptor(src.size(), windowSize, blockSize, cellSize,nbins);
myHog.compute(src.clone(), descriptors, Size(1, 1), Size(0, 0));
}
int nbins;
Size HogDesSize[3];
Ptr<SVM> pHogSVM;
};
#endif // HOGSVM_H
三、测试
简单尝试了一下训练,然后把训练的xml读入,做了测试(这里表格里的单位应该是ms不是s)
int label = tempSvm.getLabel(rROI);
四、小demo
运用SVM+Qt+openCV写了小demo测试
适当调整灵敏度后点击“抢占”就能调用windows.api控制鼠标,开始愉快(智杖)的玩耍了!
五、因为有人需要,更新了一下
时间比较久,有些东西已经没了,不过代码还在,之前没上传的原因就是感觉代码写得太烂,而且就是个本科作业级别的玩具,不好意思上传,但是有人需要,所以上传修改了一下文章,如下。
该项目主要有三个工程,
一个是vs_test_project用于前期的手势识别的测试。
还有一个是svm_train用于训练svm.xml文件。这两个工程文件全部贴在下面了。
QT的gui工程用于展示,但这个工程我没备份
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)