HOG+SVM

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "stdafx.h"
  4. #include <ml.h>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <string>
  8. #include <vector>
  9. using namespace cv;
  10. using namespace std;
  11. int main(int argc, char** argv)
  12. {
  13. vector<string> img_path;
  14. vector<int> img_catg;
  15. int nLine = 0;
  16. string buf;
  17. ifstream svm_data( "E:/SVM_DATA.txt" );
  18. unsigned long n;
  19. while( svm_data )
  20. {
  21. if( getline( svm_data, buf ) )
  22. {
  23. nLine ++;
  24. if( nLine % 2 == 0 )
  25. {
  26. img_catg.push_back( atoi( buf.c_str() ) );//atoi将字符串转换成整型,标志(0,1)
  27. }
  28. else
  29. {
  30. img_path.push_back( buf );//图像路径
  31. }
  32. }
  33. }
  34. svm_data.close();//关闭文件
  35. CvMat *data_mat, *res_mat;
  36. int nImgNum = nLine / 2;            //读入样本数量
  37. ////样本矩阵,nImgNum:横坐标是样本数量, WIDTH * HEIGHT:样本特征向量,即图像大小
  38. data_mat = cvCreateMat( nImgNum, 1764, CV_32FC1 );
  39. cvSetZero( data_mat );
  40. //类型矩阵,存储每个样本的类型标志
  41. res_mat = cvCreateMat( nImgNum, 1, CV_32FC1 );
  42. cvSetZero( res_mat );
  43. IplImage* src;
  44. IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);//需要分析的图片
  45. for( string::size_type i = 0; i != img_path.size(); i++ )
  46. {
  47. src=cvLoadImage(img_path[i].c_str(),1);
  48. if( src == NULL )
  49. {
  50. cout<<" can not load the image: "<<img_path[i].c_str()<<endl;
  51. continue;
  52. }
  53. cout<<" processing "<<img_path[i].c_str()<<endl;
  54. cvResize(src,trainImg);   //读取图片
  55. HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);  //具体意思见参考文章1,2
  56. vector<float>descriptors;//结果数组
  57. hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算
  58. cout<<"HOG dims: "<<descriptors.size()<<endl;
  59. //CvMat* SVMtrainMat=cvCreateMat(descriptors.size(),1,CV_32FC1);
  60. n=0;
  61. for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
  62. {
  63. cvmSet(data_mat,i,n,*iter);
  64. n++;
  65. }
  66. //cout<<SVMtrainMat->rows<<endl;
  67. cvmSet( res_mat, i, 0, img_catg[i] );
  68. cout<<" end processing "<<img_path[i].c_str()<<" "<<img_catg[i]<<endl;
  69. }
  70. CvSVM svm = CvSVM();
  71. CvSVMParams param;
  72. CvTermCriteria criteria;
  73. criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON );
  74. param = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria );
  75. /*
  76. SVM种类:CvSVM::C_SVC
  77. Kernel的种类:CvSVM::RBF
  78. degree:10.0(此次不使用)
  79. gamma:8.0
  80. coef0:1.0(此次不使用)
  81. C:10.0
  82. nu:0.5(此次不使用)
  83. p:0.1(此次不使用)
  84. 然后对训练数据正规化处理,并放在CvMat型的数组里。
  85. */
  86. //☆☆☆☆☆☆☆☆☆(5)SVM学习☆☆☆☆☆☆☆☆☆☆☆☆
  87. svm.train( data_mat, res_mat, NULL, NULL, param );
  88. //☆☆利用训练数据和确定的学习参数,进行SVM学习☆☆☆☆
  89. svm.save( "SVM_DATA.xml" );
  90. //检测样本
  91. IplImage *test;
  92. vector<string> img_tst_path;
  93. ifstream img_tst( "E:/SVM_TEST.txt" );
  94. while( img_tst )
  95. {
  96. if( getline( img_tst, buf ) )
  97. {
  98. img_tst_path.push_back( buf );
  99. }
  100. }
  101. img_tst.close();
  102. CvMat *test_hog = cvCreateMat( 1, 1764, CV_32FC1 );
  103. char line[512];
  104. ofstream predict_txt( "SVM_PREDICT.txt" );
  105. for( string::size_type j = 0; j != img_tst_path.size(); j++ )
  106. {
  107. test = cvLoadImage( img_tst_path[j].c_str(), 1);
  108. if( test == NULL )
  109. {
  110. cout<<" can not load the image: "<<img_tst_path[j].c_str()<<endl;
  111. continue;
  112. }
  113. cvZero(trainImg);
  114. cvResize(test,trainImg);   //读取图片
  115. HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9);  //具体意思见参考文章1,2
  116. vector<float>descriptors;//结果数组
  117. hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算
  118. cout<<"HOG dims: "<<descriptors.size()<<endl;
  119. CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);
  120. n=0;
  121. for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
  122. {
  123. cvmSet(SVMtrainMat,0,n,*iter);
  124. n++;
  125. }
  126. int ret = svm.predict(SVMtrainMat);
  127. sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret );
  128. predict_txt<<line;
  129. }
  130. predict_txt.close();
  131. //cvReleaseImage( &src);
  132. //cvReleaseImage( &sampleImg );
  133. //cvReleaseImage( &tst );
  134. //cvReleaseImage( &tst_tmp );
  135. cvReleaseMat( &data_mat );
  136. cvReleaseMat( &res_mat );
  137. return 0;
  138. }

