使用Python + OpenCV來實現臉部和眼睛的檢測
本篇文章使用Python和OpenCV中的Haar特征分類器對人臉及眼睛進行檢測和追蹤。在開始之前,有幾件準備工作要完成。
- 第一,你需要有一個攝像頭,如果沒有的話也可以使用視頻文件來替代。
- 第二,需要在python中安裝OpenCV庫。具體的方法是在這里下載相應的wheel(.whl)文件,并使用pip進行安裝。
- 第三,下載OpenCV中的Haar特征分類器,你可以從Opencv官網下載源程序解壓后獲得Haar特征分類器,也可以直接下載所需的xml文件。
在完成準備工作后,我們開始進行人臉及眼睛的檢測和追蹤工作。首先導入所需使用的庫文件。這里我們只需要使用numpy和cv2兩個庫。
- #導入所需庫文件
- import numpy as np
- import cv2
加載Haar特征分類器中的面部識別和眼睛識別兩個xml文件。如何你還需要識別更多的元素也在這里一并加載。
- #加載面部識別文件(請按文件實際存儲路徑進行調整)
- #https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
- face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
- #加載眼部識別文件(請按文件實際存儲路徑進行調整)
- #https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_eye.xml
- eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
打開你的攝像頭來獲取視頻,到這一步攝像頭開始工作,但還沒有任何影像輸出。如果沒有攝像頭可以使用電腦里的視頻文件進行替代。
- #打開攝像頭獲取視頻
- cap = cv2.VideoCapture(0)
我們同時將對攝像頭獲取的圖像進行保存,這里對視頻文件進行處理并設置保存路徑及視頻尺寸。(這一步不是必須的操作)
- #編譯并輸出保存視頻
- fourcc = cv2.VideoWriter_fourcc(*'XVID')
- out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
開始獲取并處理視頻內容。下面是一個無限的循環結構,通過按鍵q可以結束循環。在這個循環中ret獲取攝像頭是否有返回的布爾值,img獲取攝像頭拍攝的視頻內容。我們首先將攝像頭獲取的彩色圖像轉化為灰度圖像。后續的操作將主要在灰度圖像上完成,然后再使用灰度圖像中的坐標對原始的彩色圖像進行標記和輸出。圖像轉化為灰度后首先進行人臉檢測,然后在人臉檢測的基礎上再進行眼睛檢測,這樣做的原因有兩點,1,避免面部以外的物體被錯誤的識別為眼睛,2,眼睛識別算法需要一些眼睛周圍的面部特征來進行檢測,從而提高準確率。
隨后使用矩形繪制出人臉的位置和眼睛的位置,在設置繪制顏色時需要注意,OpenCV中的顏色值并不是RGB,而是BRG。檢測和繪制完成后對圖像進行輸出。這時可以在視頻窗口中看到被標記的面部和眼睛。由于我們使用的Haar特征分類器是正面面部識別,因此需要正對攝像頭。如果面部發生偏轉則無法識別。
- #無限循環
- while(True):
- #獲取視頻及返回狀態
- ret, img = cap.read()
- #將獲取的視頻轉化為灰色
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- #檢測視頻中的人臉,并用vector保存人臉的坐標、大?。ㄓ镁匦伪硎荆?nbsp;
- faces = face_cascade.detectMultiScale(gray, 1.3, 5)
- #臉部檢測
- 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]
- #檢測視頻中臉部的眼睛,并用vector保存眼睛的坐標、大?。ㄓ镁匦伪硎荆?nbsp;
- eyes = eye_cascade.detectMultiScale(roi_gray)
- #眼睛檢測
- 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)
- #按q鍵退出while循環
- if cv2.waitKey(30) & 0xFF == ord('q'):
- break
退出while循環后釋放攝像頭,完成視頻輸出并關閉所有窗口。
- #釋放攝像頭
- cap.release()
- #關閉視頻輸出
- out.release()
- #關閉所有窗口
- cv2.destroyAllWindows()
以下是完整的人臉及眼睛檢測代碼:
- def face_eye():
- import numpy as np
- import cv2
- face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
- eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
- cap = cv2.VideoCapture(0)
- fourcc = cv2.VideoWriter_fourcc(*'XVID')
- out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
- while(True):
- ret, img = cap.read()
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- faces = face_cascade.detectMultiScale(gray, 1.3, 5)
- 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)
- 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)
- if cv2.waitKey(30) & 0xFF == ord('q'):
- break
- cap.release()
- out.release()
- cv2.destroyAllWindows()
- face_eye()
Read more: http://bluewhale.cc/2017-07-28/use-python-and-opencv-to-detect-faces-and-eyes.html#ixzz4o6BB3n4N