下面片段是生成用於在積分圖中的矩形塊的座標,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平台的封裝,獲取感測器資料...