精华内容
下载资源
问答
  • setsvmdetector
    千次阅读
    2015-12-21 14:08:54
    项目-属性-配置属性-常规-平台工具集,设为低版本vs即可
    更多相关内容
  • * 能否直接更改setSVMDetector()的默认参数3780维? * 还是说可以更改图片大小,但我期望的原图仍要保持1:1的比例,分解3780只能得到 ``` 3780 = 2*2*3*5*7*9 # 9是9个bin ``` 贴一段自己的检测代码 ``` ...
  • 中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()),就可以利用你的训练样本训练出来的分类器进行行人检测了。 下面给出样本训练的参考代码: [cpp]   view plain ...

    【原文:http://blog.csdn.net/carson2005/article/details/7841443

    之前介绍过Hog特征(http://blog.csdn.net/carson2005/article/details/7782726),也介绍过SVM分类器(http://blog.csdn.net/carson2005/article/details/6453502 );而本文的目的在于介绍利用Hog特征和SVM分类器来进行行人检测。

            在2005CVPR上,来自法国的研究人员Navneet Dalal Bill Triggs提出利用Hog进行特征提取,利用线性SVM作为分类器,从而实现行人检测。而这两位也通过大量的测试发现,Hog+SVM是速度和效果综合平衡性能较好的一种行人检测方法。后来,虽然很多研究人员也提出了很多改进的行人检测算法,但基本都以该算法为基础框架。因此,Hog+SVM也成为一个里程表式的算法被写入到OpenCV中。在OpenCV2.0之后的版本,都有Hog特征描述算子的API,而至于SVM,早在OpenCV1.0版本就已经集成进去了;OpenCV虽然提供了HogSVMAPI,也提供了行人检测的sample,遗憾的是,OpenCV并没有提供样本训练的sample。这也就意味着,很多人只能用OpenCV自带的已经训练好的分类器来进行行人检测。然而,OpenCV自带的分类器是利用Navneet DalalBill Triggs提供的样本进行训练的,不见得能适用于你的应用场合。因此,针对你的特定应用场景,很有必要进行重新训练得到适合你的分类器。本文的目的,正在于此。

    重新训练行人检测的流程:

    (1)准备训练样本集合;包括正样本集和负样本集;根据机器学习的基础知识我们知道,要利用机器学习算法进行样本训练,从而得到一个性能优良的分类器,训练样本应该是无限多的,而且训练样本应该覆盖实际应用过程中可能发生的各种情况。(很多朋友,用10来个正样本,10来个负样本进行训练,之后,就进行测试,发现效果没有想象中的那么好,就开始发牢骚,抱怨。。。对于这些人,我只能抱歉的说,对于机器学习、模式识别的认识,你还处于没有入门的阶段);实际应用过程中,训练样本不可能无限多,但无论如何,三五千个正样本,三五千个负样本,应该不是什么难事吧?(如果连这个都做不到,建议你别搞机器学习,模式识别了;训练素材都没有,怎么让机器学习到足够的信息呢?)

    (2)收集到足够的训练样本之后,你需要手动裁剪样本。例如,你想用Hog+SVM来对商业步行街的监控画面中进行行人检测,那么,你就应该用收集到的训练样本集合,手动裁剪画面中的行人(可以写个简单程序,只需要鼠标框选一下,就将框选区域保存下来)。

    (3)裁剪得到训练样本之后,将所有正样本放在一个文件夹中;将所有负样本放在另一个文件夹中;并将所有训练样本缩放到同样的尺寸大小。OpenCV自带的例子在训练时,就是将样本缩放为64*128进行训练的;

    (4)提取所有正样本的Hog特征;

    (5)提取所有负样本的Hog特征;

    (6)对所有正负样本赋予样本标签;例如,所有正样本标记为1,所有负样本标记为0

    (7)将正负样本的Hog特征,正负样本的标签,都输入到SVM中进行训练;Dalal在论文中考虑到速度问题,建议采用线性SVM进行训练。这里,不妨也采用线性SVM

    (8)SVM训练之后,将结果保存为文本文件。

    (9)线性SVM进行训练之后得到的文本文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho;alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量。之后,再该列向量的最后添加一个元素rho。如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()),就可以利用你的训练样本训练出来的分类器进行行人检测了。

    下面给出样本训练的参考代码:

    [cpp]  view plain copy
    1. class Mysvm: public CvSVM  
    2. {  
    3. public:  
    4.     int get_alpha_count()  
    5.     {  
    6.         return this->sv_total;  
    7.     }  
    8.   
    9.     int get_sv_dim()  
    10.     {  
    11.         return this->var_all;  
    12.     }  
    13.   
    14.     int get_sv_count()  
    15.     {  
    16.         return this->decision_func->sv_count;  
    17.     }  
    18.   
    19.     double* get_alpha()  
    20.     {  
    21.         return this->decision_func->alpha;  
    22.     }  
    23.   
    24.     float** get_sv()  
    25.     {  
    26.         return this->sv;  
    27.     }  
    28.   
    29.     float get_rho()  
    30.     {  
    31.         return this->decision_func->rho;  
    32.     }  
    33. };  
    34.   
    35. void Train()  
    36. {  
    37.     char classifierSavePath[256] = "c:/pedestrianDetect-peopleFlow.txt";  
    38.   
    39.     string positivePath = "E:\\pictures\\train1\\pos\\";  
    40.     string negativePath = "E:\\pictures\\train1\\neg\\";  
    41.   
    42.     int positiveSampleCount = 4900;  
    43.     int negativeSampleCount = 6192;  
    44.     int totalSampleCount = positiveSampleCount + negativeSampleCount;  
    45.   
    46.     cout<<"//"<<endl;  
    47.     cout<<"totalSampleCount: "<<totalSampleCount<<endl;  
    48.     cout<<"positiveSampleCount: "<<positiveSampleCount<<endl;  
    49.     cout<<"negativeSampleCount: "<<negativeSampleCount<<endl;  
    50.   
    51.     CvMat *sampleFeaturesMat = cvCreateMat(totalSampleCount , 1764, CV_32FC1);  
    52.     //64*128的训练样本,该矩阵将是totalSample*3780,64*64的训练样本,该矩阵将是totalSample*1764  
    53.     cvSetZero(sampleFeaturesMat);    
    54.     CvMat *sampleLabelMat = cvCreateMat(totalSampleCount, 1, CV_32FC1);//样本标识    
    55.     cvSetZero(sampleLabelMat);    
    56.   
    57.     cout<<"************************************************************"<<endl;  
    58.     cout<<"start to training positive samples..."<<endl;  
    59.   
    60.     char positiveImgName[256];  
    61.     string path;  
    62.     for(int i=0; i<positiveSampleCount; i++)    
    63.     {    
    64.         memset(positiveImgName, '\0', 256*sizeof(char));  
    65.         sprintf(positiveImgName, "%d.jpg", i);  
    66.         int len = strlen(positiveImgName);  
    67.         string tempStr = positiveImgName;  
    68.         path = positivePath + tempStr;  
    69.   
    70.         cv::Mat img = cv::imread(path);  
    71.         if( img.data == NULL )  
    72.         {  
    73.             cout<<"positive image sample load error: "<<i<<" "<<path<<endl;  
    74.             system("pause");  
    75.             continue;  
    76.         }  
    77.   
    78.         cv::HOGDescriptor hog(cv::Size(64,64), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);  
    79.         vector<float> featureVec;   
    80.   
    81.         hog.compute(img, featureVec, cv::Size(8,8));    
    82.         int featureVecSize = featureVec.size();  
    83.   
    84.         for (int j=0; j<featureVecSize; j++)    
    85.         {         
    86.             CV_MAT_ELEM( *sampleFeaturesMat, float, i, j ) = featureVec[j];   
    87.         }    
    88.         sampleLabelMat->data.fl[i] = 1;  
    89.     }  
    90.     cout<<"end of training for positive samples..."<<endl;  
    91.   
    92.     cout<<"*********************************************************"<<endl;  
    93.     cout<<"start to train negative samples..."<<endl;  
    94.   
    95.     char negativeImgName[256];  
    96.     for (int i=0; i<negativeSampleCount; i++)  
    97.     {    
    98.         memset(negativeImgName, '\0', 256*sizeof(char));  
    99.         sprintf(negativeImgName, "%d.jpg", i);  
    100.         path = negativePath + negativeImgName;  
    101.         cv::Mat img = cv::imread(path);  
    102.         if(img.data == NULL)  
    103.         {  
    104.             cout<<"negative image sample load error: "<<path<<endl;  
    105.             continue;  
    106.         }  
    107.   
    108.         cv::HOGDescriptor hog(cv::Size(64,64), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);    
    109.         vector<float> featureVec;   
    110.   
    111.         hog.compute(img,featureVec,cv::Size(8,8));//计算HOG特征  
    112.         int featureVecSize = featureVec.size();    
    113.   
    114.         for ( int j=0; j<featureVecSize; j ++)    
    115.         {    
    116.             CV_MAT_ELEM( *sampleFeaturesMat, float, i + positiveSampleCount, j ) = featureVec[ j ];  
    117.         }    
    118.   
    119.         sampleLabelMat->data.fl[ i + positiveSampleCount ] = -1;  
    120.     }    
    121.   
    122.     cout<<"end of training for negative samples..."<<endl;  
    123.     cout<<"********************************************************"<<endl;  
    124.     cout<<"start to train for SVM classifier..."<<endl;  
    125.   
    126.     CvSVMParams params;    
    127.     params.svm_type = CvSVM::C_SVC;    
    128.     params.kernel_type = CvSVM::LINEAR;    
    129.     params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, FLT_EPSILON);  
    130.     params.C = 0.01;  
    131.   
    132.     Mysvm svm;  
    133.     svm.train( sampleFeaturesMat, sampleLabelMat, NULL, NULL, params ); //用SVM线性分类器训练  
    134.     svm.save(classifierSavePath);  
    135.   
    136.     cvReleaseMat(&sampleFeaturesMat);  
    137.     cvReleaseMat(&sampleLabelMat);  
    138.   
    139.     int supportVectorSize = svm.get_support_vector_count();  
    140.     cout<<"support vector size of SVM:"<<supportVectorSize<<endl;  
    141.     cout<<"************************ end of training for SVM ******************"<<endl;  
    142.   
    143.     CvMat *sv,*alp,*re;//所有样本特征向量   
    144.     sv  = cvCreateMat(supportVectorSize , 1764, CV_32FC1);  
    145.     alp = cvCreateMat(1 , supportVectorSize, CV_32FC1);  
    146.     re  = cvCreateMat(1 , 1764, CV_32FC1);  
    147.     CvMat *res  = cvCreateMat(1 , 1, CV_32FC1);  
    148.   
    149.     cvSetZero(sv);  
    150.     cvSetZero(re);  
    151.     
    152.     for(int i=0; i<supportVectorSize; i++)  
    153.     {  
    154.         memcpy( (float*)(sv->data.fl+i*1764), svm.get_support_vector(i), 1764*sizeof(float));      
    155.     }  
    156.   
    157.     double* alphaArr = svm.get_alpha();  
    158.     int alphaCount = svm.get_alpha_count();  
    159.   
    160.     for(int i=0; i<supportVectorSize; i++)  
    161.     {  
    162.         alp->data.fl[i] = alphaArr[i];  
    163.     }  
    164.     cvMatMul(alp, sv, re);  
    165.   
    166.     int posCount = 0;  
    167.     for (int i=0; i<1764; i++)  
    168.     {  
    169.         re->data.fl[i] *= -1;  
    170.     }  
    171.   
    172.     FILE* fp = fopen("c:/hogSVMDetector-peopleFlow.txt","wb");  
    173.     if( NULL == fp )  
    174.     {  
    175.         return 1;  
    176.     }  
    177.     for(int i=0; i<1764; i++)  
    178.     {  
    179.         fprintf(fp,"%f \n",re->data.fl[i]);  
    180.     }  
    181.     float rho = svm.get_rho();  
    182.     fprintf(fp, "%f", rho);  
    183.     cout<<"c:/hogSVMDetector.txt 保存完毕"<<endl;//保存HOG能识别的分类器  
    184.     fclose(fp);  
    185.   
    186.     return 1;  
    187. }  
    接着,再给出利用训练好的分类器进行行人检测的参考代码:

    [cpp]  view plain copy
    1. void Detect()  
    2. {  
    3.     CvCapture* cap = cvCreateFileCapture("E:\\02.avi");  
    4.     if (!cap)  
    5.     {  
    6.         cout<<"avi file load error..."<<endl;  
    7.         system("pause");  
    8.         exit(-1);  
    9.     }  
    10.   
    11.     vector<float> x;  
    12.     ifstream fileIn("c:/hogSVMDetector-peopleFlow.txt", ios::in);  
    13.     float val = 0.0f;  
    14.     while(!fileIn.eof())  
    15.     {  
    16.         fileIn>>val;  
    17.         x.push_back(val);  
    18.     }  
    19.     fileIn.close();  
    20.   
    21.     vector<cv::Rect>  found;  
    22.     cv::HOGDescriptor hog(cv::Size(64,64), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);  
    23.     hog.setSVMDetector(x);  
    24.   
    25.     IplImage* img = NULL;  
    26.     cvNamedWindow("img", 0);  
    27.     while(img=cvQueryFrame(cap))  
    28.     {  
    29.         hog.detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);  
    30.         if (found.size() > 0)  
    31.         {  
    32.   
    33.             for (int i=0; i<found.size(); i++)  
    34.             {  
    35.                 CvRect tempRect = cvRect(found[i].x, found[i].y, found[i].width, found[i].height);  
    36.   
    37.                 cvRectangle(img, cvPoint(tempRect.x,tempRect.y),  
    38.                     cvPoint(tempRect.x+tempRect.width,tempRect.y+tempRect.height),CV_RGB(255,0,0), 2);  
    39.             }  
    40.         }  
    41.     }  
    42.     cvReleaseCapture(&cap);  
    43. }  

    展开全文
  • HOGDescriptor::SetSVMDetector()

    千次阅读 2015-04-09 14:23:28
    HOGDescriptor::SetSVMDetector()有些限制 1. linear kernel only 2. imgsize == winsize

    HOGDescriptor::SetSVMDetector()有些限制

    1. linear kernel only

    2. imgsize == winsize


    展开全文
  • 64*128,所以维数就是3780了,与setSVMDetector默认的getDefaultPeopleDetector大小一样(大概小于getDefaultPeopleDetector()大小为(3781*1))的vector传到setSVMDetector()里都没关系吧,不会出现断言错误。...

    参考了博客http://blog.csdn.net/carson2005/article/details/7841443 后,自己动手后发现了一些问题,博客里提到的一些问题没有解决

    ,是关于为什么图像的HOG特征向量debug后是15876的问题。答案是因为原作者的窗口是64*64的,所以维数为9*4*7*7=1764(图像的大小也是64*64,所以图像的特征维数与一个窗口的维数是相同的,compute()里的窗口步进(8,8)也是无效的)。而我的图像时64*128大小的,我把窗口也换成

    64*128,所以维数就是3780了,与setSVMDetector默认的getDefaultPeopleDetector大小一样(大概小于getDefaultPeopleDetector()大小为(3781*1))的vector传到setSVMDetector()里都没关系吧,不会出现断言错误。

    上代码:

      1 /*
      2  * =====================================================================================
      3  *
      4  *       Filename:  people_detector.cpp
      5  *      Environment:    
      6  *    Description:  行人检测程序,程序里窗口大小和图片大小一样大,都是64*128
      7  *
      8  *
      9  *
     10  *        Version:  1.0
     11  *        Created:  2013/10/20 10:45:02
     12  *         Author:  yuliyang
     13 I*
     14  *             Mail:  wzyuliyang911@gmail.com
     15  *             Blog:  http://www.cnblogs.com/yuliyang
     16  *
     17  * =====================================================================================
     18  */
     19 
     20 #include "opencv2/opencv.hpp"
     21 #include "windows.h"
     22 #include "fstream"
     23 #include <iostream>
     24 using namespace std;
     25 using namespace cv;
     26 class Mysvm: public CvSVM
     27 {
     28 public:
     29     int get_alpha_count()
     30     {
     31         return this->sv_total;
     32     }
     33 
     34     int get_sv_dim()
     35     {
     36         return this->var_all;
     37     }
     38 
     39     int get_sv_count()
     40     {
     41         return this->decision_func->sv_count;
     42     }
     43 
     44     double* get_alpha()
     45     {
     46         return this->decision_func->alpha;
     47     }
     48 
     49     float** get_sv()
     50     {
     51         return this->sv;
     52     }
     53 
     54     float get_rho()
     55     {
     56         return this->decision_func->rho;
     57     }
     58 };
     59 
     60 int my_train()
     61 {
     62 
     63     /*-----------------------------------------------------------------------------
     64      *  e:/pedestrianDetect-peopleFlow.txt是用来保存所有样本的特征,大小为样本数*3780(每个样本的特征数)
     65      *
     66      *
     67      *
     68      *
     69      *-----------------------------------------------------------------------------*/
     70     char classifierSavePath[256] = "e:/pedestrianDetect-peopleFlow.txt";
     71     string buf;
     72     vector<string> pos_img_path;
     73     vector<string> neg_img_path;
     74     ifstream svm_pos_data("pos.txt");           /* 批处理程序生成 */
     75     ifstream svm_neg_data("neg.txt");           /* 批处理生成 */
     76     while( svm_pos_data )//将训练样本文件依次读取进来    
     77     {    
     78         if( getline( svm_pos_data, buf ) )
     79             pos_img_path.push_back( buf );
     80 
     81     }
     82     while( svm_neg_data )//将训练样本文件依次读取进来    
     83     {    
     84         if( getline( svm_neg_data, buf ) )
     85             neg_img_path.push_back( buf );
     86 
     87     }
     88     cout<<pos_img_path.size()<<"个正样本"<<endl;
     89     cout<<neg_img_path.size()<<"个负样本"<<endl;
     90     int totalSampleCount=pos_img_path.size()+neg_img_path.size();
     91     CvMat *sampleFeaturesMat = cvCreateMat(totalSampleCount , 3780, CV_32FC1);
     92     //64*128窗口大小的训练样本,该矩阵将是totalSample*3780
     93     //64*64的窗口大小的训练样本,该矩阵将是totalSample*1764
     94     cvSetZero(sampleFeaturesMat);  
     95     CvMat *sampleLabelMat = cvCreateMat(totalSampleCount, 1, CV_32FC1);//样本标识  
     96     cvSetZero(sampleLabelMat);  
     97 
     98     cout<<"************************************************************"<<endl;
     99     cout<<"start to training positive samples..."<<endl;
    100 
    101     
    102     
    103     for(int i=0; i<pos_img_path.size(); i++)  
    104     {  
    105         cv::Mat img = cv::imread(pos_img_path.at(i));
    106     
    107         if( img.data == NULL )
    108         {
    109             cout<<"positive image sample load error: "<<i<<endl;
    110             system("pause");
    111             continue;
    112         }
    113 
    114         cv::HOGDescriptor hog(cv::Size(64,128), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);
    115         vector<float> featureVec; 
    116 
    117         hog.compute(img, featureVec, cv::Size(8,8));  
    118         unsigned int featureVecSize = featureVec.size();
    119 
    120         for (int j=0; j<featureVecSize; j++)  
    121         {          
    122             CV_MAT_ELEM( *sampleFeaturesMat, float, i, j ) = featureVec[j]; 
    123         }  
    124         sampleLabelMat->data.fl[i] = 1;
    125     }
    126     cout<<"end of training for positive samples..."<<endl;
    127 
    128     cout<<"*********************************************************"<<endl;
    129     cout<<"start to train negative samples..."<<endl;
    130     
    131     for (int i=0; i<neg_img_path.size(); i++)
    132     {  
    133         
    134         cv::Mat img = cv::imread(neg_img_path.at(i));
    135         if(img.data == NULL)
    136         {
    137             cout<<"negative image sample load error: "<<endl;
    138             continue;
    139         }
    140 
    141         cv::HOGDescriptor hog(cv::Size(64,128), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);  
    142         vector<float> featureVec; 
    143 
    144         hog.compute(img,featureVec,cv::Size(8,8));//计算HOG特征
    145         int featureVecSize = featureVec.size();  
    146 
    147         for ( int j=0; j<featureVecSize; j ++)  
    148         {  
    149             CV_MAT_ELEM( *sampleFeaturesMat, float, i + pos_img_path.size(), j ) = featureVec[ j ];
    150         }  
    151 
    152         sampleLabelMat->data.fl[ i + pos_img_path.size() ] = -1;
    153     }  
    154 
    155     cout<<"end of training for negative samples..."<<endl;
    156     cout<<"********************************************************"<<endl;
    157     cout<<"start to train for SVM classifier..."<<endl;
    158 
    159     CvSVMParams params;  
    160     params.svm_type = CvSVM::C_SVC;  
    161     params.kernel_type = CvSVM::LINEAR;  
    162     params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, FLT_EPSILON);
    163     params.C = 0.01;
    164 
    165     Mysvm svm;
    166     svm.train( sampleFeaturesMat, sampleLabelMat, NULL, NULL, params ); //用SVM线性分类器训练
    167     svm.save(classifierSavePath);
    168 
    169     cvReleaseMat(&sampleFeaturesMat);
    170     cvReleaseMat(&sampleLabelMat);
    171 
    172     int supportVectorSize = svm.get_support_vector_count();
    173     cout<<"support vector size of SVM:"<<supportVectorSize<<endl;
    174     cout<<"************************ end of training for SVM ******************"<<endl;
    175 
    176     CvMat *sv,*alp,*re;//所有样本特征向量 
    177     sv  = cvCreateMat(supportVectorSize , 3780, CV_32FC1);
    178     alp = cvCreateMat(1 , supportVectorSize, CV_32FC1);
    179     re  = cvCreateMat(1 , 3780, CV_32FC1);
    180     CvMat *res  = cvCreateMat(1 , 1, CV_32FC1);
    181 
    182     cvSetZero(sv);
    183     cvSetZero(re);
    184 
    185     for(int i=0; i<supportVectorSize; i++)
    186     {
    187         memcpy( (float*)(sv->data.fl+i*3780), svm.get_support_vector(i), 3780*sizeof(float));    
    188     }
    189 
    190     double* alphaArr = svm.get_alpha();
    191     int alphaCount = svm.get_alpha_count();
    192 
    193     for(int i=0; i<supportVectorSize; i++)
    194     {
    195         alp->data.fl[i] = (float)alphaArr[i];
    196     }
    197     cvMatMul(alp, sv, re);
    198 
    199     int posCount = 0;
    200     for (int i=0; i<3780; i++)
    201     {
    202         re->data.fl[i] *= -1;
    203     }
    204 
    205     /*-----------------------------------------------------------------------------
    206      *  e:/hogSVMDetector-peopleFlow.txt文件中保存的是支持向量,共有3781个值,是一个3781*1的列向量
    207      *
    208      *
    209      *-----------------------------------------------------------------------------*/
    210     FILE* fp = fopen("e:/hogSVMDetector-peopleFlow.txt","wb");
    211     if( NULL == fp )
    212     {
    213         return 1;
    214     }
    215     for(int i=0; i<3780; i++)
    216     {
    217         fprintf(fp,"%f \n",re->data.fl[i]);
    218     }
    219     float rho = svm.get_rho();
    220     fprintf(fp, "%f", rho);
    221     cout<<"e:/hogSVMDetector.txt 保存完毕"<<endl;//保存HOG能识别的分类器
    222     fclose(fp);
    223 
    224     return 1;
    225 }
    226 void my_detect()
    227 {
    228     CvCapture* cap = cvCreateFileCapture("E:\\test.avi");
    229     if (!cap)
    230     {
    231         cout<<"avi file load error..."<<endl;
    232         system("pause");
    233         exit(-1);
    234     }
    235 
    236     vector<float> x;
    237     ifstream fileIn("e:/hogSVMDetector-peopleFlow.txt", ios::in);
    238     float val = 0.0f;
    239     while(!fileIn.eof())
    240     {
    241         fileIn>>val;
    242         x.push_back(val);
    243     }
    244     fileIn.close();
    245 
    246     vector<cv::Rect>  found;
    247     cv::HOGDescriptor hog(cv::Size(64,128), cv::Size(16,16), cv::Size(8,8), cv::Size(8,8), 9);
    248     
    249     /*-----------------------------------------------------------------------------
    250      *
    251      *
    252      *  如果setSVMDetector出现问题的话,可能是这个原因:因为默认hog.getDefaultPeopleDetector()
    253      *  获取的检测器的大小是3781*1的列向量,所以如果生成的e:/hogSVMDetector-peopleFlow.txt里的大小不等的话
    254      *  ,读入
    255      *  就会出现错误,可能这个函数考虑了运行的速度问题,所以限制了大小为3781*1
    256      *  
    257      *  特别注意:有些童鞋可能生成的特征向量是15876(所以setSVMDetector里的列向量就是15877了与默认的大小不一,assetion就出错了)
    258      *  ,只要调整下图像的大小和检测窗口的大小,使生成的特征向量为3780就行了,怎么计算,可以参考
    259      *  网上其他博客
    260      *
    261      *-----------------------------------------------------------------------------*/
    262     hog.setSVMDetector(x);
    263 
    264     IplImage* img = NULL;
    265     cvNamedWindow("img", 0);
    266     while(img=cvQueryFrame(cap))
    267     {
    268         hog.detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
    269         if (found.size() > 0)
    270         {
    271             for (int i=0; i<found.size(); i++)
    272             {
    273                 CvRect tempRect = cvRect(found[i].x, found[i].y, found[i].width, found[i].height);
    274 
    275                 cvRectangle(img, cvPoint(tempRect.x,tempRect.y),
    276                     cvPoint(tempRect.x+tempRect.width,tempRect.y+tempRect.height),CV_RGB(255,0,0), 2);
    277             }
    278         }
    279     }
    280     cvReleaseCapture(&cap);
    281 }
    282 
    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 }

    运行效果:

    正样本1500多个,负样本400多个,所以效果不咋地,只能呵呵了。

    再上一张效果图:(ps:运行的太慢了)

    转载于:https://www.cnblogs.com/yuliyang/p/3378881.html

    展开全文
  • 问题遇到的现象和发生背景 问题相关代码,请勿粘贴截图 运行结果及报错内容 我的解答思路和尝试过的方法 我想要达到的结果
  • setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()):设置训练好的支持向量机检测器; detectMultiScale(self,img,hitThreshold=None,winStride=None,padding=None,scale=None, finalThreshold=None, ...
  •  //不使用HardExample时必须设置为0,因为特征向量矩阵和特征类别矩阵的维数初始化时用到这个值 #define HardExampleNO 4435 //继承自CvSVM的类,因为生成setSVMDetector()中用到的检测子参数时,需要用到训练...
  • //HOG特征检测器 hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());//设置SVM分类器为默认参数 hog.detectMultiScale(src, found1, 0, Size(2, 2), Size(0, 0), 1.05, 2);//对图像进行多尺度检测,...
  • hog.setSVMDetector(detector) # 多尺度检测,found是一个数组,每一个元素都是对应一个矩形,即检测到的目标框 found, w = hog.detectMultiScale(img) print('found', type(found), found.shape) # 过滤一些...
  • OpenCV实战4: HOG+SVM实现行人检测

    万次阅读 多人点赞 2019-03-13 15:59:26
    如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()),就可以利用你的训练样本训练出来的分类器进行行人检测了。  利用hog+svm检测行人...
  • HOG+SVM行人检测的两种方法

    千次阅读 2016-12-29 21:46:10
    如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()), */ //获取支持向量机:矩阵默认是CV_32F Mat supportVector = svm->...
  • //使用默认的描述子 peopleHog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); //检测图像中的行人 peopleHog.detectMultiScale(cv::imread("C:\\Users\\xiaomao\\Desktop\\123.png"), peoples, ...
  • 我试图理解python中...在下面的代码工作精细复制自一个网站hog = cv2.HOGDescriptor()hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())def detector(image):rects, weights = hog.detectMultiS...
  • hog.setSVMDetector(get_svm_detector(svm)) hog.save('myHogDector.bin') 以下是测试代码: import cv2 import numpy as np hog = cv2.HOGDescriptor() hog.load('myHogDector.bin') cap = cv2.VideoCapture(0) ...
  • 作者:苏丽敏,Datawhale优秀学习者,北理工计算机硕士支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、...
  • cv.imshow("input", src) # HOG + SVM hog = cv.HOGDescriptor() hog.setSVMDetector(cv.HOGDescriptor_getDefaultPeopleDetector()) # Detect people in the image (rects, weights) = hog.detectMultiScale(src,...
  • //使用open CV定义好的模型 //新建一个SVM分类检测器 //getDefaultPeopleDetector()--人像检测库 hog.setSVMDetector(hog.getDefaultPeopleDetector()); vector<Rect> foundLocation;//定义容器装检测结果的...
  • 设置SVM分类器 hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); //采用训练好的行人检测分类器 //在测试图像上检测行人区域 vector regions; hog.detectMultiScale(image, regions, 0, cv::...
  • hog.setSVMDetector(hog.getDefaultPeopleDetector()); vector<Rect> peopleLocations; hog.detectMultiScale(src, peopleLocations, 0, Size(8, 8), Size(16, 16), 1.05); for (int i = 0; i (); i++) { ...
  • 基于python +OpenCV Hogl进行行人检测

    千次阅读 2019-09-27 11:02:24
    一、HOGDescriptor()函数 调用OpenCV中的HOGDescriptor() ...hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) 二、代码 #!/usr/bin/python # -*- coding: utf-8 -*- # @Time ...
  • OpenCV HOG+SVM行人检测

    2019-01-14 20:50:23
    hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) #检测图像中的人 #image:图像 #winStride:HOG检测窗口移动时的步长 #padding:在原图外围添加像素,适当的pad可提高检测的准确率 #scale:可控制...
  • opencv实现行人检测(C++)

    万次阅读 多人点赞 2017-08-16 21:40:50
    可以调用该描述子setSVMDetector方法给用于对hog特征进行分类的svm模型的系数赋值,这里的参数为HOGDescriptor::getDefaultPeopleDetector()时表示采用系统默认的参数,因为这些参数是用很多图片训练而来的。...
  • hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) list = [] path = 'D:\\test2\\111' videos = os.listdir(path) videos = filter(lambda x: x.endswith('ppm'), videos) for each in videos...
  • opencv-svm目标检测

    2020-03-07 00:35:50
    detect.setSVMDetector(vec);//计算解出最终分类器 Mat src = imread("C:\\Users\\Administrator\\Desktop\\ls.jpg"); if (!src.data) { cout 测试图片读取失败" ; return; } vector<Rect> found, found_...
  • 在HOG+SVM图片训练时,经常...OpenCV Error: Assertion failed (checkDetectorSize()) in cv::HOGDescriptor::setSVMDetector, file C:\builds\master_PackSlave-win64-vc12-shared\opencv\modules\objdetect\src\ho...
  • 如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()), 就可以利用你的训练样本训练出来的分类器进行行人检测了。 ******************...
  • person): x, y, w, h = person cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 255), 2) # 定义HOG特征+SVM分类器 img = cv2.imread("people.jpg") hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 992
精华内容 396
关键字:

setsvmdetector