E:/SVM_TEST.txt和E:/SVM_TEST.txt的存放的都是这种格式的文件为:

d:/001.jpg
1
d:/002/jpg
0

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "cv.h"
#include "highgui.h"
#include <ml.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace cv;
using namespace std;

class Mysvm: public CvSVM
{
public:
int get_alpha_count()
{
return this->sv_total;
}

int get_sv_dim()
{
return this->var_all;
}

int get_sv_count()
{
return this->decision_func->sv_count;
}

double* get_alpha()
{
return this->decision_func->alpha;
}

float** get_sv()
{
return this->sv;
}

float get_rho()
{
return this->decision_func->rho;
}
};

void Train()
{
char classifierSavePath[256] = "d:/pedestrianDetect-peopleFlow.txt";

string positivePath = "C:\\Users\\zzh\\Desktop\\Code-People_Detect - 副本\\pos\\";
string negativePath = "C:\\Users\\zzh\\Desktop\\Code-People_Detect - 副本\\neg\\";

int positiveSampleCount = 2;
int negativeSampleCount = 1;
int totalSampleCount = positiveSampleCount + negativeSampleCount;

cout<<"//////////////////////////////////////////////////////////////////"<<endl;
cout<<"totalSampleCount: "<<totalSampleCount<<endl;
cout<<"positiveSampleCount: "<<positiveSampleCount<<endl;
cout<<"negativeSampleCount: "<<negativeSampleCount<<endl;

CvMat *sampleFeaturesMat = cvCreateMat(totalSampleCount , 6824916, CV_32FC1);
//64*128的训练样本,该矩阵将是totalSample*3780,64*64的训练样本,该矩阵将是totalSample*1764
cvSetZero(sampleFeaturesMat);
CvMat *sampleLabelMat = cvCreateMat(totalSampleCount, 1, CV_32FC1);//样本标识
cvSetZero(sampleLabelMat);

cout<<"************************************************************"<<endl;
cout<<"start to training positive samples..."<<endl;

char positiveImgName[256];
string path;
for(int i=0; i<positiveSampleCount; i++)
{
memset(positiveImgName, ‘\0‘, 256*sizeof(char));
sprintf(positiveImgName, "%d.png", i);
int len = strlen(positiveImgName);
string tempStr = positiveImgName;
path = positivePath + tempStr;

cv::Mat img = cv::imread(path);
if( img.data == NULL )
{
cout<<"positive image sample load error: "<<i<<" "<<path<<endl;
system("pause");
continue;
}

cv::HOGDescriptor hog(cv::Size(64,64), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);
vector<float> featureVec;

hog.compute(img, featureVec, cv::Size(8,8));
int featureVecSize = featureVec.size();

for (int j=0; j<featureVecSize; j++)
{
CV_MAT_ELEM( *sampleFeaturesMat, float, i, j ) = featureVec[j];
}
sampleLabelMat->data.fl[i] = 1;
}
cout<<"end of training for positive samples..."<<endl;

cout<<"*********************************************************"<<endl;
cout<<"start to train negative samples..."<<endl;

char negativeImgName[256];
for (int i=0; i<negativeSampleCount; i++)
{
memset(negativeImgName, ‘\0‘, 256*sizeof(char));
sprintf(negativeImgName, "%d.png", i);
path = negativePath + negativeImgName;
cv::Mat img = cv::imread(path);
if(img.data == NULL)
{
cout<<"negative image sample load error: "<<path<<endl;
continue;
}

cv::HOGDescriptor hog(cv::Size(64,64), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);
vector<float> featureVec;

hog.compute(img,featureVec,cv::Size(8,8));//计算HOG特征
int featureVecSize = featureVec.size();

for ( int j=0; j<featureVecSize; j ++)
{
CV_MAT_ELEM( *sampleFeaturesMat, float, i + positiveSampleCount, j ) = featureVec[ j ];
}

sampleLabelMat->data.fl[ i + positiveSampleCount ] = -1;
}

cout<<"end of training for negative samples..."<<endl;
cout<<"********************************************************"<<endl;
cout<<"start to train for SVM classifier..."<<endl;

CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, FLT_EPSILON);
params.C = 0.01;

