OpenCV——根據Haar級聯資料進行靜態人臉檢測
阿新 • • 發佈:2018-12-16
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)
執行結果: