詳解opencv的HOG描述子維度數目的計算原理

2021-10-12 17:56:21 字數 3215 閱讀 7660

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...