Python | OpenCV 人臉偵測與追蹤
📚 前言
在前一篇我們學會了 即時馬賽克與模糊處理。
這一篇要進一步介紹 人臉偵測與追蹤,並且提供三種常見方式:
- Haar Cascades
- LBP Cascades
- 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)
- 檔案名稱:
deploy.prototxtres10_300x300_ssd_iter_140000.caffemodel
- 下載來源:
- 使用方式:
1
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "res10_300x300_ssd_iter_140000.caffemodel")
💡 建議將這些檔案放在專案的
models/目錄下,並在程式中指定完整路徑,避免找不到檔案的錯誤。
🧠 函式與參數說明
📌 cv2.CascadeClassifier()
載入人臉偵測模型
1 | cv2.CascadeClassifier(filename) |
- filename:XML 模型檔案路徑,例如
haarcascade_frontalface_default.xml或lbpcascade_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 | import cv2 |

圖:圖片人臉偵測,框選人臉區域
💻 範例程式 — LBP Cascades 人臉偵測 (影片)
1 | import cv2 |

圖:影片人臉偵測,逐幀框選人臉區域
💻 範例程式 — DNN 人臉偵測 (影片)
1 | import cv2 |

圖:影片人臉偵測 (DNN),準確度更高
💻 範例程式 — 人臉偵測 + 追蹤
1 | import cv2 |

圖:影片人臉偵測與追蹤,持續追蹤人臉位置
⚠️ 注意事項
- Haar 與 LBP 模型需先下載 XML 檔案並放在專案目錄。
- DNN 模型需下載
deploy.prototxt與res10_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 — 免費影片素材
