Python | OpenCV 專案:即時人臉辨識系統
📚 前言
在上一篇 即時濾鏡相機 中,我們完成了第一個整合專案。
這一篇進入更有挑戰性的應用:即時人臉辨識系統。
不只是「偵測到臉」,而是能辨識出「這張臉是誰」,並在即時畫面中顯示姓名與信心度。
這個專案不依賴深度學習框架,完全使用 OpenCV 內建的 LBPH(Local Binary Pattern Histogram)演算法即可完成。
🎯 專案目標
- 蒐集多人的人臉樣本
- 訓練 LBPH 辨識模型
- 影片辨識,顯示姓名與信心度
- 支援隨時新增人員(重新蒐集 + 重新訓練)
🗃️ 專案結構
1 | face_recognition/ |
🎬 準備影片素材
本篇以影片檔取代即時攝影機,不需要攝影機設備也不涉及個人隱私即可完整練習。
建議使用公開演講影片(例如 TED Talks,採 Creative Commons 授權),正面清晰、光線穩定,非常適合人臉辨識練習。每位人員各準備一段演講影片,另外再準備一段測試用影片(建議選不同段落,讓辨識測試更有說服力)。
使用 yt-dlp 下載:
1 | # install_yt_dlp.sh |
此處示範使用 TED Talks 的兩部影片:
- How Nearly Dying Helped Me Discover My Own Cure (and Many More) | David Fajgenbaum | TED
- Why You Should Spend Less Time with Your Kids | Lenore Skenazy | TED
1
2yt-dlp -f "mp4[height<=720]" -o "assets/person_a.mp4" https://youtu.be/sb34MfJjurc?si=2EmEQuSZXCo7QOq_
yt-dlp -f "mp4[height<=720]" -o "assets/person_b.mp4" https://youtu.be/whaesnYloMQ?si=GO29UO0xsB00NCgQ - person_a 影片後處理兩段影片分別為訓練影片與驗證影片
1
240 - 60 秒 ⭢ person_a 00_00_40-00_01_00.mp4
60 - 120 秒 ⭢ person_a 00_01_00-00_01_20.mp4 - person_b 影片後處理兩段影片分別為訓練影片與驗證影片
1
240 - 60 秒 ⭢ person_b 00_00_40-00_01_00.mp4
60 - 120 秒 ⭢ person_b 00_01_00-00_01_20.mp4
💻 步驟一:蒐集人臉樣本
1 | # 1_collect.py |

圖:從影片逐幀偵測人臉,每隔 N 幀截取一次,自動儲存灰階人臉圖片,累積到指定樣本數後結束
💡 每位人員執行一次,修改
person_id、person_name與video_path後重新執行,即可累積多人資料集。
📷 改用即時攝影機:將
video_path那行改為cap = cv2.VideoCapture(0),並移除frame_interval的跳幀邏輯(或設為1),即可改用攝影機即時蒐集,程式邏輯完全相同。
💻 步驟二:訓練辨識模型
1 | # 2_train.py |

圖:讀取所有人員的人臉樣本,使用 LBPH 演算法訓練辨識模型並儲存為 yml 與 JSON 標籤檔
⚠️
cv2.face需要opencv-contrib-python:pip install opencv-contrib-python
💻 步驟三:影片辨識
1 | # 3_recognize.py |

圖:載入 LBPH 模型對測試影片進行辨識,依信心度顯示姓名或 Unknown 並標示邊界框
📷 改用即時攝影機:將
video_path = "assets/test.mp4"改為cap = cv2.VideoCapture(0),即可改為即時攝影機辨識,程式邏輯完全相同。
💻 新增人員
只需:
- 修改
1_collect.py的person_id(遞增)、person_name與video_path,重新執行蒐集 - 重新執行
2_train.py訓練(會自動載入所有已蒐集的資料) - 重新執行
3_recognize.py
不需要修改任何辨識邏輯。
⚠️ 注意事項
- 影片品質:蒐集樣本的影片建議選正面清晰、光線均勻的片段,避免快速搖晃或逆光。
- LBPH 對光線敏感:蒐集影片與測試影片的光線環境差異越小,辨識率越高。
- 信心度閾值需要調整:
CONFIDENCE_THRESHOLD = 80是參考值,不同影片品質與光線條件可能需要調高或調低。 - 樣本多樣性:若影片角度過於單一,辨識率可能偏低,建議選取包含多種頭部角度的片段。
frame_interval設定:影片較短但樣本需求量大時可調低;角度變化緩慢時可調高以增加多樣性。opencv-contrib-python與opencv-python不能同時安裝:若已安裝opencv-python,需先pip uninstall opencv-python再安裝opencv-contrib-python。
🎯 結語
LBPH 人臉辨識輕量且不需要 GPU,適合在本機快速建立小規模的人員辨識系統。
若需要更高準確度(例如跨光線、跨角度),可考慮改用 face_recognition 套件(基於深度學習的人臉嵌入向量)。
下一篇將進入 OpenCV 專案:車牌辨識應用,結合輪廓分析與 OCR,識別圖片中的車牌號碼。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
註:以上參考了
OpenCV 官方文件 — Face Recognition
OpenCV LBPH Face Recognizer