Haar-like特徵人臉檢測

CvHaarFeature, CvHaarClassifier, CvHaarStageClassifier, CvHaarClassifierCascade Boosted Haar 分類器結構的幾個結構體是樹型結構。

Cascade:

Stage1:
Classifier11:
Feature11
Classifier12:
Feature12
...
Stage2:
Classifier21:
Feature21 整個等級可以手工構建,也可以利用函數cvLoadHaarClassifierCascade從已有的磁盤文件或嵌入式基中導入。

1.CvHaarClassifierCascade* cvLoadHaarClassifierCascade( const char* directory訓練好的級聯分類器的路徑,cvSize orig_window_size級聯分類器訓練中採用的檢測目標的尺寸。因爲這個信息沒有在級聯分類器中存儲,所以要單獨指出 );

函數 cvLoadHaarClassifierCascade 用於從文件中裝載訓練好的利用哈爾特徵的級聯分類器,或者從OpenCV中嵌入的分類器數據庫中導入。分類器的訓練可以應用函數haartraining(詳細察看opencv/apps/haartraining) 這個數值是在訓練分類器時就確定好的,修改它並不能改變檢測的範圍或精度。

需要注意的是,這個函數已經過時了。現在的目標檢測分類器通常存儲在 XML 或 YAML 文件中,而不是通過路徑導入。從文件中導入分類器,可以使用函數 cvLoad 。

2.void cvReleaseHaarClassifierCascade( CvHaarClassifierCascade** cascade );

cascade
雙指針類型指針指向要釋放的cascade. 指針由函數聲明。

函數 cvReleaseHaarClassifierCascade 釋放cascade的動態內存,其中cascade的動態內存或者是手工創建,或者通過函數 cvLoadHaarClassifierCascade 或 cvLoad分配。

3.CvSeq* cvHaarDetectObjects( const CvArr* image, CvHaarClassifierCascade* cascade,

CvMemStorage* storage, double scale_factor=1.1,

int min_neighbors=3, int flags=0,

CvSize min_size=cvSize(0,0) );

typedef struct CvAvgComp

{

CvRect rect;

int neighbors;

}

image
被檢圖像
cascade
harr 分類器級聯的內部標識形式
storage
用來存儲檢測到的一序列候選目標矩形框的內存區域。
scale_factor
在前後兩次相繼的掃描中,搜索窗口的比例係數。例如1.1指將搜索窗口依次擴大10%。
min_neighbors
構成檢測目標的相鄰矩形的最小個數(缺省-1)。如果組成檢測目標的小矩形的個數和小於min_neighbors-1 都會被排除。如果min_neighbors 爲 0, 則函數不做任何操作就返回所有的被檢候選矩形框,這種設定值一般用在用戶自定義對檢測結果的組合程序上。
flags
操作方式。當前唯一可以定義的操作方式是 CV_HAAR_DO_CANNY_PRUNING。如果被設定,函數利用Canny邊緣檢測器來排除一些邊緣很少或者很多的圖像區域,因爲這樣的區域一般不含被檢目標。人臉檢測中通過設定閾值使用了這種方法,並因此提高了檢測速度。
min_size
檢測窗口的最小尺寸。缺省的情況下被設爲分類器訓練時採用的樣本尺寸(人臉檢測中缺省大小是~20×20)。

函數 cvHaarDetectObjects 使用針對某目標物體訓練的級聯分類器在圖像中找到包含目標物體的矩形區域,並且將這些區域作爲一序列的矩形框返回。函數以不同比例大小的掃描窗口對圖像進行幾次搜索(察看cvSetImagesForHaarClassifierCascade)。每次都要對圖像中的這些重疊區域利用cvRunHaarClassifierCascade進行檢測。有時候也會利用某些繼承(heuristics)技術以減少分析的候選區域,例如利用 Canny 裁減 (prunning)方法。函數在處理和收集到候選的方框(全部通過級聯分類器各層的區域)之後,接着對這些區域進行組合並且返回一系列各個足夠大的組合中的平均矩形。調節程序中的缺省參數(scale_factor=1.1, min_neighbors=3, flags=0)用於對目標進行更精確同時也是耗時較長的進一步檢測。爲了能對視頻圖像進行更快的實時檢測,參數設置通常是:scale_factor=1.2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING, min_size=<minimum possible face size> (例如, 對於視頻會議的圖像區域).

4.void cvSetImagesForHaarClassifierCascade( CvHaarClassifierCascade* cascade,

const CvArr* sum, const CvArr* sqsum,

const CvArr* tilted_sum, double scale );爲

爲隱藏的cascade(hidden cascade)指定圖像

cascade
隱藏 Harr 分類器級聯 (Hidden Haar classifier cascade), 由函數 cvCreateHidHaarClassifierCascade生成
sum
32-比特,單通道圖像的積分圖像(Integral (sum) 單通道 image of 32-比特 integer format). 這幅圖像以及隨後的兩幅用於對快速特徵的評價和亮度/對比度的歸一化。 它們都可以利用函數 cvIntegral從8-比特或浮點數 單通道的輸入圖像中得到。
sqsum
單通道64比特圖像的平方和圖像
tilted_sum
單通道32比特整數格式的圖像的傾斜和(Tilted sum)
scale
cascade的窗口比例. 如果 scale=1, 就只用原始窗口尺寸檢測 (只檢測同樣尺寸大小的目標物體) - 原始窗口尺寸在函數cvLoadHaarClassifierCascade中定義 (在 "<default_face_cascade>"中缺省爲24x24), 如果scale=2, 使用的窗口是上面的兩倍 (在face cascade中缺省值是48x48 )。這樣儘管可以將檢測速度提高四倍,但同時尺寸小於48x48的人臉將不能被檢測到。

函數 cvSetImagesForHaarClassifierCascade 爲hidden classifier cascade 指定圖像 and/or 窗口比例係數。如果圖像指針爲空,會繼續使用原來的圖像(i.e. NULLs 意味這"不改變圖像")。比例係數沒有 "protection" 值,但是原來的值可以通過函數 cvGetHaarClassifierCascadeScale 重新得到並使用。這個函數用於對特定圖像中檢測特定目標尺寸的cascade分類器的設定。函數通過cvHaarDetectObjects進行內部調用,但當需要在更低一層的函數cvRunHaarClassifierCascade中使用的時候,用戶也可以自行調用

5.int cvRunHaarClassifierCascade( CvHaarClassifierCascade* cascade, CvPoint pt, int start_stage=0 );

在給定位置的圖像中運行 cascade of boosted classifier

cascade
Haar 級聯分類器
pt
待檢測區域的左上角座標。待檢測區域大小爲原始窗口尺寸乘以當前設定的比例係數。當前窗口尺寸可以通過cvGetHaarClassifierCascadeWindowSize重新得到。
start_stage
級聯層的初始下標值(從0開始計數)。函數假定前面所有每層的分類器都已通過。這個特徵通過函數cvHaarDetectObjects內部調用,用於更好的處理器高速緩衝存儲器。

函數 cvRunHaarClassifierCascade 用於對單幅圖片的檢測。在函數調用前首先利用 cvSetImagesForHaarClassifierCascade設定積分圖和合適的比例係數 (=> 窗口尺寸)。當分析的矩形框全部通過級聯分類器每一層的時返回正值(這是一個候選目標),否則返回0或負值

發佈了26 篇原創文章 · 獲贊 13 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章