[Python]Python基於OpenCV批量提取視頻中的人臉並保存


最近在寫我們數組圖像處理課程的人臉識別作業,需要大量的人臉數據。

而一個一個的照也很麻煩,所以就寫了這樣一個程序(借鑒了網上已有的視頻讀幀),我們提前錄制好視頻

然后程序逐幀讀取,然后分割出其中的人臉,轉換為指定大小並轉為灰度圖

效率很不錯,一個幾十秒的視頻就能提取出幾百張臉部數據(缺點就是這些臉很相似)

#-*- 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") #參數為視頻地址

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM