人臉識别原理
從實時視訊流中識别出人臉區域,從原理上看,其依然屬于機器學習的領域之一,本質上與谷歌利用深度學習識别出貓沒有什麼差別。程式通過大量的人臉圖檔資料進行訓練,利用數學算法建立建立可靠的人臉特征模型,如此即可識别出人臉。幸運的是,這些工作OpenCV已經幫我們做了,我們隻需調用對應的API函數即可,先給出代碼:
# -*- coding: utf-8 -*-
import cv2
import sys
from PIL import Image
def CatchUsbVideo(window_name, camera_idx):
cv2.namedWindow(window_name)
# 視訊來源,可以來自一段已存好的視訊,也可以直接來自USB攝像頭
cap = cv2.VideoCapture(camera_idx)
# 告訴OpenCV使用人臉識别分類器
classfier = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
# 識别出人臉後要畫的邊框的顔色,RGB格式
color = (0, 255, 0)
while cap.isOpened():
ok, frame = cap.read() # 讀取一幀資料
if not ok:
break
# 将目前幀轉換成灰階圖像
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人臉檢測,1.2和2分别為圖檔縮放比例和需要檢測的有效點數
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
if len(faceRects) > 0: # 大于0則檢測到人臉
for faceRect in faceRects: # 單獨框出每一張人臉
x, y, w, h = faceRect
cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 2)
# 顯示圖像
cv2.imshow(window_name, frame)
c = cv2.waitKey(10)
if c & 0xFF == ord('q'):
break
# 釋放攝像頭并銷毀所有視窗
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
CatchUsbVideo("FaceRecongition", 0)