1. 程式人生 > >Keras搭建CNN進行人臉識別系列(三)--利用haar級聯檢測器識別出人臉

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)

這裡我們使用了一個現成的opencv版本的haar-casscade人臉識別xml配置檔案,這裡我們給出這個級聯檔案的連結:https://download.csdn.net/download/qq_35747066/10760507。下載下來之後放在工程資料夾中,即與程式碼同一個資料夾內。

執行效果

opencv自帶的級聯器效果還是不錯的!