Mysvm svm;
svm.train( sampleFeaturesMat, sampleLabelMat, NULL, NULL, params ); //用SVM线性分类器训练
svm.save(classifierSavePath);

cvReleaseMat(&sampleFeaturesMat);
cvReleaseMat(&sampleLabelMat);

int supportVectorSize = svm.get_support_vector_count();
cout<<"support vector size of SVM:"<<supportVectorSize<<endl;
cout<<"************************ end of training for SVM ******************"<<endl;

CvMat *sv,*alp,*re;//所有样本特征向量
sv = cvCreateMat(supportVectorSize , 1764, CV_32FC1);
alp = cvCreateMat(1 , supportVectorSize, CV_32FC1);
re = cvCreateMat(1 , 1764, CV_32FC1);
CvMat *res = cvCreateMat(1 , 1, CV_32FC1);

cvSetZero(sv);
cvSetZero(re);

for(int i=0; i<supportVectorSize; i++)
{
memcpy( (float*)(sv->data.fl+i*1764), svm.get_support_vector(i), 1764*sizeof(float));
}

double* alphaArr = svm.get_alpha();
int alphaCount = svm.get_alpha_count();

for(int i=0; i<supportVectorSize; i++)
{
alp->data.fl[i] = alphaArr[i];
}
cvMatMul(alp, sv, re);

int posCount = 0;
for (int i=0; i<1764; i++)
{
re->data.fl[i] *= -1;
}

FILE* fp = fopen("c:/hogSVMDetector-peopleFlow.txt","wb");
if( NULL == fp )
{
return ;
}
for(int i=0; i<1764; i++)
{
fprintf(fp,"%f \n",re->data.fl[i]);
}
float rho = svm.get_rho();
fprintf(fp, "%f", rho);
cout<<"c:/hogSVMDetector.txt 保存完毕"<<endl;//保存HOG能识别的分类器
fclose(fp);

return ;
}

