opencv 人臉檢測原始碼解析

2021-08-08 10:39:05 字數 3385 閱讀 9804

在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版本...