之前只管用,这次算了算。算了好久,终于搞定啦。
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
的图片,最终生成的描述子的大小是多少呢?
首先,我们来计算一下一个窗口的长度。
- 最开始是个 9,是 nBins。也就是每个 Cell 里面特征长度是
9
- 然后,一个 Block 里面能平铺下 2*2 个 Cell,所以还要乘上
2*2
- 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
,与我们使用代码得到的结果是相符的。
发表回复