OpenCV Haar 特徵人臉偵測詳細教學

OpenCV Haar 特徵人臉偵測詳細教學

OpenCV Haar 特徵人臉偵測詳細教學

一、簡介

Haar特徵分類器(Haar Cascade Classifier)是由 Paul Viola 和 Michael Jones 提出的一種快速目標檢測方法,常用於人臉偵測。OpenCV 內建多組訓練好的 Haar 分類器 XML 檔案,可直接使用。

本教學示範如何使用 OpenCV 搭配 Haar 分類器快速偵測影像中的人臉。

二、開發環境需求

  • Python 3.x
  • OpenCV-python(可用指令安裝:pip install opencv-python
  • imutils(方便影像縮放,安裝指令:pip install imutils
  • OpenCV 官方的 Haar 分類器 XML 檔案(本例使用 haarcascade_frontalface_default.xml

三、程式碼完整範例

import cv2
import imutils

# 1. 載入人臉分類器 XML 檔
faceCascade = cv2.CascadeClassifier("ch03/haarcascades/haarcascade_frontalface_default.xml")

# 2. 讀取影像檔案
image = cv2.imread("ch03/images/20250115194509_0_551ff3.jpg")

# 3. 調整影像大小(寬度600像素),保持比例縮放
image = imutils.resize(image, width=600)

# 4. 將影像轉成灰階,Haar分類器需灰階影像作為輸入
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

# 5. 偵測人臉
faces = faceCascade.detectMultiScale(
    gray,
    scaleFactor=1.1,      # 每次影像尺寸縮小比例,越接近1越精細但越慢
    minNeighbors=5,       # 欲保留的鄰近矩形數量,過小會誤偵測過多
    minSize=(20,20)       # 偵測人臉的最小尺寸(像素)
)

# 6. 輸出偵測到的人臉數量
print(f"人臉數: {len(faces)}")

# 7. 在影像上繪出人臉方框
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

# 8. 顯示結果影像
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、程式碼詳細解析

程式碼區塊 功能說明
faceCascade = cv2.CascadeClassifier(...) 載入預先訓練好的人臉辨識模型(XML 檔)
image = cv2.imread(...) 讀取欲偵測的人臉影像
image = imutils.resize(image, width=600) 重新調整影像寬度為600像素,維持比例縮放
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) 將彩色影像轉為灰階影像,方便 Haar 分類器處理
faces = faceCascade.detectMultiScale(...) 執行人臉偵測,回傳偵測到的臉部區域(矩形清單)
print(f"人臉數: {len(faces)}") 印出偵測到的人臉數量
for (x, y, w, h) in faces: 迴圈繪製人臉偵測框
cv2.rectangle(...) 在影像上以綠色方框框出人臉
cv2.imshow(...) 顯示偵測結果影像
cv2.waitKey(0) 等待按鍵,避免視窗立即關閉
cv2.destroyAllWindows() 關閉所有 OpenCV 視窗

五、參數說明

  • scaleFactor=1.1:表示每次圖像縮小的比例,越接近1檢測越精細但越慢,通常設定在1.05~1.3之間。
  • minNeighbors=5:設定一個候選矩形需要多少鄰近矩形才能被保留,數值越大誤檢率越低,但漏檢率會增加。
  • minSize=(20,20):指定最小檢測尺寸,避免檢測到明顯太小的物件。

六、執行步驟

  1. 安裝相依套件:
    pip install opencv-python imutils
  2. 下載 OpenCV 的 Haar Cascade XML 檔案,可從 官方 GitHub 取得。
  3. 將程式碼中的路徑 "ch03/haarcascades/haarcascade_frontalface_default.xml" 和圖片路徑 "ch03/images/20250115194509_0_551ff3.jpg" 改為你的實際路徑。
  4. 執行程式:
    python your_script.py
  5. 跳出視窗會顯示圖片,並用綠色框框標示出偵測到的人臉,終端機也會印出偵測到的人臉數量。
  6. 按任意鍵關閉視窗。

七、注意事項與優化建議

  • Haar分類器在光線明亮、正面人臉效果最佳,側臉或暗處偵測較差。
  • 若需更精確,可嘗試使用 OpenCV 的 DNN 模型或其他深度學習方法。
  • 若需要即時偵測,可將靜態圖片改為攝影機串流,並在迴圈中持續偵測與畫框。
  • imutils 僅用於方便縮放圖片,非必須,可使用 OpenCV 的 cv2.resize 替代。

希望這份教學能幫助你了解如何使用 OpenCV 的 Haar 特徵人臉偵測!如有其他問題,歡迎再問。

留言

這個網誌中的熱門文章

opencv-畫線條/矩陣/圓/文字

opencv-圖像相素調整(resize)和剪裁(cropping)

原來opencv也能"訓練"人臉辨識