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> // _getcwd #include <opencv2/core/utils/logger.hpp> using namespace cv; using namespace std; int main() { cv::utils::logging::setLogLevel( cv::utils::logging::LOG_LEVEL_ERROR ); std::cout << "OpenCV: " << CV_VERSION << std::endl; Mat img = imread("C:/img/EASON-before.jpg"); Mat gray, result; std::vector<Rect> faces; char currentPath[_MAX_PATH]; if (_getcwd(currentPath, _MAX_PATH) != NULL) { cout << "目前工作目錄:" << currentPath << endl; } else { cerr << "無法取得目前工作目錄。" << endl; } // 載入 Haar Cascade 人臉偵測模型 CascadeClassifier faceDetector("data/haarcascade_frontalface_alt.xml"); cvtColor(img, gray, COLOR_BGR2GRAY); faceDetector.detectMultiScale(gray, faces); cout << "偵測到的人臉數量:" << faces.size() << endl; img.copyTo(result); for (int n = 0; n < faces.size(); n++) { rectangle(result, faces[n], Scalar(0, 0, 255), 3); } namedWindow("原始影像", WINDOW_NORMAL); imshow("原始影像", img); // 顯示人臉偵測結果 namedWindow("人臉偵測結果", WINDOW_NORMAL); imshow("人臉偵測結果", result); // 等待鍵盤輸入,否則視窗會立即關閉 waitKey(0); destroyAllWindows(); return 0; }
Ref:
Robust Real-Time Face Detection
使用到的人臉圖片模特兒來源
https://jmclinic.com/case/%E9%9D%92%E6%98%A5%E7%97%98eason/
留言
張貼留言