Pyhton,OpenCV物件檢測之——Haar級聯人臉及眼睛檢測
- 1. 效果圖
- 2. 原理
- 2.1 Haar人臉檢測原理
- 2.2 Haar級聯預訓練的模型
- 3. 原始碼
- 3.1 影像面部及眼睛檢測
- 3.2 視頻幀面部及眼睛檢測
- 參考
這篇博客將介紹如何使用預訓練的模型——基于Haar特征的級聯檢測器進行人臉及眼睛檢測,
使用基于 Haar 特征的級聯分類器的物件檢測是一種有效的物件檢測方法,它是一種基于機器學習的方法,其中級聯函式是從大量正面和負面影像中訓練出來的,然后使用它來檢測影像中的物件,
1. 效果圖
單人面部及眼睛檢測效果圖如下:

多人面部及眼睛檢測效果圖如下:

2. 原理
2.1 Haar人臉檢測原理
使用人臉檢測,最初該演算法需要大量的正面影像(人臉影像)和負面影像(沒有人臉的影像)來訓練分類器,然后從中提取特征,對于每個特征,它會找到將人臉分類為正面和負面的最佳閾值,但很明顯會有錯誤或錯誤分類,
每一次選擇錯誤率最小的特征,這意味著它們是對人臉和非人臉影像進行最佳分類的特征,
人臉即便是 24*24 的影像,也有近160000個特征,Haar級聯分類器將特征降到了6000個,并且引入了分類級聯器的概念,不是在一個視窗上應用所有 6000 個特征,而是將特征分組到分類器的不同階段并逐一應用, (通常前幾個階段將包含非常少的功能),如果視窗在第一階段失敗,則丟棄它,如果通過,則應用第二階段的功能并繼續該程序,通過所有階段的視窗是面部區域,
Haar 檢測器有 6000 多個特征,分為 38 個階段,前五個階段有 1、10、25、25 和 50 個特征, 平均而言,每個子視窗會評估 6000 多個特征中的 10 個特征,
2.2 Haar級聯預訓練的模型
OpenCV庫維護一個預先訓練好的Haar級聯庫,包括:
- haarcascade_frontalface_default.xml:檢測面部
- haarcascade_eye.xml:檢測左眼和右眼
- haarcascade_smile.xml:檢測面部是否存在嘴部
- haarcascade_eye_tree_eyeglasses.xml:檢測是否帶墨鏡🕶
- haarcascade_frontalcatface.xml:檢測貓臉
- haarcascade_frontalcatface_extended.xml:檢測貓臉延伸
- haarcascade_frontalface_alt.xml:檢測貓臉屬性
- haarcascade_frontalface_alt_tree.xml
- haarcascade_frontalface_alt2.xml
- haarcascade_fullbody.xml:檢測全身
- haarcascade_lefteye_2splits.xml:檢測左眼
- haarcascade_licence_plate_rus_16stages.xml:檢測證件
- haarcascade_lowerbody.xml:檢測下半身
- haarcascade_profileface.xml
- haarcascade_righteye_2splits.xml:檢測右眼
- haarcascade_russian_plate_number.xml:檢測俄羅斯字母車牌號
- haarcascade_upperbody.xml:檢測上半身
3. 原始碼
3.1 影像面部及眼睛檢測
# Haar級聯檢測器對臉、眼睛👀進行檢測
import cv2
# 加載預訓練的臉、眼睛檢測XML模型
face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_eye.xml')
# 加載影像或者視頻幀(灰度圖)
img = cv2.imread('images/rbyy.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 檢測臉
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 遍歷每一張臉,并繪制面部ROI為藍色
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
roi_gray = gray[y:y + h, x:x + w]
roi_color = img[y:y + h, x:x + w]
# 在面部進行眼睛的檢測
eyes = eye_cascade.detectMultiScale(roi_gray)
# 繪制眼睛ROI為綠色
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3.2 視頻幀面部及眼睛檢測
# 獲取網路攝像頭,并捕獲幀,檢測面部及眼睛👀,并且計算輪廓的中心及外接圓半徑,在面部繪制紫色圓圈,在眼睛上繪制藍色圓圈
import argparse
import cv2
# 檢測面部并顯示
def detectAndDisplay(frame):
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame_gray = cv2.equalizeHist(frame_gray)
# 檢測面部
faces = face_cascade.detectMultiScale(frame_gray)
for (x, y, w, h) in faces:
center = (x + w // 2, y + h // 2)
frame = cv2.ellipse(frame, center, (w // 2, h // 2), 0, 0, 360, (255, 0, 255), 4)
faceROI = frame_gray[y:y + h, x:x + w]
# 在每一張臉上,檢測眼睛👀
eyes = eyes_cascade.detectMultiScale(faceROI)
for (x2, y2, w2, h2) in eyes:
eye_center = (x + x2 + w2 // 2, y + y2 + h2 // 2)
radius = int(round((w2 + h2) * 0.25))
frame = cv2.circle(frame, eye_center, radius, (255, 0, 0), 4)
cv2.imshow('Capture - Face detection', frame)
parser = argparse.ArgumentParser(description='Code for Cascade Classifier tutorial.')
parser.add_argument('--face_cascade', help='Path to face cascade.',
default='haarcascades/haarcascade_frontalface_alt.xml')
parser.add_argument('--eyes_cascade', help='Path to eyes cascade.',
default='haarcascades/haarcascade_eye_tree_eyeglasses.xml')
parser.add_argument('--camera', help='Camera divide number.', type=int, default=0)
args = parser.parse_args()
face_cascade_name = args.face_cascade
eyes_cascade_name = args.eyes_cascade
face_cascade = cv2.CascadeClassifier()
eyes_cascade = cv2.CascadeClassifier()
# 1. 加載級聯檢測器(面部及眼睛👀檢測)
if not face_cascade.load(face_cascade_name):
print('--(!)Error loading face cascade')
exit(0)
if not eyes_cascade.load(eyes_cascade_name):
print('--(!)Error loading eyes cascade')
exit(0)
camera_device = args.camera
# 2.讀取視頻幀
cap = cv2.VideoCapture(camera_device)
if not cap.isOpened:
print('--(!)Error opening video capture')
exit(0)
while True:
ret, frame = cap.read()
if frame is None:
print('--(!) No captured frame -- Break!')
break
detectAndDisplay(frame)
# 按下ESC鍵,退出~
if cv2.waitKey(10) == 27:
break
參考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html#face-detection
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293272.html
標籤:其他
上一篇:Python,OpenCV中的影像修復——cv2.inpaint()
下一篇:開始使用OpenCV
