基礎理論部分可參見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()
需要注意的點是:
- 進入opencv安裝路徑下的cv2文件夾下的data子文件夾中將相應的.xml文件拷貝到項目路徑下。
- 視頻中的人臉檢測這個函數對應的代碼我沒跑,因爲臺式電腦沒攝像頭,筆記本電腦不想配環境,但應該是可以正常運行的。具體理解可參考開頭鏈接裏的解釋。
- 這個理論介紹的鏈接裏文檔感覺對於這部分講解太過於理論,不是很簡潔明瞭,可以自己查閱一些相關視頻或者文章幫助理解。
結果圖:
失敗的例子:很多臉沒檢測出來,大部分臉也沒檢測出來。