天天看点

OpenCV_基于HOG特征的行人检测

opencv中提供了hog的行人检测(pedestrain detection)类。

cv::hogdescriptor类的构造函数的各参数的定义:

[cpp] view

plaincopy

cv_wrap hogdescriptor() :   

     winsize(64,128),                             // detect window   

     blocksize(16,16),                            // block 大小   

     blockstride(8,8),                            // overlap block的滑动步长   

     cellsize(8,8),                               // cell 大小    

     nbins(9),                                    // 直方图的bin个数   

     derivaperture(1),                            // 微分算子核   

     winsigma(-1),                                // 在window上进行高斯加权   

     histogramnormtype(hogdescriptor::l2hys),     // 直方图归一化类型   

     l2hysthreshold(0.2),                         // l2-norm followed by clipping (limiting the maximum values of v to 0.2) and renormalising  

     gammacorrection(true),                       // gamma校正,去除光照影响  

     nlevels(hogdescriptor::default_nlevels)      // 分层数  

下面的两段代码采用opencv中的hog行人检测类来完成对静态图片中的行人检测。

1)采用64*128 (像素为单位)的detect window

//  基于hog特征的行人检测    

//  author:www.icvpr.com  

//  blog:  http://blog.csdn.net/icvpr    

#include <iostream>  

#include <opencv2/opencv.hpp>  

int main(int argc, char** argv)  

{  

    cv::mat image = cv::imread("test.bmp");  

    if (image.empty())  

    {  

        std::cout<<"read image failed"<<std::endl;  

    }  

    // 1. 定义hog对象  

    cv::hogdescriptor hog; // 采用默认参数  

    // 2. 设置svm分类器  

    hog.setsvmdetector(cv::hogdescriptor::getdefaultpeopledetector());   // 采用已经训练好的行人检测分类器  

    // 3. 在测试图像上检测行人区域  

    std::vector<cv::rect> regions;  

    hog.detectmultiscale(image, regions, 0, cv::size(8,8), cv::size(32,32), 1.05, 1);  

    // 显示  

    for (size_t i = 0; i < regions.size(); i++)  

        cv::rectangle(image, regions[i], cv::scalar(0,0,255), 2);  

    cv::imshow("hog", image);  

    cv::waitkey(0);  

    return 0;  

}  

行人检测实验结果:

OpenCV_基于HOG特征的行人检测
OpenCV_基于HOG特征的行人检测

2)采用48*96(像素为单位)的detect window

//  基于hog特征的行人检测      

//  author: http://blog.csdn.net/icvpr      

#include <iostream>    

#include <opencv2/opencv.hpp>    

int main(int argc, char** argv)    

{    

    cv::mat image = cv::imread("test.bmp");    

    if (image.empty())    

    {    

        std::cout<<"read image failed"<<std::endl;    

    }    

    // 1. 定义hog对象    

    cv::hogdescriptor hog(cv::size(48, 96), cv::size(16, 16), cv::size(8, 8), cv::size(8, 8), 9, 1,-1, cv::hogdescriptor::l2hys, 0.2, true, cv::hogdescriptor::default_nlevels);   

    // 2. 设置svm分类器    

    hog.setsvmdetector(cv::hogdescriptor::getdaimlerpeopledetector());   // 采用已经训练好的行人检测分类器    

    // 3. 在测试图像上检测行人区域    

    std::vector<cv::rect> regions;    

    hog.detectmultiscale(image, regions, 0, cv::size(8,8), cv::size(32,32), 1.05, 1);    

    // 显示    

    for (size_t i = 0; i < regions.size(); i++)    

        cv::rectangle(image, regions[i], cv::scalar(0,0,255), 2);    

    cv::imshow("hog", image);    

    cv::waitkey(0);    

    return 0;    

}    

OpenCV_基于HOG特征的行人检测
OpenCV_基于HOG特征的行人检测

opencv_基于hog特征的行人检测

继续阅读