opencv_python圖像處理——Haar特徵描述算子-人臉檢測

基礎理論部分可參見Datawhale 計算機視覺基礎-圖像處理(下)-Task03 Haar特徵描述算子-人臉檢測

import cv2
import numpy as np

haar_front_face_xml = 'haarcascade_frontalface_default.xml'
haar_eye_xml = 'haarcascade_eye.xml'


# 1.靜態圖像中的人臉檢測
def StaticDetect(filename):
    # 創建一個級聯分類器 加載一個 .xml 分類器文件. 它既可以是Haar特徵也可以是LBP特徵的分類器.
    face_cascade = cv2.CascadeClassifier(haar_front_face_xml)
    eye_cascade = cv2.CascadeClassifier(haar_eye_xml)

    # 加載圖像
    img = cv2.imread(filename)
    # 轉換爲灰度圖
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 進行人臉檢測,傳入scaleFactor,minNegihbors,分別表示人臉檢測過程中每次迭代時圖像的壓縮率以及
    # 每個人臉矩形保留近似數目的最小值
    # 返回人臉矩形數組
    faces = face_cascade.detectMultiScale(gray_img, 1.3, 5)
    for (x, y, w, h) in faces:
        # 在原圖像上繪製矩形
        img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

        roi_gray = gray_img[y:y + h, x:x + w]
        # 眼睛檢測
        eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40, 40))
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(img, (ex + x, ey + y), (x + ex + ew, y + ey + eh), (0, 255, 0), 2)

    cv2.namedWindow('Face Detected!')
    cv2.imshow('Face Detected!', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


# 2、視頻中的人臉檢測
def DynamicDetect():
    '''
    打開攝像頭,讀取幀,檢測幀中的人臉,掃描檢測到的人臉中的眼睛,對人臉繪製藍色的矩形框,對人眼繪製綠色的矩形框
    '''
    # 創建一個級聯分類器 加載一個 .xml 分類器文件. 它既可以是Haar特徵也可以是LBP特徵的分類器.
    face_cascade = cv2.CascadeClassifier(haar_front_face_xml)
    eye_cascade = cv2.CascadeClassifier(haar_eye_xml)

    # 打開攝像頭
    camera = cv2.VideoCapture(0)
    cv2.namedWindow('Dynamic')

    while True:
        # 讀取一幀圖像
        ret, frame = camera.read()
        # 判斷圖片讀取成功?
        if ret:
            gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            # 人臉檢測
            faces = face_cascade.detectMultiScale(gray_img, 1.3, 5)
            for (x, y, w, h) in faces:
                # 在原圖像上繪製矩形
                cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
                roi_gray = gray_img[y:y + h, x:x + w]
                # 眼睛檢測
                eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40, 40))
                for (ex, ey, ew, eh) in eyes:
                    cv2.rectangle(frame, (ex + x, ey + y), (x + ex + ew, y + ey + eh), (0, 255, 0), 2)

            cv2.imshow('Dynamic', frame)
            # 如果按下q鍵則退出
            if cv2.waitKey(100) & 0xff == ord('q'):
                break

    camera.release()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    filename = 'img/faces2.jpg'
    StaticDetect(filename)
    # DynamicDetect()

需要注意的點是:

  1. 進入opencv安裝路徑下的cv2文件夾下的data子文件夾中將相應的.xml文件拷貝到項目路徑下。
  2. 視頻中的人臉檢測這個函數對應的代碼我沒跑,因爲臺式電腦沒攝像頭,筆記本電腦不想配環境,但應該是可以正常運行的。具體理解可參考開頭鏈接裏的解釋。
  3. 這個理論介紹的鏈接裏文檔感覺對於這部分講解太過於理論,不是很簡潔明瞭,可以自己查閱一些相關視頻或者文章幫助理解。
    結果圖:
    在這裏插入圖片描述
    失敗的例子:很多臉沒檢測出來,大部分臉也沒檢測出來。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章