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 人臉偵測流程
  1. 將影像轉換為灰階影像。
  2. 建立積分影像。
  3. 使用不同大小的視窗掃描整張影像。
  4. 在每個視窗中計算 Haar 特徵。
  5. 使用 AdaBoost 選出的弱分類器進行判斷。
  6. 將弱分類器安排成多階段級聯結構。
  7. 任一階段未通過,就排除該視窗。
  8. 通過全部階段的區域,視為可能的人臉。
  9. 合併彼此重疊的人臉框,得到最終偵測結果。

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/




留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

外貿Payment Term 付款條件(方式)常見的英文縮寫與定義

鼎新ERP_會計系統_總帳管理_財務參數設定_傳票處理