opencv3.1的HOG特征检测参数详解

      HOG特征的源码中给出的检测窗口大小的默认值为128*64,网上很多范例都会将原图resize为该尺寸。那么HOG特征检测时,检测窗口尺寸一定要处理为128*64吗?No,我们只要遵守必要的规则,检测窗口可以设置为任意尺寸。本文记录此问题点的验证方法和使用HOG特征点提取时的注意事项。

      1. HOGDescriptor参数详解

      HOGDescriptor是HOG特征类,使用该类时,涉及到的参数有:ImageSize,winSize,blockSize,cellSize,blockStride, winStride。我们先通过一张图来大致了解一下HOG特征提取和参数设置的规则。这张图来源于参考文献opencv源码解析之(6):hog源码分析,感谢原作者,我在这张图上添加了一些参数设置规则的说明。

size of hog

      上图中的规则在HOG的源码中可以找到,HOG源码的路径为D:\opencv源码路径\sources\modules\objdetect\src\hog.cpp。本文中的”opencv源码路径“指的是正在使用的opencv的sources所在的路径。该语句在函数getDescriptorSize中,该函数用于计算HOG特征点的维度。

      在opencv3.1的hog源码的注释中,有提到HOG检测算法的原理,大致如下:
            检测算法以4层嵌套循环在计算,每一层循环均为二维,理论上其动作分别如下:
                  用设置的winSize以winStride为单位遍历ImageSize
                        用设置的blockSize以blockStride为单位遍历winSize
                              用cellSize为单位遍历blockSize
                                    遍历cellSize中的每一个像素

      但实际上源码中并未这样做,因为这样计算的速度将会非常非常慢。为了加快HOG提取的速度,HOG算法的作者使用了查表法,将pixData和blockData计算完成后存在内存中,在遍历过程中用到相应数据时,直接查表即可,这样可以省去大量重复计算的时间。

      HOGDescriptor其中一个包含默认参数的构造函数如下,这些默认值也是我们在很多范例中见到的设定值。HOGDescriptor构造函数在opencv3.1源码中的路径为D:\opencv源码路径\sources\modules\objdetect\include\opencv2\objdetect.hpp。

     2. HOGDescriptor参数设置实例

     在opencv3.1的源码中,有一个名为train_HOG的范例,其路径为D:\opencv源码路径\sources\samples\cpp\train_HOG.cpp,该范例中有一个将HOG特征可视化的函数。我对该文件进行改造后用来验证HOGDescriptor尺寸设置的问题。

     源图像尺寸为448*280,我设置的参数如下,winSize为图像尺寸,blockSize,blockStride,cellSize的设置则遵守本文图1的规则,其他参数保持默认值。这样既可以得到图像的HOG特征点:9个方向的梯度直方图。

      其可视化结果得到的结果如下图所示,每一个cell中都有一只绿色“小蜘蛛”。我们可以观察到图像右侧和下方有一部分无特征点,因为这部分的值不足以构成一个cell。

hog descriptor

      上图的特征点过于粗糙,而且图像中还有一部分区域并未检测到特征点。我将参数进行调整,调整后参数和图像如下所示。在这一组参数下,特征点覆盖到了整幅图像,特征点更加密集。

        实验证明,只要遵守响应的规则,我们可以根据实际需求自行调整各个参数。

other size of hog

3. HOG特征点可视化函数

    在train_HOG.cpp中,HOG特征点可视化函数名为get_hogdescriptor_visu,该函数实现算法的链接为http://www.juergenwiki.de/work/wiki/doku.php?id=public:hog_descriptor_computation_and_visualization (需fq)。

    该函数在使用时需要注意两点:该函数会把原图扩大3被后绘制HOG特征点,若要调整尺寸,需要自行修改响应代码;该函数默认cellSize为8*8,因此若需要显示任意尺寸的HOG特征点,还需要将函数中使用的cellSize修正为实际使用值。我将该函数进行了调整,在调用时可以设置放大倍数和cellSize,代码如下:

Comments

  1. By livezingy

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Fork me on GitHub