Like Share Discussion Bookmark Smile

J.J. Huang   2026-02-27   Python OpenCV 07.物件偵測與辨識篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 人臉偵測與追蹤

📚 前言

在前一篇我們學會了 即時馬賽克與模糊處理
這一篇要進一步介紹 人臉偵測與追蹤,並且提供三種常見方式:

  1. Haar Cascades
  2. LBP Cascades
  3. DNN (深度學習模型)

🎨 範例圖片/影片

這裡我們使用 Pexels 提供的免費圖片素材:Face Image
下載後將檔名改為 face.jpg,在程式碼範例中使用。這張圖片中有多種臉部表情,非常適合用來測試追蹤演算法。

這邊一樣使用 Pexels 提供的免費影片素材:Face Video
下載後將檔名改為 face.mp4,在程式碼範例中使用。這段影片中有明顯的移動物件,非常適合用來測試追蹤演算法。

🔎 三種方式比較

方法 檔案來源 優點 缺點
Haar Cascades OpenCV GitHub 經典、教學常用 準確度有限,受光線影響
LBP Cascades OpenCV GitHub 偵測速度快 準確度比 Haar 稍低
DNN (Caffe 模型) OpenCV Model Zoo 準確度高,抗光線 模型檔案較大,需 DNN 模組

📂 檔案下載與使用說明

在進行人臉偵測與追蹤之前,需要先下載對應的模型檔案,並放到專案目錄或指定路徑。

Haar Cascades

  • 檔案名稱:haarcascade_frontalface_default.xml
  • 下載來源:OpenCV GitHub — haarcascades
  • 使用方式:
    1
    face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

LBP Cascades

  • 檔案名稱:lbpcascade_frontalface.xml
  • 下載來源:OpenCV GitHub — lbpcascades
  • 使用方式:
    1
    face_cascade = cv2.CascadeClassifier("lbpcascade_frontalface.xml")

DNN 模型 (Caffe)

💡 建議將這些檔案放在專案的 models/ 目錄下,並在程式中指定完整路徑,避免找不到檔案的錯誤。

🧠 函式與參數說明

📌 cv2.CascadeClassifier()

載入人臉偵測模型

1
cv2.CascadeClassifier(filename)
  • filename:XML 模型檔案路徑,例如 haarcascade_frontalface_default.xmllbpcascade_frontalface.xml

📌 detectMultiScale()

偵測人臉區域

1
faces = face_cascade.detectMultiScale(img, scaleFactor, minNeighbors, flags, minSize, maxSize)
  • img:要偵測的灰階圖片或影片幀。
  • scaleFactor:縮放比例,常用 1.1,表示每次縮小 10%。
  • minNeighbors:判斷人臉的嚴格程度,數值越大越嚴格。
  • flags:可選參數,通常設為 cv2.CASCADE_SCALE_IMAGE
  • minSize:最小人臉尺寸 (w, h)
  • maxSize:最大人臉尺寸 (w, h)

📌 cv2.dnn.readNetFromCaffe()

載入 DNN 模型

1
net = cv2.dnn.readNetFromCaffe(prototxt, model)
  • prototxt:模型結構檔案,例如 deploy.prototxt
  • model:訓練好的權重檔案,例如 res10_300x300_ssd_iter_140000.caffemodel

📌 cv2.dnn.blobFromImage()

將圖片轉換成 DNN 輸入格式

1
blob = cv2.dnn.blobFromImage(image, scalefactor, size, mean, swapRB, crop)
  • image:輸入圖片。
  • scalefactor:縮放比例,常用 1.0
  • size:輸入大小 (width, height),例如 (300, 300)
  • mean:減去的平均值 (R, G, B),例如 (104.0, 177.0, 123.0)
  • swapRB:是否交換 R 與 B 通道,常用 False
  • crop:是否裁切圖片,常用 False

📌 cv2.TrackerKCF_create()

建立 KCF 追蹤器

1
tracker = cv2.TrackerKCF_create()
  • 建立一個 KCF (Kernelized Correlation Filters) 追蹤器,用於追蹤人臉或物件。

📌 tracker.init()

初始化追蹤器

