生活随笔
收集整理的這篇文章主要介紹了
OpenCV HOGDescriptor 参数图解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近要做圖像特征提取,可能要用下HOG特征,所以研究了下OpenCV的HOG描述子。OpenCV中的HOG特征提取功能使用了HOGDescriptor這個類來進行封裝,其中也有現成的行人檢測的接口。
然而,無論是OpenCV官方說明文檔還是各個中英文網站目前都沒有這個類的使用說明,所以在這里把研究的部分心得分享一下。
????? 首先我們進入HOGDescriptor所在的頭文件,看看它的構造函數需要哪些參數。?
[cpp]?view plaincopyprint?
CV_WRAP?HOGDescriptor()?:?winSize(64,128),?blockSize(16,16),?blockStride(8,8),?? ????cellSize(8,8),?nbins(9),?derivAperture(1),?winSigma(-1),?? ????histogramNormType(HOGDescriptor::L2Hys),?L2HysThreshold(0.2),?gammaCorrection(true),??? ????nlevels(HOGDescriptor::DEFAULT_NLEVELS)?? {}??
[cpp]?view plaincopyprint?
CV_WRAP?HOGDescriptor(Size?_winSize,?Size?_blockSize,?Size?_blockStride,?? ??????????????Size?_cellSize,?int?_nbins,?int?_derivAperture=1,?double?_winSigma=-1,?? ??????????????int?_histogramNormType=HOGDescriptor::L2Hys,?? ??????????????double?_L2HysThreshold=0.2,?bool?_gammaCorrection=false,?? ??????????????int?_nlevels=HOGDescriptor::DEFAULT_NLEVELS)?? :?winSize(_winSize),?blockSize(_blockSize),?blockStride(_blockStride),?cellSize(_cellSize),?? nbins(_nbins),?derivAperture(_derivAperture),?winSigma(_winSigma),?? histogramNormType(_histogramNormType),?L2HysThreshold(_L2HysThreshold),?? gammaCorrection(_gammaCorrection),?nlevels(_nlevels)?? {}??
[cpp]?view plaincopyprint?
CV_WRAP?HOGDescriptor(const?String&?filename)?? {?? ????load(filename);?? }??
[cpp]?view plaincopyprint?
HOGDescriptor(const?HOGDescriptor&?d)?? {?? ????d.copyTo(*this);?? }??
? 我們看到HOGDescriptor一共有4個構造函數,前三個有CV_WRAP前綴,表示它們是從DLL里導出的函數,即我們在程序當中可以調用的函數;最后一個沒有上述的前綴,所以我們暫時用不到,它其實就是一個拷貝構造函數。
????? 下面我們就把注意力放在前面的構造函數的參數上面吧,這里有幾個重要的參數要研究下:winSize(64,128), blockSize(16,16), blockStride(8,8), cellSize(8,8), nbins(9)。上面這些都是HOGDescriptor的成員變量,括號里的數值是它們的默認值,它們反應了HOG描述子的參數。這里做了幾個示意圖來表示它們的含義。
??????窗口大小 winSize
????? 塊大小 blockSize
??????胞元大小 cellSize
??????梯度方向數 nbins
????? nBins表示在一個胞元(cell)中統計梯度的方向數目,例如nBins=9時,在一個胞元內統計9個方向的梯度直方圖,每個方向為180/9=20度。
??????HOG描述子維度
??????在確定了上述的參數后,我們就可以計算出一個HOG描述子的維度了。OpenCV中的HOG源代碼是按照下面的式子計算出描述子的維度的。?
[cpp]?view plaincopyprint?
size_t?HOGDescriptor::getDescriptorSize()?const?? {?? ????CV_Assert(blockSize.width?%?cellSize.width?==?0?&&?? ????????blockSize.height?%?cellSize.height?==?0);?? ????CV_Assert((winSize.width?-?blockSize.width)?%?blockStride.width?==?0?&&?? ????????(winSize.height?-?blockSize.height)?%?blockStride.height?==?0?);?? ????return?(size_t)nbins*?? ????????(blockSize.width/cellSize.width)*?? ????????(blockSize.height/cellSize.height)*?? ????????((winSize.width?-?blockSize.width)/blockStride.width?+?1)*?? ????????((winSize.height?-?blockSize.height)/blockStride.height?+?1);?? }??
參考文獻
????? OpenCV中的HOG算法來源于Histograms of Oriented Gradients for Human Detection, CVPR 2005。詳細的算法可以參考這個文章。
總結
以上是生活随笔為你收集整理的OpenCV HOGDescriptor 参数图解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。