Opencv原始碼閱讀 HogDescriptor

2021-06-27 23:20:14 字數 2487 閱讀 4222

opencv中hog特徵提取寫在類hogdescriptor中

預設的建構函式如下:

cv_wraphogdescriptor() :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),

free_coef(-1.f),nlevels(hogdescriptor::default_nlevels) {}

通過預設建構函式可以看出其一些引數的預設配置

檢測視窗的大小,預設的大小是64x128,與影象的大小不是同一回事,但是要求影象的大小必須大於等於視窗大小。同時視窗大小必須滿足如下約束

cv_assert((winsize.width -blocksize.width) %blockstride.width == 0 &&

(winsize.height -blocksize.height) %blockstride.height == 0 );

即視窗大於減去塊大小必須是塊步長的正數倍

假如輸入的影象大於大於視窗大小,那麼可能該影象可能會有多個檢測視窗,同時輸出的hog特徵為這多個檢測視窗的hog特徵串聯起來。

塊大小,預設是16x16,它除了滿足與視窗大小的約束外,還與cellsize有如下約束:

cv_assert(blocksize.width %cellsize.width == 0 &&

blocksize.height %cellsize.height == 0);

即blocksize必須是cellsize的正數倍

塊滑動的步長,預設大小為8x8,與winsize滿足上面說到的約束

胞元大小,預設為8x8

預設引數大小下,乙個滑動視窗的hog特徵長度為:

size_t

hogdescriptor::getdescriptorsize()const

9*2*2*7*15= 3780

同時這裡看出,在求解block的個數的時候,計算式為:

nblocks = size((winsize.width -blocksize.width)/blockstride.width + 1,

(winsize.height -blocksize.height)/blockstride.height + 1);

這裡除以的是blockstride的大小而不是blocksize的大小,且預設引數裡blockstride的大小為8而blocksize的大小為16,也就是說block間會有重疊,重疊度接近50%

原生的hog計算過程比較簡單,即先計算每個cell的hog特徵,然後將多個block的hog串聯起來即可。 但

是opencv提取hog的過程有不同之處,它提供了快取機制來加速處理。

其中hog特徵的提取過程為:先計算影象中每個畫素的梯度特徵,然後使用視窗去滑動統計直方圖。 計

算梯度的過程沒有原生hog計算方式那麼簡單,對於單通道的影象,計算梯度的強度的時候直接使用灰度值,而對於三通道的,則取三個通道中梯度強度最小的那個通道的梯度資料作為當前畫素的梯度資料(初始的梯度資料為dx和dy)。

計算完初始梯度後,要開始計算方向和強度,方向即為梯度的角度,強度為其l2norm,角度在這裡要被歸一化到對應的bin,opencv裡取反正切函式值的範圍為0-180,同時初始的bin個數為9個,那麼乙個bin段對應的角度為20度。

需要說明的是,opencv裡面的hog資料並不是原生的hog資料,它的強度和梯度資料是這樣存放的:

gradptr[x*2] =mag*(1.f - angle);

gradptr[x*2+1] =mag*angle;

qangleptr[x*2] = (uchar)hidx;

hidx++;

hidx &= hidx

< _nbins ? -1 : 0;

qangleptr[x*2+1] = (uchar)hidx;

可以看出這裡並不是原生的hog資料。

然後開始滑窗,滑窗的過程也與原生的hog演算法不一樣,這裡使用了快取操作進行加速處理。

檢測函式寫在detect和detectmultiscale兩個函式中

detect函式實現的功能是針對各個block進行探測,假如某個block的響應值大於某個閾值,則將該block的位置儲存下來,在這個的檢測過程中,進行檢測的視窗是固定大小的

,就是特徵提取時所用的block大小。

detectmultiscale是通過一組對影象指定一系列的尺度(scale)

來進行檢測,具體為根據尺度來縮小需要檢測的,然後使用縮小後的使用

detect

函式來進行檢測。這樣可以檢測到一系列的不同尺度下的響應點(矩形),最終的目標需要通過對這一系列想響應點進行聚類,取聚類中心的矩形作為目標所在的位置。

OpenCV原始碼閱讀 1

開始從讀取檔案的函式說起,這裡主要有兩個函式用於讀取影象的 實際上,當我們在做數字影象處理系統的時候,主要要考慮的也是怎麼讀乙個進來。第乙個函式 cvloadimage主要是用於返回乙個iplimage 的資料結構。第二個函式 cvloadimagem主要是用於返回乙個cvmat 的資料結構。實際上...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

原始碼閱讀 Glide原始碼閱讀之with方法(一)

前言 本篇基於4.8.0版本 原始碼閱讀 glide原始碼閱讀之with方法 一 原始碼閱讀 glide原始碼閱讀之load方法 二 原始碼閱讀 glide原始碼閱讀之into方法 三 大多數情況下,我們使用glide 就一句 但是這一句 裡面蘊含著成噸的 with方法有以下幾個過載方法 publi...