在人機互動、安防、社群媒體等領域,人臉偵測(Face Detection) 與 人臉辨識(Face Recognition) 是電腦視覺非常重要的技術,廣泛應用於手機解鎖、門禁系統、監控、社群媒體自動標記等場景。
本章重點:
OpenCV 內建 Haar Cascade 分類器,可用於快速偵測人臉、眼睛等特徵。
其原理是利用多層級的特徵篩選,快速排除非人臉區域,適合即時應用。
補充說明:
若是用 conda 安裝 OpenCV,可能沒有內建 cv2.data.haarcascades
,需至 GitHub 下載 XML 檔案:
👉 Haarcascades XML
請準備一張包含人臉的圖片,例如 face_sample.jpg
,並確認 Haar Cascade 的 XML 檔案路徑正確。
import cv2
# 指定本地的 XML 檔案路徑
face_cascade = cv2.CascadeClassifier(r"E:\haarcascade_frontalface_default.xml")
eye_cascade = cv2.CascadeClassifier(r"E:\haarcascade_eye.xml")
print("Face cascade loaded:", not face_cascade.empty())
print("Eye cascade loaded:", not eye_cascade.empty())
# 讀取影像並轉灰階
img = cv2.imread("face_sample.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("Original", img)
# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()
說明:
請確認 XML 檔案已正確載入,否則無法進行偵測。
# 偵測人臉
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# 畫出人臉框
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 偵測眼睛
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
# 顯示結果
cv2.imshow("Face Detection", img)
cv2.waitKey()
cv2.destroyAllWindows()
scaleFactor
:每次影像縮小的比例,數值越小檢測越細緻但速度較慢,常設為 1.1~1.3。minNeighbors
:檢測框必須至少被多少次檢測到才算有效,數值越高可減少誤檢測但可能漏檢。結果展示:
偵測到的人臉以藍色框標示,眼睛以綠色框標示。
補充說明:
本章介紹了如何使用 Haar Cascade 進行人臉與眼睛偵測,並說明了主要參數與方法比較。
Haar Cascade 方法快速且輕量,適合即時應用,但在複雜場景下建議搭配深度學習模型以提升準確度。