1. 程式人生 > >OpenCV——根據Haar級聯資料進行靜態人臉檢測

OpenCV——根據Haar級聯資料進行靜態人臉檢測

Haar級聯

由於燈光、視角、視距、攝像頭抖動以及數字噪聲的變化,一個影象的細節可能會變得不穩定。但是人們在分類時卻不會受這些物理細節方面差異的影響。因此,提取出影象的細節對產生穩定分類結果和跟蹤結果很有用。即:從影象中提取特徵。雖然任意畫素都可能影響多個特徵,但特徵應該比畫素數少得多。由此兩個影象的相似程度可以通過它們對應特徵的歐氏距離來度量。

類Haar特徵是一種用於實現實時人臉跟蹤的特徵。每個類Haar特徵都描述了相鄰影象區域的對比模式。

對給定的影象,特徵可能會因區域大小而有所不同,區域大小也可被稱為視窗大小。但是,僅在尺度上不同的兩幅影象也應該有相似的特徵。因此,能為不同大小的視窗生成特徵非常有用。這些特徵集合稱為級聯

。Haar級聯具有尺度不變性,但是不具有旋轉不變性。

Demo

下面這個示例程式的步驟為:

  • 使用cv2.CascadeClassifier()函式載入Haar級聯資料。
  • 讀取影象並轉化為灰度。
  • 使用detectMultiScale()函式獲取人臉。
  • 使用cv2.rectangle()函式在人臉上繪製矩形。

detectMultiScale()函式的兩個重要引數:

  • scaleFactor為每一個影象尺度中的尺度引數,預設值為1.1。scale_factor引數可以決定兩個不同大小的視窗掃描之間有多大的跳躍,這個引數設定的大,則意味著計算會變快,但如果視窗錯過了某個大小的人臉,則可能丟失物體。
  • minNeighbors引數為每一個級聯矩形應該保留的鄰近個數,預設為3。minNeighbors控制著誤檢測,預設值為3表明至少有3次重疊檢測,我們才認為人臉確實存在。

示例程式原始碼:

# 靜態影象中的人臉檢測

import cv2

filename = 'vikings.jpg'


def detect(filename):
    face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
    img = cv2.imread(filename)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x, y, w, h) in faces:
        img = cv2.rectangle(img, (x, y), (x + w, y + h), (0,255, 0), 2)

    cv2.namedWindow('Vikings Detected!!')
    cv2.imshow('Vikings Detected!!', img)
    cv2.imwrite('vikings_detected.jpg', img)
    cv2.waitKey(0)


detect(filename)

執行結果:

在這裡插入圖片描述

附錄