OpenCV 中 HoG 描述子长度计算

之前只管用,这次算了算。算了好久,终于搞定啦。

OpenCV 中,设置 Hog 参数的时候大概是这样写的:

cv::HOGDescriptor hog(
        cv::Size(16, 16),  // winSize
        cv::Size(8, 8),    // blockSize
        cv::Size(4, 4),    // blockStride
        cv::Size(4, 4),    // cellSize
        9                  // nBins
);

所以这样一个设置,对于一幅 224*224 的图片,最终生成的描述子的大小是多少呢?

首先,我们来计算一下一个窗口的长度。

  1. 最开始是个 9,是 nBins。也就是每个 Cell 里面特征长度是 9
  2. 然后,一个 Block 里面能平铺下 2*2 个 Cell,所以还要乘上 2*2
  3. Block 在 Window 里面滑动。Window 大小是 16*16,Block 大小是 8*8,滑动步长是 4*4,所以一个 Window 里面有 ((16-8)/4+1)*((16-8)/4+1)次滑动

到这里我们可以算出来一个 Window 的特征长度是 9*(2*2)*(((16-8)/4+1)*((16-8)/4+1))=324。拿 hog.getDescriptorSize()看一下,是对的。

然后,再来算一下全图的。这个好像其他地方都没有说。OpenCV 认为,Block 在 Image 里面滑动的时候,滑动步长就是你设定的 blockStride。所以就这个例子而言,有 ((224-16)/4+1)*((224-16)/4+1)次滑动。

所以,这个例子里面,特征总长度为 324*(53*53)=910116,与我们使用代码得到的结果是相符的。

留下评论