void Detect()
{
CvCapture* cap = cvCreateFileCapture("E:\\02.avi");
if (!cap)
{
cout<<"avi file load error..."<<endl;
system("pause");
exit(-1);
}

vector<float> x;
ifstream fileIn("c:/hogSVMDetector-peopleFlow.txt", ios::in);
float val = 0.0f;
while(!fileIn.eof())
{
fileIn>>val;
x.push_back(val);
}
fileIn.close();

vector<cv::Rect> found;
cv::HOGDescriptor hog(cv::Size(64,64), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);
hog.setSVMDetector(x);

IplImage* img = NULL;
cvNamedWindow("img", 0);
while(img=cvQueryFrame(cap))
{
hog.detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
if (found.size() > 0)
{

for (int i=0; i<found.size(); i++)
{
CvRect tempRect = cvRect(found[i].x, found[i].y, found[i].width, found[i].height);

cvRectangle(img, cvPoint(tempRect.x,tempRect.y),
cvPoint(tempRect.x+tempRect.width,tempRect.y+tempRect.height),CV_RGB(255,0,0), 2);
}
}
}
cvReleaseCapture(&cap);
}

int main(int argc, char** argv)
{
Train() ;
vector<string> img_path;
vector<int> img_catg;
int nLine = 0;
string buf;
ifstream svm_data( "C:/Users/zzh/Desktop/Code-People_Detect/test.txt" );
unsigned long n;

while( svm_data )
{
if( getline( svm_data, buf ) )
{
nLine ++;
if( nLine % 2 == 0 )
{
img_catg.push_back( atoi( buf.c_str() ) );//atoi将字符串转换成整型,标志(0,1)
}
else
{
img_path.push_back( buf );//图像路径
}
}
}
svm_data.close();//关闭文件

CvMat *data_mat, *res_mat;
int nImgNum = nLine / 2; //读入样本数量
////样本矩阵,nImgNum:横坐标是样本数量, WIDTH * HEIGHT:样本特征向量,即图像大小
data_mat = cvCreateMat( nImgNum, 1764, CV_32FC1 );
cvSetZero( data_mat );
//类型矩阵,存储每个样本的类型标志
res_mat = cvCreateMat( nImgNum, 1, CV_32FC1 );
cvSetZero( res_mat );

IplImage* src;
IplImage* trainImg=cvCreateImage(cvSize(64,64),8,3);//需要分析的图片

for( string::size_type i = 0; i != img_path.size(); i++ )
{
src=cvLoadImage(img_path[i].c_str(),1);
if( src == NULL )
{
cout<<" can not load the image: "<<img_path[i].c_str()<<endl;
continue;
}

cout<<" processing "<<img_path[i].c_str()<<endl;

cvResize(src,trainImg); //读取图片
HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9); //具体意思见参考文章1,2
vector<float>descriptors;//结果数组
hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算
cout<<"HOG dims: "<<descriptors.size()<<endl;
//CvMat* SVMtrainMat=cvCreateMat(descriptors.size(),1,CV_32FC1);
n=0;
for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
{
cvmSet(data_mat,i,n,*iter);
n++;
}
//cout<<SVMtrainMat->rows<<endl;
cvmSet( res_mat, i, 0, img_catg[i] );
cout<<" end processing "<<img_path[i].c_str()<<" "<<img_catg[i]<<endl;
}

CvSVM svm = CvSVM();
CvSVMParams param;
CvTermCriteria criteria;
criteria = cvTermCriteria( CV_TERMCRIT_EPS, 1000, FLT_EPSILON );
param = CvSVMParams( CvSVM::C_SVC, CvSVM::RBF, 10.0, 0.09, 1.0, 10.0, 0.5, 1.0, NULL, criteria );
/*
SVM种类:CvSVM::C_SVC
Kernel的种类:CvSVM::RBF
degree:10.0(此次不使用)
gamma:8.0
coef0:1.0(此次不使用)
C:10.0
nu:0.5(此次不使用)
p:0.1(此次不使用)
然后对训练数据正规化处理,并放在CvMat型的数组里。
*/
//☆☆☆☆☆☆☆☆☆(5)SVM学习☆☆☆☆☆☆☆☆☆☆☆☆
svm.train( data_mat, res_mat, NULL, NULL, param );
//☆☆利用训练数据和确定的学习参数,进行SVM学习☆☆☆☆
svm.save( "SVM_DATA.xml" );

