天天看點

Keras搭建CNN進行人臉識别系列(三)--利用haar級聯檢測器識别出人臉

人臉識别原理      

        從實時視訊流中識别出人臉區域,從原理上看,其依然屬于機器學習的領域之一,本質上與谷歌利用深度學習識别出貓沒有什麼差別。程式通過大量的人臉圖檔資料進行訓練,利用數學算法建立建立可靠的人臉特征模型,如此即可識别出人臉。幸運的是,這些工作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)      

運作效果