opencv3/C++ HOG特征提取

HOG特征

HOG(Histograms of Oriented Gradients)梯度方向直方图
通过利用梯度信息能反映图像目标的边缘信息并通过局部梯度的大小将图像局部的外观和形状特征化.在论文Histograms of Oriented Gradients for Human Detection中被提出.

HOG特征的提取过程为:

  1. Gamma归一化;
  2. 计算梯度;
  3. 划分cell
  4. 组合成block,统计block直方图;
  5. 梯度直方图归一化;
  6. 收集HOG特征。

Gamma归一化:
对图像颜色进行Gamma归一化处理,降低局部阴影及背景因素的影响.
计算梯度:

通过差分计算出图像在水平方向上及垂直方向上的梯度:
fx(x,y)=f(x,y)f(x+1,y)
fy(x,y)=f(x,y)f(x,y+1)
然后得到各个像素点的梯度的幅值及方向:
f(x,y)=fx(x,y)2+fy(x,y)2
φtan1(fx(x,y)fy(x,y))
划分cell
将整个窗口划分成大小相同互不重叠的细胞单元cell(如8×8像素),计算出每个cell的梯度大小及方向.然后将每像素的梯度方向在 0180o 区间内(无向:0-180,有向:0-360)平均分为9个bins,每个cell内的像素用幅值来表示权值,为其所在的梯度直方图进行加权投票.
9bins:
这里写图片描述
如图,不同数量的bins下的错误率:
这里写图片描述
组合成block,统计block直方图
将2×2个相邻的cell组成大小为16×16的像素块即block.依次将block大小的滑动窗口从左到右从上到下滑动,求其梯度方向直方图向量.
这里写图片描述
如图,不同大小的cell与不同大小的block作用下的效果对比:
这里写图片描述
梯度直方图归一化
作者对比了L2-norm、L1-norm、L1-sqrt等归一化方法,发现都比非标准数据有显着的改善.其中L2-norm和L1-sqrt效果最好,而L1-norm检测效果要比L2-norm和L1-sqrt低5%.
L2-norm:
VV/V22+ε2
L1-norm:
VV/(V1+ε)
L1-sqrt:
VV/(V1+ε)
如图,不同的归一化方法效果对比:
这里写图片描述
这样通过归一化能够进一步地对光照、阴影和边缘进行压缩.
收集HOG特征
由于每个cell内的梯度方向分成了9个bins,这样每个细胞单元的HOG特征向量长度是9.
这里写图片描述
这样,对于大小为128×64大小的图像,采用8*8像素的sell,2×2个cell组成的16×16像素的block,采用8像素的block移动步长,这样检测窗口block的数量有((128-16)/8+1)×((64-16)/8+1)=15×7.则HOG特征描述符的维数为15×7×4×9.
这里写图片描述

这里写图片描述

HOG的缺点:
速度慢,实时性差;难以处理遮挡问题。

OpenCV应用

利用HOG进行行人检测时有两种用法:
1、采用HOG特征+SVM分类器进行行人检测;
2、利用HOG+SVM训练自己的XML文件。

采用第一种方法,使用HOG特征结合SVM分类器进行行人检测,简单示例:

#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>
using namespace std;
using namespace cv;

int main()
{
    Mat src, dst;
    src = imread("E:/image/image/passerby.jpg",1);
    if (src.empty())
    {
        printf("can not load the image...\n");
        return -1;
    }
    dst = src.clone();
    vector<Rect> findrects, findrect;
    HOGDescriptor HOG;
    //SVM分类器
    HOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    //多尺度检测
    HOG.detectMultiScale(src, findrects, 0, Size(4,4), Size(0,0), 1.05, 2);
    //若rects有嵌套,则取最外面的矩形存入rect
    for(int i=0; i < findrects.size(); i++)
    {
        Rect rect = findrects[i];
        int j=0;
        for(; j < findrects.size(); j++)
            if(j != i && (rect & findrects[j]) == rect)
                break;
        if( j == findrects.size())
            findrect.push_back(rect);
    }
    //框选出检测结果
    for(int i=0; i<findrect.size(); i++)
    {
        RNG rng(i);
        Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255));
        rectangle(dst, findrect[i].tl(), findrect[i].br(), color, 2);
    }

    imshow("src",src);
    imshow("dst",dst);
    waitKey();
    return 0;
}

这里写图片描述
这里写图片描述


参考:
Histograms of Oriented Gradients for Human Detection
Histograms of Oriented Gradients for Human Detection by Navneet Dalal, Bill Triggs
Finding People in Images and Videos
OpenCV3:cv::HOGDescriptor Struct Reference

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值