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
















 
 
 

















 
 
 
 