之前只管用,这次算了算。算了好久,终于搞定啦。
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
,与我们使用代码得到的结果是相符的。
发表回复