HOG特征提取之HOGDescriptor类

灰太狼 2022-05-14 01:56 292阅读 0赞

原文转自:https://blog.csdn.net/qq_26898461/article/details/46786285

最近要做图像特征提取,可能要用下HOG特征,所以研究了下OpenCV的HOG描述子。OpenCV中的HOG特征提取功能使用了HOGDescriptor这个类来进行封装,其中也有现成的行人检测的接口。

然而,无论是OpenCV官方说明文档还是各个中英文网站目前都没有这个类的使用说明,所以在这里把研究的部分心得分享一下。

  1. 首先我们进入HOGDescriptor所在的头文件,看看它的构造函数需要哪些参数。

[cpp] view plaincopy

  1. CV_WRAP HOGDescriptor() : winSize(64,128), blockSize(16,16), blockStride(8,8),
  2. cellSize(8,8), nbins(9), derivAperture(1), winSigma(-1),
  3. histogramNormType(HOGDescriptor::L2Hys), L2HysThreshold(0.2), gammaCorrection(true),
  4. nlevels(HOGDescriptor::DEFAULT_NLEVELS)
  5. {}

[cpp] view plaincopy

  1. CV_WRAP HOGDescriptor(Size _winSize, Size _blockSize, Size _blockStride,
  2. Size _cellSize, int _nbins, int _derivAperture=1, double _winSigma=-1,
  3. int _histogramNormType=HOGDescriptor::L2Hys,
  4. double _L2HysThreshold=0.2, bool _gammaCorrection=false,
  5. int _nlevels=HOGDescriptor::DEFAULT_NLEVELS)
  6. : winSize(_winSize), blockSize(_blockSize), blockStride(_blockStride), cellSize(_cellSize),
  7. nbins(_nbins), derivAperture(_derivAperture), winSigma(_winSigma),
  8. histogramNormType(_histogramNormType), L2HysThreshold(_L2HysThreshold),
  9. gammaCorrection(_gammaCorrection), nlevels(_nlevels)
  10. {}

[cpp] view plaincopy

  1. CV_WRAP HOGDescriptor(const String& filename)
  2. {
  3. load(filename);
  4. }

[cpp] view plaincopy

  1. HOGDescriptor(const HOGDescriptor& d)
  2. {
  3. d.copyTo(*this);
  4. }

我们看到HOGDescriptor一共有4个构造函数,前三个有CV_WRAP前缀,表示它们是从DLL里导出的函数,即我们在程序当中可以调用的函数;最后一个没有上述的前缀,所以我们暂时用不到,它其实就是一个拷贝构造函数。

  1. 下面我们就把注意力放在前面的构造函数的参数上面吧,这里有几个重要的参数要研究下:winSize(64,128), blockSize(16,16), blockStride(8,8), cellSize(8,8), nbins(9)。上面这些都是HOGDescriptor的成员变量,括号里的数值是它们的默认值,它们反应了HOG描述子的参数。这里做了几个示意图来表示它们的含义。
  2. **窗口大小 winSize**

0_129981025533pB.gif

块大小 blockSize

0_1299810322DuP6.gif

  1. **胞元大小 cellSize**

0_1299810389kQkY.gif

  1. **梯度方向数 nbins**
  2. nBins表示在一个胞元(cell)中统计梯度的方向数目,例如nBins=9时,在一个胞元内统计9个方向的梯度直方图,每个方向为180/9=20度。
  3. **HOG描述子维度**

在确定了上述的参数后,我们就可以计算出一个HOG描述子的维度了。OpenCV中的HOG源代码是按照下面的式子计算出描述子的维度的。

[cpp] view plaincopy

  1. size_t HOGDescriptor::getDescriptorSize() const
  2. {
  3. CV_Assert(blockSize.width % cellSize.width == 0 &&
  4. blockSize.height % cellSize.height == 0);
  5. CV_Assert((winSize.width - blockSize.width) % blockStride.width == 0 &&
  6. (winSize.height - blockSize.height) % blockStride.height == 0 );
  7. return (size_t)nbins*
  8. (blockSize.width/cellSize.width)*
  9. (blockSize.height/cellSize.height)*
  10. ((winSize.width - blockSize.width)/blockStride.width + 1)*
  11. ((winSize.height - blockSize.height)/blockStride.height + 1);
  12. }

参考文献

  1. OpenCV中的HOG算法来源于**Histograms of Oriented Gradients for Human Detection, CVPR 2005**。详细的算法可以参考这个文章。

发表评论

表情:
评论列表 (有 0 条评论,292人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HOG特征

    引言 HOG 全名为Histogram of Gragient,表示梯度方向直方图; 梯度,作为一个向量,包括大小(幅值)和方向(角度)两部分。图像中像素点的

    相关 HOG特征可视化

    可视化说明 在之前博客[HOG原理及OpenCV实现][HOG_OpenCV]中,我们解释了HOG算法的原理。最终提取到的特征就是一串向量,其实我们并不知道它具体是什么样