在opencv3.2中,objdetect模組設計了快速的目標檢測方法。其特徵提取使用簡單的haar特徵,該特徵可以使用積分圖的方法進行快速提取;訓練過程採用經典的ad-boost增強演算法可將多個簡單的弱分類器構建成強分類器;目標檢測或者具體的人臉檢測過程中,採用級聯的多個強分類器,極大加速了目標檢測過程,達到實時檢測目的。
本文將以人臉檢測為例,詳細解析opencv本部分原始碼。
class cascadeclassifier
(1)初始化功能實現類cascadeclassifierimpl,載入分類器
bool cascadeclassifier::load( const string
& filename )
(2)多尺度目標檢測實現,對於新老格式的分類器定義了不同的檢測函式,這裡主要介紹利用新格式檢測方法
void cascadeclassifierimpl::detectmultiscale( inputarray _image, std::vector
& objects,
std::vector
& rejectlevels,
std::vector
& levelweights,
double scalefactor, int minneighbors,
int flags, size minobjectsize, size maxobjectsize,
bool outputrejectlevels )
else
//新格式分類器
}
(3)新格式所呼叫的 detectmultiscalenogrouping,計算金字塔層數,通過積分圖計算haar特徵圖,並利用cascadeclassifierinvoker類和parallel_for_ 實現並行檢測
void cascadeclassifierimpl::detectmultiscalenogrouping( inputarray _image,
std::vector
&candidates,
std::vector
& rejectlevels,
double scalefactor,
bool outputrejectlevels )
for( size_t index = 0; index < all_scales.size(); index++)
mat grayimage;
_inputarray gray;
if (_image.channels() > 1)//需轉化為灰度圖處理
cvtcolor(_image, grayimage, color_bgr2gray);
else
if (_image.ismat())// 輸入型別格式需轉換為_inputarray
grayimage = _image.getmat();
else
_image.copyto(grayimage);
gray = grayimage;
//計算當前影象的金字塔積分圖,積分圖通過拼塊方式存入mat型別的sbuf物件中
if( !featureevaluator->setimage(gray, scales) )
return;
size_t i, nscales = scales.size();
cv::autobuffer stripesizebuf(nscales);
int* stripesizes = stripesizebuf;
// 。。。(省略部分引數設定的**)
// cascadeclassifierinvoker類實現具體的檢測過程,候選目標位置存入candidates中
cascadeclassifierinvoker invoker(*this, (int)nscales, nstripes, s, stripesizes,
candidates, rejectlevels, levelweights,
outputrejectlevels, currentmask, &mtx);
//通過 parallel_for_ 並行檢測目標
parallel_for_(range(0, nstripes), invoker);
}
(4)平行計算類cascadeclassifierinvoker,通過過載()運算子定義。對特徵金子塔逐層 逐行逐列 判斷(runat)是否候選目標位置
class cascadeclassifierinvoker : public parallelloopbody
if( result == 0 )
x += ystep;}}
}} //。。。
}
(5)runat (可選haar特徵或者 lbp特徵檢測器)判斷當前視窗是否包含待檢測目標
int cascadeclassifierimpl::
runat( ptr& evaluator, point pt, int scaleidx, double& weight )
else
}
(1)單node的haar特徵檢測器
template
//haarevaluator
inline
int predictorderedstump( cascadeclassifierimpl& cascade,
ptr&_featureevaluator, double& sum )
// miexp: 若當前強分類器得分小於閾值,則提前截止 cascade核心思想
if( tmp < stage.threshold )
cascadestumps += ntrees;
}sum = (double)tmp;
return1;}
class haarevaluator : public featureevaluator
}
#include
using
namespace
std;
using
namespace cv;
int main()
return
0;}
OpenCV人臉檢測 完整原始碼 思路
本博文ide為vs2013 opencv2.49 如下 程式截圖如下 如何來用opencv來實現能。下面給出opencv實現人臉檢測的一般步驟 1.載入人臉檢測器 2.開啟攝像頭 3.對進行灰度處理 其實可以不處理,上圖中原圖的標題欄就是未進行灰度處理進行的檢測,這裡的灰度是為下節人臉識別打基礎 4...
OpenCV人臉檢測
include include include include include include include include include include static cvmemstorage storage 0 建立乙個記憶體儲存器,來統一管理各種動態物件的記憶體 static cvhaar...
OpenCV人臉檢測
win7 32位 opencv3.0 vs2013 對資料夾中進行人臉檢測 在opencv中,人臉檢測用的是harr或lbp特徵,分類演算法用的是adaboost演算法。這種演算法需要提前訓練大量的,非常耗時,因此opencv已經訓練好了,把訓練結果存放在一些xml檔案裡面。在opencv3.0版本...