1
tracker.init(frame, bbox)
  • frame:影片幀。
  • bbox:初始框選區域 (x, y, w, h)

📌 tracker.update()

更新追蹤器位置

1
success, box = tracker.update(frame)
  • frame:影片幀。
  • success:布林值,表示是否成功追蹤。
  • box:新的框選區域 (x, y, w, h)

💻 範例程式 — Haar Cascades 人臉偵測 (圖片)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import cv2

face_cascade = cv2.CascadeClassifier("models/haarcascade_frontalface_default.xml")

img = cv2.imread("face.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.1, 5)

for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imshow("Haar Face Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


圖:圖片人臉偵測,框選人臉區域

💻 範例程式 — LBP Cascades 人臉偵測 (影片)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import cv2

face_cascade = cv2.CascadeClassifier("models/lbpcascade_frontalface.xml")
cap = cv2.VideoCapture("face.mp4")

while True:
ret, frame = cap.read()
if not ret:
break

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5)

for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

cv2.imshow("LBP Face Detection", frame)

if cv2.waitKey(30) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:影片人臉偵測,逐幀框選人臉區域

💻 範例程式 — DNN 人臉偵測 (影片)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import cv2

net = cv2.dnn.readNetFromCaffe("models/deploy.prototxt", "models/res10_300x300_ssd_iter_140000.caffemodel")
cap = cv2.VideoCapture("face.mp4")

while True:
ret, frame = cap.read()
if not ret:
break

h, w = frame.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,
(300, 300), (104.0, 177.0, 123.0))
net.setInput(blob)
detections = net.forward()

for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5:
box = detections[0, 0, i, 3:7] * [w, h, w, h]
(x1, y1, x2, y2) = box.astype("int")
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 255), 2)

cv2.imshow("DNN Face Detection", frame)

if cv2.waitKey(30) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:影片人臉偵測 (DNN),準確度更高

💻 範例程式 — 人臉偵測 + 追蹤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import cv2

# 使用 LBP 模型偵測人臉
face_cascade = cv2.CascadeClassifier("models/lbpcascade_frontalface.xml")
cap = cv2.VideoCapture("face.mp4")

tracker = None

while True:
ret, frame = cap.read()
if not ret:
break

# 如果追蹤器尚未建立,先偵測人臉
if tracker is None:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.1, 5)

if len(faces) > 0:
(x, y, w, h) = faces[0]
tracker = cv2.TrackerKCF_create()
tracker.init(frame, (x, y, w, h))
else:
# 更新追蹤器位置
success, box = tracker.update(frame)
if success:
(x, y, w, h) = [int(v) for v in box]
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 255), 2)
else:
# 若追蹤失敗,重置追蹤器
tracker = None

cv2.imshow("Face Tracking", frame)

if cv2.waitKey(30) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:影片人臉偵測與追蹤,持續追蹤人臉位置

⚠️ 注意事項

  • Haar 與 LBP 模型需先下載 XML 檔案並放在專案目錄。
  • DNN 模型需下載 deploy.prototxtres10_300x300_ssd_iter_140000.caffemodel
  • 偵測速度與準確度會因方法不同而有差異。
  • 追蹤器需要先偵測到人臉才能開始追蹤,若人臉消失需重新偵測。

📊 應用場景

  • 監控系統:即時偵測並追蹤人臉。
  • 互動應用:遊戲或互動程式中追蹤玩家人臉。
  • 隱私保護:結合馬賽克或模糊,遮蔽人臉。

🎯 結語

本篇我們學會了如何使用 OpenCV 人臉偵測與追蹤,並且比較了 Haar、LBP 與 DNN 三種方式。
這些技術在監控、互動應用與隱私保護中非常常見,後續可以延伸到 多物件偵測與追蹤,打造更智慧的影像系統。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
OpenCV 官方文件 — Tutorials
OpenCV 官方文件 — Python Tutorials
OpenCV GitHub — Haar Cascades
OpenCV GitHub — LBP Cascades
OpenCV GitHub — DNN Face Detector (deploy.prototxt)
GitHub — DNN 模型 res10_300x300_ssd_iter_140000.caffemodel
Pexels — 免費影片素材