參考博客:(人臉識別2-2)——利用opencv內置分類器檢測人臉
在cv2的源碼文件夾下,可看到存放了很多的已經訓練好的分類器,我們可進行替換來嘗試。
注意代碼中的路徑爲從cv2的路徑。
# -*-coding:utf-8 -*-
import cv2
def facedetect(windowname, camera_id):
# 命名和打開攝像頭,詳情見上一篇
cv2.namedWindow(windowname)
cap = cv2.VideoCapture(camera_id) # 獲取攝像頭
# cap = cv2.VideoCapture('H:/video.m4s') #通過本地的視頻進行測試
classfier = cv2.CascadeClassifier(
'G:/annconda/Lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml') # 加載分類器,分類器位置可以自行更改
color = (0, 0, 255) # 人臉框的顏色,採用rgb模型,這裏表示g取255,爲綠色框
while cap.isOpened():
ok, frame = cap.read()
if not ok:
break
grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 圖像灰度化
faceRects = classfier.detectMultiScale(grey, scaleFactor=1.15, minNeighbors=5,
minSize=(5, 5)) # 利用分類器檢測灰度圖像中的人臉矩陣數,1.15和5分別爲圖片縮放比例和需要檢測的有效點數
if len(faceRects) > 0: # 大於0則檢測到人臉
for faceRect in faceRects: # 單獨框出每一張人臉
x, y, w, h = faceRect # 獲取框的左上的座標,框的長寬
cv2.rectangle(frame, (x, y), (x + w, y + h), color, 3) # 用矩形框框出人臉
cv2.imshow(windowname, frame) # 顯示圖像
c = cv2.waitKey(1) # 每10ms一幀
if c & 0xFF == ord('q'): # 退出條件
break
cap.release() # 釋放攝像頭並銷燬所有窗口
cv2.destroyAllWindows()
if __name__ == '__main__': # 主程序
print('face detecting... ')
facedetect('facedetect', 0)