//检测样本
IplImage *test;
vector<string> img_tst_path;
ifstream img_tst( "C:/Users/zzh/Desktop/Code-People_Detect/test.txt" );
while( img_tst )
{
if( getline( img_tst, buf ) )
{
img_tst_path.push_back( buf );
}
}
img_tst.close();

CvMat *test_hog = cvCreateMat( 1, 1764, CV_32FC1 );
char line[512];
ofstream predict_txt( "SVM_PREDICT.txt" );
for( string::size_type j = 0; j != img_tst_path.size(); j++ )
{
test = cvLoadImage( img_tst_path[j].c_str(), 1);
if( test == NULL )
{
cout<<" can not load the image: "<<img_tst_path[j].c_str()<<endl;
continue;
}

cvZero(trainImg);
cvResize(test,trainImg); //读取图片
HOGDescriptor *hog=new HOGDescriptor(cvSize(64,64),cvSize(16,16),cvSize(8,8),cvSize(8,8),9); //具体意思见参考文章1,2
vector<float>descriptors;//结果数组
hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算
cout<<"HOG dims: "<<descriptors.size()<<endl;
CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);
n=0;
for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
{
cvmSet(SVMtrainMat,0,n,*iter);
n++;
}

int ret = svm.predict(SVMtrainMat);
sprintf( line, "%s %d\r\n", img_tst_path[j].c_str(), ret );
predict_txt<<line;
}
predict_txt.close();

//cvReleaseImage( &src);
//cvReleaseImage( &sampleImg );
//cvReleaseImage( &tst );
//cvReleaseImage( &tst_tmp );
cvReleaseMat( &data_mat );
cvReleaseMat( &res_mat );

return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////

283 int main(int argc, char** argv){
284
285     //my_train();
286     //my_detect();
287     vector<float> x;
288     ifstream fileIn("e:/hogSVMDetector-peopleFlow.txt", ios::in); /* 读入支持向量,没必要读入样本的向量 */
289     float val = 0.0f;
290     while(!fileIn.eof())
291     {
292         fileIn>>val;
293         x.push_back(val);
294     }
295     fileIn.close();
296
297     vector<Rect> found, found_filtered;
298     cv::HOGDescriptor hog(cv::Size(64,128), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);
299     hog.setSVMDetector(x);
300
301     Mat img;
302     img=imread("1.jpg",0);
303     hog.detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
304     size_t i, j;
305     for( i = 0; i < found.size(); i++ )
306     {
307         Rect r = found[i];
308         for( j = 0; j < found.size(); j++ )
309             if( j != i && (r & found[j]) == r)
310                 break;
311         if( j == found.size() )
312             found_filtered.push_back(r);
313     }
314     for( i = 0; i < found_filtered.size(); i++ )
315     {
316         Rect r = found_filtered[i];
317         // the HOG detector returns slightly larger rectangles than the real objects.
318         // so we slightly shrink the rectangles to get a nicer output.
319         r.x += cvRound(r.width*0.1);
320         r.width = cvRound(r.width*0.8);
321         r.y += cvRound(r.height*0.07);
322         r.height = cvRound(r.height*0.8);
323         rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 3);
324     }
325     imshow("people detector", img);
326     waitKey();
327
328     /*cvNamedWindow("img", 0);
329     string testimage="E:\database\picture_resize_pos\resize000r.bmp";
330     Mat img=cv::imread(testimage);
331     hog.detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
332     if (found.size() > 0)
333     {
334     printf("found!");
335     }*/
336
337     return 0;
338
339 }
时间: 2024-10-13 10:17:39

HOG+SVM的相关文章

利用opencv的hog+svm实现细胞识别分类器

利用opencv的hog+svm实现细胞识别分类器 图像处理中的细胞识别和人脸识别可以这样来类比,图像中的一张张人脸就是一个个细胞. 模式识别的关键在于样本库的选取,识别率也只能在和样本库比较接近的环境下才能保证.主要工作是三部分一是特征提取,二是样本库的训练train,三是目标检测detect. 一.特征提取 特征提取采用的是HOG特征即HOG描述子,该特征在行人检测中效果非常好.而一般人脸识别采用的是haar特征,这在opencv中都有实现,并都给出了相应的分类器,效果都很不错. 首先采集了

