Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测
Pyhton,OpenCV對(duì)象檢測(cè)之——Haar級(jí)聯(lián)人臉及眼睛檢測(cè)
- 1. 效果圖
- 2. 原理
- 2.1 Haar人臉檢測(cè)原理
- 2.2 Haar級(jí)聯(lián)預(yù)訓(xùn)練的模型
- 3. 源碼
- 3.1 圖像面部及眼睛檢測(cè)
- 3.2 視頻幀面部及眼睛檢測(cè)
- 參考
這篇博客將介紹如何使用預(yù)訓(xùn)練的模型——基于Haar特征的級(jí)聯(lián)檢測(cè)器進(jìn)行人臉及眼睛檢測(cè)。
使用基于 Haar 特征的級(jí)聯(lián)分類器的對(duì)象檢測(cè)是一種有效的對(duì)象檢測(cè)方法。它是一種基于機(jī)器學(xué)習(xí)的方法,其中級(jí)聯(lián)函數(shù)是從大量正面和負(fù)面圖像中訓(xùn)練出來(lái)的,然后使用它來(lái)檢測(cè)圖像中的對(duì)象。
1. 效果圖
單人面部及眼睛檢測(cè)效果圖如下:
多人面部及眼睛檢測(cè)效果圖如下:
2. 原理
2.1 Haar人臉檢測(cè)原理
使用人臉檢測(cè)。最初該算法需要大量的正面圖像(人臉圖像)和負(fù)面圖像(沒有人臉的圖像)來(lái)訓(xùn)練分類器。然后從中提取特征。對(duì)于每個(gè)特征,它會(huì)找到將人臉?lè)诸悶檎婧拓?fù)面的最佳閾值。但很明顯會(huì)有錯(cuò)誤或錯(cuò)誤分類。
每一次選擇錯(cuò)誤率最小的特征,這意味著它們是對(duì)人臉和非人臉圖像進(jìn)行最佳分類的特征。
人臉即便是 24*24 的圖像,也有近160000個(gè)特征,Haar級(jí)聯(lián)分類器將特征降到了6000個(gè)。并且引入了分類級(jí)聯(lián)器的概念。不是在一個(gè)窗口上應(yīng)用所有 6000 個(gè)特征,而是將特征分組到分類器的不同階段并逐一應(yīng)用。 (通常前幾個(gè)階段將包含非常少的功能)。如果窗口在第一階段失敗,則丟棄它。如果通過(guò),則應(yīng)用第二階段的功能并繼續(xù)該過(guò)程。通過(guò)所有階段的窗口是面部區(qū)域。
Haar 檢測(cè)器有 6000 多個(gè)特征,分為 38 個(gè)階段,前五個(gè)階段有 1、10、25、25 和 50 個(gè)特征。 平均而言,每個(gè)子窗口會(huì)評(píng)估 6000 多個(gè)特征中的 10 個(gè)特征。
2.2 Haar級(jí)聯(lián)預(yù)訓(xùn)練的模型
OpenCV庫(kù)維護(hù)一個(gè)預(yù)先訓(xùn)練好的Haar級(jí)聯(lián)庫(kù)。包括:
- haarcascade_frontalface_default.xml:檢測(cè)面部
- haarcascade_eye.xml:檢測(cè)左眼和右眼
- haarcascade_smile.xml:檢測(cè)面部是否存在嘴部
- haarcascade_eye_tree_eyeglasses.xml:檢測(cè)是否帶墨鏡🕶
- haarcascade_frontalcatface.xml:檢測(cè)貓臉
- haarcascade_frontalcatface_extended.xml:檢測(cè)貓臉延伸
- haarcascade_frontalface_alt.xml:檢測(cè)貓臉屬性
- haarcascade_frontalface_alt_tree.xml
- haarcascade_frontalface_alt2.xml
- haarcascade_fullbody.xml:檢測(cè)全身
- haarcascade_lefteye_2splits.xml:檢測(cè)左眼
- haarcascade_licence_plate_rus_16stages.xml:檢測(cè)證件
- haarcascade_lowerbody.xml:檢測(cè)下半身
- haarcascade_profileface.xml
- haarcascade_righteye_2splits.xml:檢測(cè)右眼
- haarcascade_russian_plate_number.xml:檢測(cè)俄羅斯字母車牌號(hào)
- haarcascade_upperbody.xml:檢測(cè)上半身
3. 源碼
3.1 圖像面部及眼睛檢測(cè)
# Haar級(jí)聯(lián)檢測(cè)器對(duì)臉、眼睛👀進(jìn)行檢測(cè)import cv2# 加載預(yù)訓(xùn)練的臉、眼睛檢測(cè)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)# 檢測(cè)臉
faces = face_cascade.detectMultiScale(gray, 1.3, 5)# 遍歷每一張臉,并繪制面部ROI為藍(lán)色
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]# 在面部進(jìn)行眼睛的檢測(cè)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 視頻幀面部及眼睛檢測(cè)
# 獲取網(wǎng)絡(luò)攝像頭,并捕獲幀,檢測(cè)面部及眼睛👀,并且計(jì)算輪廓的中心及外接圓半徑,在面部繪制紫色圓圈,在眼睛上繪制藍(lán)色圓圈
import argparseimport cv2# 檢測(cè)面部并顯示
def detectAndDisplay(frame):frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)frame_gray = cv2.equalizeHist(frame_gray)# 檢測(cè)面部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]# 在每一張臉上,檢測(cè)眼睛👀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_cascadeface_cascade = cv2.CascadeClassifier()
eyes_cascade = cv2.CascadeClassifier()# 1. 加載級(jí)聯(lián)檢測(cè)器(面部及眼睛👀檢測(cè))
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!')breakdetectAndDisplay(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
總結(jié)
以上是生活随笔為你收集整理的Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Postgresql:删除及查询字段中包
- 下一篇: OpenCV-Python绑定如何工作及