opencv4.12_C++進行人臉檢測(Viola-Jones 人臉偵測法)
Opencv人臉檢測內建的是CascadeClassifier (級聯檢測),採用Haar特徵。 透過正負樣本訓練得到級聯方程式 Haar-like Features 是一種量化描述影像特徵的方法,藉由定義不同的模板實踐邊緣特徵、線性特徵、中心或對角線特徵的計算。 例如人臉影像中,可直觀去感受到眼睛比雙頰顏色在深色一些,鼻樑兩側要比鼻樑顏色更深。 嘴巴比周圍顏色深諸如此類。如此我們可設計不同尺寸、角度的特徵模板進行計算。 在人臉偵測中Haar-like Features,它不直接判斷一個像素的顏色,而是比較影像中相鄰矩形區域的亮度差異,藉此描述人臉的局部結構。 例如,人臉通常具有以下明暗規律: 眼睛區域通常比臉頰暗。 眉毛通常比額頭暗。 鼻樑通常比鼻子兩側亮。 嘴巴通常比周圍皮膚暗。 一個 Haar 特徵通常由白色與黑色矩形區域組成,其特徵值可表示為: Haar特徵值=白色區域像素總和−黑色區域像素總和 如果這個差值符合訓練時所學到的人臉明暗關係,就可能被判定為人臉特徵。 Viola-Jones 人臉偵測法使用 積分影像,讓任意矩形區域的像素總和只需要查詢四個位置。 也就是從影像左上角到目前位置之間,所有像素值的總和。 對一個矩形區域,假設四個角的積分影像值為 A、B、C、D,矩形內像素總和可快速計算為: 矩形總和=D−B−C+A 因此,不論矩形有多大,都只需要少量加減法,這也是 Haar Cascade 能在 CPU 上快速執行的重要原因。 Haar 特徵與 AdaBoost 的關係 AdaBoost 的任務就是從大量 Haar 特徵中,挑選最有用的特徵。 每一個 Haar 特徵可以形成一個簡單的弱分類器: Haar Cascade 人臉偵測流程 將影像轉換為灰階影像。 建立積分影像。 使用不同大小的視窗掃描整張影像。 在每個視窗中計算 Haar 特徵。 使用 AdaBoost 選出的弱分類器進行判斷。 將弱分類器安排成多階段級聯結構。 任一階段未通過,就排除該視窗。 通過全部階段的區域,視為可能的人臉。 合併彼此重疊的人臉框,得到最終偵測結果。 C++程式碼 #include <opencv2/opencv.hpp> #include <iostream> #include <direct.h> // _getc...