首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

OpenCV 人臉偵測完整實作:Haar 級聯分類器、雙眼偵測與影像翻轉增強

     編輯:關於C++

核心元件

  • CascadeClassifier:載入 Haar/LBP 級聯分類器模型(XML)。
  • detectMultiScale:多尺度偵測物件(人臉、眼睛等)。

環境需求

VS2012 + OpenCV 2.4.7+(2.4.3 版 CascadeClassifier::load 有已知 bug 無法載入模型)。

完整程式碼架構

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

string faceCascadeName = "haarcascade_frontalface_alt.xml";
string eyeCascadeName  = "haarcascade_eye_tree_eyeglasses.xml";

void detectAndDraw(Mat& img, CascadeClassifier& faceCascade,
                   CascadeClassifier& eyeCascade, double scale, bool tryFlip);

int main() {
    CascadeClassifier faceCascade, eyeCascade;
    faceCascade.load(faceCascadeName);
    eyeCascade.load(eyeCascadeName);

    Mat image = imread("girls.jpg", 1);
    detectAndDraw(image, faceCascade, eyeCascade, 1.0, true);
    waitKey(0);
    return 0;
}

偵測與繪製核心邏輯 detectAndDraw

  1. 灰階化與等值化:cvtColor → resize → equalizeHist 提升對比度。
  2. 人臉偵測:faceCascade.detectMultiScale(smallImg, faces, 1.1, 2, 0, Size(30,30))。
  3. 翻轉增強:若 tryFlip,水平翻轉影像再偵測一次,將座標映射回原圖,合併結果(解決側臉偵測率低)。
  4. 繪製人臉框:依長寬比決定畫圓(近似正方形)或矩形。
  5. 眼睛偵測:在人臉 ROI 內用 eyeCascade.detectMultiScale 偵測雙眼,畫圓標記。
  6. 顯示結果:imshow("result", img)。

關鍵參數說明

參數意義建議值
scaleFactor影像縮放比例(每次縮小比例)1.1~1.3
minNeighbors候選框保留所需鄰近框數(越大越嚴格)2~5
flagsCV_HAAR_SCALE_IMAGE 等優化旗標0 或組合
minSize最小偵測視窗Size(30,30)

效能測量

使用 cvGetTickCount() 計算偵測耗時(毫秒),輸出至主控台。

常見問題排查

  • 模型載入失敗 → 確認 XML 路徑、OpenCV 版本 ≥ 2.4.7。
  • 偵測不到人臉 → 調整 scaleFactor、minNeighbors、確認影像對比度。
  • 側臉偵測差 → 啟用 tryFlip 翻轉增強或改用 LBP 分類器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved