天天看點

OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)

OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)

文章目錄

  • 一、資料和知識準備
    • 1. 下載下傳HAAR與LBP資料
    • 2. opencv相關知識
  • 二、python+opencv實作人臉檢測
  •           1. 圖像單人臉檢測

              2. 圖像多人臉檢測

              3. 視訊中人臉檢測

              4. 攝像頭人臉檢測

    一、資料和知識準備

    1. 下載下傳HAAR與LBP資料

    人臉檢測的常見步驟如下,如果想要将人臉準确地檢測出來,需要通過建立人臉模型,擷取準确區分人臉的分類器,這裡我們使用網上公開的擴充包或已經訓練好的分類器。

    将haarcascades與lbpcascades裡面的相關xml檔案下載下傳到本地,便于之後調用,輔助進行人臉檢測。

    下載下傳位址:https://github.com/opencv/opencv/tree/master/data

    OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)

    2. opencv相關知識

    cv.CascadeClassifier():是OpenCV中人臉檢測的一個級聯分類器,既可以使用Haar特征,也可以使用LBP特征。以Haar特征分類器為基礎的對象檢測技術是一種非常有效的技術,它是基于機器學習且使用大量的正負樣本訓練得到分類器。

    detectMultiScale函數:檢測人臉算法,其參數如下:

    image:要檢測的輸入圖像

    scaleFactor:表示每次圖像尺寸減小的比例

    minNeighbors:表示每一個目标至少要被檢測到多少次才算是真的人臉,因為周圍的像素和不同的視窗大小都可能檢測成人臉

    minSize:表示目标的最小尺寸

    maxSize:表示目标的最小尺寸

    Haar-like矩形特征:是用于物體檢測的數字圖像特征。這類矩形特征模闆由兩個或多個全等的黑白矩形相鄰組合而成,而矩形特征值是白色矩形的灰階值的和減去黑色矩形的灰階值的和,矩形特征對一些簡單的圖形結構,如線段、邊緣比較敏感。如果把這樣的矩形放在一個非人臉區域,那麼計算出的特征值應該和人臉特征值不一樣,是以這些矩形就是為了把人臉特征量化,以區分人臉和非人臉。

    LBP:是一種特征提取方式,能提取出圖像的局部的紋理特征,最開始的LBP算子是在3X3視窗中,取中心像素的像素值為閥值,與其周圍八個像素點的像素值比較,若像素點的像素值大于閥值,則此像素點被标記為1,否則标記為0。這樣就能得到一個八位二進制的碼,轉換為十進制即LBP碼,于是得到了這個視窗的LBP值,用這個值來反映這個視窗内的紋理資訊。LBPH是在原始LBP上的一個改進,在opencv支援下可以直接調用函數直接建立一個LBPH人臉識别的模型。

    比如:cv2.face.LBPHFaceRecognizer_create()。

  • 二、python+opencv實作人臉檢測

    1. 圖像單人臉檢測

    import cv2 as cv
    
    
    
    
    def face_detection(image):
        # 建立一個級聯分類器 加載一個.xml分類器檔案 它既可以是Haar特征也可以是LBP特征的分類器
        face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
        # 多個尺度空間進行人臉檢測   傳回檢測到的人臉區域坐标資訊
        faces = face_detecter.detectMultiScale(image=image, scaleFactor=1.1, minNeighbors=5)
        print('檢測人臉資訊如下:\n', faces)
        for x, y, w, h in faces:
            # 在原圖像上繪制矩形辨別
            cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
        cv.imshow('result', image)
    
    
    
    
    src = cv.imread(r'./test/036.jpg')
    cv.imshow('input image', src)
    face_detection(src)
    cv.waitKey(0)
    cv.destroyAllWindows()
               

運作效果如下:

檢測人臉資訊如下:
 [[ 61  53 110 110]]


Process finished with exit code 0


           
OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)

2. 圖像多人臉檢測

import cv2 as cv




def face_detection(image):
  # 轉成灰階圖像
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    # 建立一個級聯分類器 加載一個.xml分類器檔案 它既可以是Haar特征也可以是LBP特征的分類器
    face_detecter = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')
    # 多個尺度空間進行人臉檢測   傳回檢測到的人臉區域坐标資訊
    faces = face_detecter.detectMultiScale(image=gray, scaleFactor=1.1, minNeighbors=5)
    print('檢測人臉資訊如下:\n', faces)
    for x, y, w, h in faces:
        # 在原圖像上繪制矩形辨別
        cv.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
    cv.imshow('result', image)




src = cv.imread(r'./test/044.jpg')
cv.imshow('input image', src)
face_detection(src)
cv.waitKey(0)
cv.destroyAllWindows()


           

運作效果如下:

檢測人臉資訊如下:
 [[329 157  49  49]
 [ 88 156  44  44]
 [157 158  54  54]
 [240 159  50  50]
 [ 86 370  68  68]
 [ 79 254  54  54]
 [339 250  58  58]
 [155 254  59  59]
 [251 247  59  59]
 [199 371  80  80]
 [308 370  69  69]]


Process finished with exit code 0


           
OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)

3. 視訊中人臉檢測

import cv2




# 加載視訊
cap = cv2.VideoCapture('test.mp4')
# 建立一個級聯分類器 加載一個.xml分類器檔案 它既可以是Haar特征也可以是LBP特征的分類器
face_detect = cv2.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')


while True:
    # 讀取視訊片段
    ret, frame = cap.read()
    if not ret:  # 讀完視訊後falg傳回False
        break
    frame = cv2.resize(frame, None, fx=0.5, fy=0.5)
    # 灰階處理
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 多個尺度空間進行人臉檢測   傳回檢測到的人臉區域坐标資訊
    face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=8)
    # 繪制矩形和圓形檢測人臉
    for x, y, w, h in face_zone:
        cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
        cv2.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
    # 顯示圖檔
    cv2.imshow('video', frame)
    # 設定退出鍵和展示頻率
    if ord('q') == cv2.waitKey(40):
        break


# 釋放資源
cv2.destroyAllWindows()
cap.release()


           

截取新版倚天屠龍記某一集36:35到36:39的片段,簡單實作實時檢測人臉并顯示,運作效果如下:

OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)
OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)
OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)

任何算法都不會100%識别準确,由于噪聲、誤差、算法、訓練集等影響,某些時候也會出現一些錯誤識别。自己進行簡單測試時也會發現,人物動作、視訊中鏡頭切換過快、背景變化等因素,可能會造成對視訊中人臉檢測不準确。

4. 攝像頭人臉檢測

import cv2 as cv




# 識别電腦攝像頭并打開
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
# 建立一個級聯分類器 加載一個.xml分類器檔案 它既可以是Haar特征也可以是LBP特征的分類器
face_detect = cv.CascadeClassifier(r'./face_detection/haarcascades/haarcascade_frontalface_default.xml')


while True:
    # 讀取視訊片段
    flag, frame = cap.read()
    frame = cv.flip(frame, 1)
    if not flag:   # 讀完視訊後falg傳回False
        break
    # 灰階處理
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 多個尺度空間進行人臉檢測   傳回檢測到的人臉區域坐标資訊
    face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
    # 繪制矩形和圓形檢測人臉
    for x, y, w, h in face_zone:
        cv.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2)
        cv.circle(frame, center=(x + w // 2, y + h // 2), radius=w // 2, color=[0, 255, 0], thickness=2)
    # 顯示圖檔
    cv.imshow('video', frame)
    # 設定退出鍵q 展示頻率
    if ord('q') == cv.waitKey(30):
        break


# 釋放資源
cv.destroyAllWindows()
cap.release()


           

程式運作,即可調用電腦的攝像頭識别面對攝像頭的人臉,正臉和靜止狀态檢測人臉的效果好。

OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)

- END -

歡迎關注公衆号:Python爬蟲資料分析挖掘,友善及時閱讀最新文章

記錄學習python的點點滴滴;

回複【開源源碼】免費擷取更多開源項目源碼;

OpenCV圖像人臉檢測及視訊中的人臉檢測(附源碼)

繼續閱讀