OpenCV中HOG特征的提取实现

来源:互联网 发布:mac 抓取网页数据 编辑:程序博客网 时间:2024/05/16 03:01

OpenCV版本2.3.1

hog头文件:opencv\modules\objdetect\include\opencv2\objdetect中的objdetect.hpp

hog实现文件:opencv\modules\objdetect\src中的hog.cpp

参考文献:Histograms of Oriented Gradients for Human Detection 作者 Navneet Dalal and Bill Triggs


关于hog中HOGDescriptor的参数。参考博文http://blog.csdn.net/raodotcong/article/details/6239431


窗口大小winSize


块大小blockSize


cellSize



winsize,blocksize,blockstride,cellsize的关系必须满足条件:

blockSize.width % cellSize.width == 0 &&
        blockSize.height % cellSize.height == 0

(winSize.width - blockSize.width) % blockStride.width == 0 &&
        (winSize.height - blockSize.height) % blockStride.height == 0

getDescriptorSize()中可以看到。


Hog的维数为:

nbins*

(blockSize.width/cellSize.width)*

(blockSize.height/cellSize.height)* 

((winSize.width - blockSize.width)/blockStride.width + 1)* 

((winSize.height - blockSize.height)/blockStride.height + 1)


hog.cpp中的实现函数


1、void HOGDescriptor::computeGradient(const Mat& img, Mat& grad, Mat& qangle,
                                    Size paddingTL, Size paddingBR) const

img为输入图片

grad为输出梯度(两通道)

qangle为输入弧度(两通道)

paddingTL和paddingBR默认值为Size()

2、void HOGCache::init(const HOGDescriptor* _descriptor,
        const Mat& _img, Size _paddingTL, Size _paddingBR,
        bool _useCache, Size _cacheStride)

HOGCache的初始化,无默认参数。

函数中调用descriptor->computeGradient(_img, grad, qangle, _paddingTL, _paddingBR);计算了输入图像img的梯度和角度,存储于HOGDCache结构体的成员变量grad和angle中。

为了提高运行效率。将数据结果缓存与HOGCache结构体的中的BlockData结构体和PixData结构体中。

初始化作用:制定了一个block模板,并规定了此模板中每个像素对各个cell的贡献程度,即权值。

次函数较为复杂。要详细理解此函数请参考:

图文解释

http://blog.csdn.net/ttransposition/article/details/11874285

代码注释

http://blog.csdn.net/ttransposition/article/details/11880425

3、const float* HOGCache::getBlock(Point pt, float* buf)

得到左顶点(LT)为pt坐标的block的按梯度大小权值计算的方向的直方图,输出到buf中。直方图经过normalizeBlockHistogram函数(见下面)归一化。

4、void HOGCache::normalizeBlockHistogram(float* _hist) const

直方图L2-Hys归一化。即先2范数归一化,然后限制在一定范围内如程序中的【0,0.2】,然后重新对限制后的直方图L2范数归一化。详情见论文。

Size HOGCache::windowsInImage(Size imageSize, Size winStride) const

得到输入图像中的窗口个数,返回值为size,分别代表x和y方向上的窗口个数。

Rect HOGCache::getWindow(Size imageSize, Size winStride, int idx) const

得到窗口在输入图像中的矩形范围。

5、void HOGDescriptor::compute(const Mat& img, vector<float>& descriptors,
                            Size winStride, Size padding,
                            const vector<Point>& locations) const

descriptors为输出的直方图。维数为locations.size()*getDescriptorSize()。可以不用为descriptors.resize.函数内重新resize了。

locations参数为图像中窗口的左上(LT)坐标。

6、void HOGDescriptor::detect(const Mat& img,
    vector<Point>& hits, vector<double>& weights, double hitThreshold, 
    Size winStride, Size padding, const vector<Point>& locations) const

检测。需要预先设置svmDetector的值

hists为输出,其为窗口的左顶点坐标值

weights为输出。其为对应的hists窗口的svm分类距离。也就是经过线性分类后的分类结果的数值。只要比较该数值就可以判断是不是特定物体。

locations参数为图像中窗口的左上(LT)坐标。

0 0
原创粉丝点击