轉自:https://www.cnblogs.com/neo-T/p/6430583.html
OpenCV已經幫我們做了,我們只需調用對應的API函數即可,先給出代碼:
1 # -*- coding: utf-8 -*- 2 3 ##關鍵字無法關閉 攝像頭,可能是代碼縮進問題。顯示圖像 在for 裏面是無法推出的 4 import sys 5 from PIL import Image 6 import cv2 7 8 def AICatchVideo(v_name, camera_index): 9 # 打開攝像頭 ,視頻來源,也可以使用已存的視頻 10 cap = cv2.VideoCapture(0) 11 # 創建窗口 12 cv2.namedWindow(v_name) 13 # 加載人臉數據(人臉特徵),#告訴OpenCV使用人臉識別分類器 14 face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_alt2.xml') 15 while True: 16 ret, frame = cap.read() 17 if not ret: 18 # 等待用戶操作 19 cv2.waitKey(30) 20 # 得到每一幀-》圖像計算 21 # 灰度轉換:轉換成灰度的圖計算強度得以減低 22 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 23 # 對比 攝像頭採集到的數據-》人臉特徵訓練集 24 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5,minSize=(32,32)) 25 if len(faces)>0: 26 27 for (x, y, w, h) in faces: 28 # 在窗口中識別人臉,畫一個矩形 29 frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) 30 #顯示圖像 31 cv2.imshow(v_name, frame) 32 key = cv2.waitKey(20) 33 if key & 0xFF == ord('q'): 34 break 35 36 # 窗口釋放:緩存-》內存條 37 cap.release() 38 cv2.destroyAllWindows() 39 40 41 if __name__ == '__main__': 42 # print(len(sys.argv)) 43 # print('內容是'+ sys.argv[0]) 44 # if len(sys.argv) != 2: 45 # print('Usage:%s camera_id:{}'.format(sys.argv[0])) 46 # else: 47 AICatchVideo('識別人臉區域', sys.argv[0])
#告訴OpenCV使用人臉識別分類器 classfier = cv2.CascadeClassifier("./haarcascade_frontalface_alt2.xml")
這行代碼指定OpenCV選擇使用哪種分類器(注意,一定習慣分類這個說法,ML的監督學習研究的就是各種分類問題),OpenCV提供了多種分類器:
對同一個畫面有可能出現多張人臉,因此,我們需要用一個for循環將所有檢測到的人臉都讀取出來,然後逐個用矩形框框出來,這就是接下來的for語句的作用。Opencv會給出每張人臉在圖像中的起始座標(左上角,x、y)以及長、寬(h、w),我們據此就可以截取出人臉。其中,cv2.rectangle()完成畫框的工作,在這裏我有意識的外擴了10個像素以框出比人臉稍大一點的區域。cv2.rectangle()函數的最後兩個參數一個用於指定矩形邊框的顏色,一個用於指定矩形邊框線條的粗細程度。