python实现HOG+SVM对CIFAR-10数据集分类(上)

本博客只用于学习,如果有错误的地方,恳请指正,如需转载请注明出处. 看机器学习也是有一段时间了,这两天终于勇敢地踏出了第一步,实现了HOG+SVM对图片分类,具体代码可以在github上下载,https://github.com/subicWang/HOG-SVM-classifer.大家都说HOG+SVM是在行人检测中很合拍的一对.至于为啥,我也讲不清楚.我猜想这么合拍的一对应用在图片分类上效果应该也不错吧,事实证明确实还行,速度挺快,分类正确率还行.我用的数据集是http://www.cs.

HoG SVM 目标检测分析

前一段时间开始了解HoG跟SVM行人识别,看了很多包括Dalal得前辈的文章及经验分享,对HoG理论有了些初步的认识. HoG 的全称是 Histogram of Oriented Gradient, 直译过来也就是梯度方向直方图. 就是计算各像素的梯度方向,统计成为直方图来作为特征表示目标. 下面简述一下利用HoG + SVM 实现目标检测的简要步骤 Step1:获取正样本集并用hog计算特征得到hog特征描述子.例如进行行人检测,可用IRINA等行人样本集,提取出行人的描述子. Step2:

hog&amp;svm

hog&svm的方法已经非常经典,广泛使用在多种行业,并且集成在了硬件中.应该说作为运动检测的一种重要方法,使用的情况还是非常广泛的. (opencv自带的分类器) int main() { Mat src = imread( "1.png"); HOGDescriptor hog; //HOG特征检测器 hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); //设置SVM分类器为默认参数 vector&l

第十八节、基于传统图像处理的目标检测与识别(HOG+SVM附代码)

其实在深度学习分类中我们已经介绍了目标检测和目标识别的概念.为了照顾一些没有学过深度学习的童鞋,这里我重新说明一次:目标检测是用来确定图像上某个区域是否有我们要识别的对象,目标识别是用来判断图片上这个对象是什么.识别通常只处理已经检测到对象的区域,例如,人们总是会使在已有的人脸图像的区域去识别人脸. 传统的目标检测方法与识别不同于深度学习方法,后者主要利用神经网络来实现分类和回归问题.在这里我们主要介绍如何利用OpecnCv来实现传统目标检测和识别,在计算机视觉中有很多目标检测和识别的技术,这里

HOG + SVM(行人检测, opencv实现)

HOG+SVM流程 1.提取HOG特征 灰度化 + Gamma变换(进行根号求解) 计算梯度map(计算梯度) 图像划分成小的cell,统计每个cell梯度直方图 多个cell组成一个block, 特征归一化 多个block串接,并归一化 2.训练SVM分类器 原文地址:https://www.cnblogs.com/my-love-is-python/p/11110277.html

简单HOG+SVM mnist手写数字分类

使用工具 :VS2013 + OpenCV 3.1 数据集:minst 训练数据:60000张 测试数据:10000张 输出模型:HOG_SVM_DATA.xml 数据准备 train-images-idx3-ubyte.gz:  training set images (9912422 bytes) train-labels-idx1-ubyte.gz:  training set labels (28881 bytes) t10k-images-idx3-ubyte.gz:   test s

HOG+SVM+INRIAPerson数据集代码

#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/ml/ml.hpp> //#include <opencv2/gpu/gpu.hpp> #include <fstream> #include <iomanip> #include "opencv

hog+svm+检测人(代替默认的参数)

#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/ml/ml.hpp>//#include <opencv2/gpu/gpu.hpp>#include <fstream>#include <iomanip> #include "opencv2/imgp

学习OpenCV——HOG+SVM

#include "cv.h" #include "highgui.h" #include "stdafx.h" #include <ml.h> #include <iostream> #include <fstream> #include <string> #include <vector> using namespace cv; using namespace std; int ma