最近在寫咱們數組圖像處理課程的人臉識別做業,須要大量的人臉數據。數組
而一個一個的照也很麻煩,因此就寫了這樣一個程序(借鑑了網上已有的視頻讀幀),咱們提早錄製好視頻app
而後程序逐幀讀取,而後分割出其中的人臉,轉換爲指定大小並轉爲灰度圖ide
效率很不錯,一個幾十秒的視頻就能提取出幾百張臉部數據(缺點就是這些臉很類似)spa
#-*- coding: UTF-8 -*- import cv2 from PIL import Image name = 'name' def getface(path): cap = cv2.VideoCapture(path) classfier = cv2.CascadeClassifier("/home/coding/workspace/haarcascades/haarcascade_frontalface_alt2.xml") suc = cap.isOpened() # 是否成功打開 frame_count = 0 out_count = 0 while suc: frame_count += 1 if out_count > 599: #最多取出多少張 break suc, frame = cap.read() #讀取一幀 params = [] params.append(2) # params.append(1) grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #將當前楨圖像轉換成灰度圖像 faceRects = classfier.detectMultiScale(grey, scaleFactor = 1.2, minNeighbors = 3, minSize = (32, 32)) #讀取臉部位置 if len(faceRects) > 0: #大於0則檢測到人臉 for faceRect in faceRects: #單獨框出每一張人臉 x, y, w, h = faceRect image = frame[y - 10: y + h + 10, x - 10: x + w + 10] image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #轉爲灰度圖 img_new = cv2.resize(image,(47,57), interpolation = cv2.INTER_CUBIC) #處理面部的大小 cv2.imwrite('/home/coding/workspace/Data/'+ name +'/%d.jpg' % out_count, img_new, params) #存儲到指定目錄 out_count += 1 print('成功提取'+ name +'的第%d個臉部'%out_count) break #每幀只獲取一張臉,刪除這個即爲讀出所有面部 cap.release() cv2.destroyAllWindows() print('總幀數:', frame_count) print('提取臉部:',out_count) if __name__ == '__main__': getface("/home/coding/workspace/Data/Videos/"+ name +".mp4") #參數爲視頻地址