opencv的hog描述子與sift、surf、orb描述子一樣,都是屬於同一型別的描述符,這種描述符可以作為svm、ann的模型輸入資料。
如何更科學的使用hog描述符,主要取決於hog的引數是如何轉為維度數目的。
下面是python**對乙個影象為40x40大小生成hog描述子的過程。
import cv2
import numpy as np
gray=np.ones(shape=(40
,40),dtype=np.uint8)
'''比如上面這副影象的大小為40*40
定義hog描述子的第乙個值是滑動視窗的大小
滑動視窗大小為16*16
每乙個塊大小設為8*8
塊的步長為4*4 這樣塊移動一次會重疊
單元的大小為4*4 代表每個單元會有9個方向的梯度值
'''#定義hog描述子物件
winsize =(16
,16)blocksize =(8
,8)blockstride =(4
,4)cellsize =(4
,4)nbins =
9hog=cv2.hogdescriptor(winsize,blocksize,blockstride,cellsize,nbins)
#然後進行描述子檢測
'''然後需要定義滑動視窗的步長 以及滑動視窗如果移動到邊緣不夠是否需要進行填充
最好也讓滑動視窗有重疊
'''winstride =(8
,8)padding =(0
,0)hog_ret=hog.compute(gray,winstride,padding)
#結果為(5184, 1)
print
(hog_ret.shape)
執行這個**,可以看到hog描述子的數目為5184,接下來將說明5184這個數目是如何得到的。
為了簡化計算,將滑動視窗簡寫為win、塊簡寫為b、塊的步長簡寫為bs、單元簡寫為c、單元中直方圖數目簡寫為nb。
將影象簡寫為img、滑動視窗步長簡寫為ws、填充簡寫為p。
各個區域的寬為w、高為h。
hog描述子就是各個方向的顏色梯度值。
第一步講解每個滑動視窗的hog描述子數目。
下圖中綠色區域為每乙個滑動視窗,畫素大小為16x16
對於每個大小為16x16的滑動視窗,我們定義的塊的大小為8x8,如下圖藍色區域
因為每個單元cell的大小為4x4,這裡注意塊的大小必須是單元大小的整數倍。因此乙個塊中可以存放4個單元,計算公式為(b_w/c_w)x(b_h/c_h)=(8/4)(8/4)=2x2=4
每個單元中有9個直方圖,這裡說明下9個直方圖代表什麼意思,將每個單元四周一圈360度等分為9個角度,每個角度計算乙個顏色梯度,這樣就得到了單元的九個顏色梯度直方圖。
因此每個塊的直方圖數目為:單元的數目4x9=36
乙個塊中有36個直方圖描述子。
接下來計算乙個視窗中有多少個塊。
塊在視窗中的移動過程如下,因為塊的步長為4x4
從上面塊的移動過程可以看出,這個滑動視窗中有9個塊,橫向有3種,縱向有3中,因此3x3=9
計算公式為((win_w-b_w)/bs_w+1)x((win_h-b_n)/bs_h+1)=
((16-8)/4+1)x((16-8)/4+1)=3x3=9
因此可以得到乙個滑動視窗中的描述子的總數。
乙個塊中有4個單元,每個單元有9個描述子,從而得到乙個塊中有4x9=36個描述子。
每個滑動視窗中有9個塊,因此每個滑動視窗中的描述子數目為9x36=324個。
計算了每個滑動視窗中描述子的數目,接著就需要計算乙個影象中有多少個滑動視窗。
滑動視窗的步長為8x8
如圖所示為滑動視窗在影象中的移動方式,由此可見從左到右有4中排列方式,從上到下有4種排列方式,一共有16種。
計算公式為((img_w-win_w)/ws_w+1)x((img_h-win_h)/ws_h+1)=
((40-16)/8+1)((40-16)/8+1)=4x4=16
由此可知,乙個影象中可以存在16個滑動視窗。
由此hog的描述子數目為16x324=5184。這個數目正好與python**上計算的一致。
以上的引數設定是滑動視窗沒有進行填充,如果把填充設定為8x8
padding =
(8,8)
那麼python執行計算的描述子數目為11664。
因為填充相當於把影象的四個方向左右上下均追加8個畫素,因此影象的寬變為40+82=56,影象的高度也是40+8x2=56。
計算公式為((img_w+p_w2-win_w)/ws_w+1)((img_h+p_h2-win_h)/ws_h+1)=
((40+82-16)/8+1)((40+8x2-16)/8+1)=6x6=36
填充了畫素為8x8,影象就有36個滑動視窗。
36x324=11664
以上就是opencvhog描述子維度數目計算的詳細過程。
OpenCV之 HOG檢測子針對SVM線性核的檢測
要做一些行人檢測方面的工作,環境為vs2010 opencv2.4.4 收集樣本訓練了自己的svm分類器,接下來在用hog的多尺度檢測函式detectmultiscale 進行檢測時遇到了一些問題,經過查閱大量的資料及反覆閱讀源 終於搞清楚了原因,現在進行一下簡單的整理。整個過程可以分為訓練分類器和...
詳解HOG特徵描述運算元中的難點
3.block中的拼接 梯度是在一副影象中尋找邊緣強度和方向的工具。梯度是用一階微分來實現的。先看下圖,梯度的表示。梯度的大小是用如下公式表示的。由於該公式下的計算會導致巨大的計算開銷,在多數情況下,是使用絕對值來近似平方和平方根的計算。該操作如下所示 梯度的方向由以下公式表示 需要注意的是,任意一...
OpenCV 基於HOG特徵的行人檢測
opencv中提供了hog的行人檢測 pedestrain detection 類。cv hogdescriptor類的建構函式的各引數的定義 cpp view plain copy cv wrap hogdescriptor winsize 64,128 detect window blocksi...