train cascade 原始碼閱讀之Haar特徵

2021-07-11 16:49:59 字數 2910 閱讀 7770

下面片段是生成用於在積分圖中的矩形塊的座標,feature類中存的是在積分圖矩陣中的初始偏移量,矩形的左上角座標和寬高,以及是否旋轉。不同型別的haar特徵已經在**中體現的很明確了,故不贅述。

[cpp]view plain

copy

"font-size:14px;"

>

void

cvhaarevaluator::generatefeatures()  

// haar_y2

if( (x+dx <= winsize.width) && (y+dy*2 <= winsize.height) )  

// haar_x3

if( (x+dx*3 <= winsize.width) && (y+dy <= winsize.height) )  

// haar_y3

if( (x+dx <= winsize.width) && (y+dy*3 <= winsize.height) )  

if( mode != cvhaarfeatureparams::basic )  

// haar_y4

if( (x+dx <= winsize.width ) && (y+dy*4 <= winsize.height) )  

}  // x2_y2

if( (x+dx*2 <= winsize.width) && (y+dy*2 <= winsize.height) )  

if(mode != cvhaarfeatureparams::basic)  

}  if(mode == cvhaarfeatureparams::all)  

// tilted haar_y2

if( (x+dx <= winsize.width) && (y+dx+2*dy <= winsize.height) && (x-2*dy>= 0) )  

// tilted haar_x3

if( (x+3*dx <= winsize.width) && (y+3*dx+dy <= winsize.height) && (x-dy>= 0) )  

// tilted haar_y3

if( (x+dx <= winsize.width) && (y+dx+3*dy <= winsize.height) && (x-3*dy>= 0) )  

// tilted haar_x4

if( (x+4*dx <= winsize.width) && (y+4*dx+dy <= winsize.height) && (x-dy>= 0) )  

// tilted haar_y4

if( (x+dx <= winsize.width) && (y+dx+4*dy <= winsize.height) && (x-4*dy>= 0) )  

}  }  }  

}  }  

numfeatures = (int

)features.size();  }

接著,在 cvhaarevaluator::feature建構函式中,對剛剛求得的座標做了偏移量上的轉換。

[cpp]view plain

copy

"font-size:14px;"

>cvhaarevaluator::feature::feature( 

intoffset, 

bool

_tilted,  

intx0, 

inty0, 

intw0, 

inth0, 

float

wt0,  

intx1, 

inty1, 

intw1, 

inth1, 

float

wt1,  

intx2, 

inty2, 

intw2, 

inth2, 

float

wt2 )  

}  else

}  }  

cv_sum_offset和cv_tilted_offset是計算偏移量的巨集,它們將左上角點和寬高轉換成在單行sum或者tilted矩陣中的位置。sum矩陣的求法和lbp中是一樣的,也是利用了opencv自帶的cv::integral函式,而斜45度的矩陣也沒有用到旋轉影象之類的操作,而是…嗯,還是integral函式,自帶過載功能,實現了45度傾斜操作。

[cpp]view plain

copy

"font-size:14px;"

>

void

cvhaarevaluator::setimage(

const

mat& img, uchar clslabel, 

intidx)  

歸一化因子計算如下:

[cpp]view plain

copy

"font-size:14px;"

>

float

calcnormfactor( 

const

mat& sum, 

const

mat& sqsum )  

sqsum是平方積分圖。

最後,不同小塊乘上權重係數,作為haar特徵值。

[cpp]view plain

copy

"font-size:14px;"

>

inline

float

cvhaarevaluator::feature::calc(  

const

cv::mat &_sum,  

const

cv::mat &_tilted,  

size_t

y) const

用opencv的traincascade訓練檢測器

1,準備正負樣本 注意 正負樣本比例一般為1 3,負樣本只需要名稱,正樣本還要個數和位置引數。正樣本要歸一化為統一大小。正樣本描述檔案與正樣本放到乙個資料夾pos中,負樣本描述檔案放到當前資料夾,還需要部分opencv的檔案以備下用,檔案組織如下所示 2,生成正樣本的.vec檔案 命令 opencv...

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

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

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...