檢測一張圖片中的多個人臉、裁剪出所有的人臉區域並儲存裁剪後的人臉影象
阿新 • • 發佈:2018-12-21
我可愛的導師叫我去收集50個人臉正樣本和50個列印攻擊的人臉負樣本~
python程式碼
# 2018-01-24 # By TimeStamp # https://blog.csdn.net/weixin_40674835/article/details/79424339 # 2018.11.14 modified by wuxiaoli import dlib # 人臉識別的庫dlib import numpy as np # 資料處理的庫numpy import cv2 # 影象處理的庫OpenCv # dlib預測器 detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor('E:/3Python_learn/Face/shape_predictor_68_face_landmarks.dat') ## # 讀取影象的路徑 path_read = "E:/3Python_learn/face-anti_spoofing/data/print-attack/" img = cv2.imread(path_read+"3.jpg") # 用來儲存生成的單張人臉的路徑 path_save = "E:/3Python_learn/face-anti_spoofing/data/result/50-0/" # dlib檢測 dets = detector(img,1) print("人臉數:", len(dets)) for k, d in enumerate(dets): # 計算矩形大小 # (x,y), (寬度width, 高度height) # 這裡的16是為了加大擷取區域,為減少後續人臉對齊產生的黑邊,你可以把這個值設定的更大,這樣裁剪的區域就更大 pos_start = tuple([d.left()-16, d.top()-16]) pos_end = tuple([d.right()+16, d.bottom()+16]) # 計算矩形框大小 height = d.bottom()-d.top()+32 width = d.right()-d.left()+32 # 根據人臉大小生成空的影象 img_blank = np.zeros((height, width, 3), np.uint8) for i in range(height): for j in range(width): img_blank[i][j] = img[d.top()-16+i][d.left()-16+j] cv2.imshow("face_"+str(k+1), img_blank) cv2.imwrite(path_save+"img_face_"+str(k+1)+".jpg", img_blank) cv2.waitKey(0)
注意事項
- predictor = dlib.shape_predictor(‘E:/3Python_learn/Face/shape_predictor_68_face_landmarks.dat’),這個路徑寫你.dat檔案存的路徑
- 通過減小d.left(),減小d.top(),增加d.right(),增加d.bottom 擴大裁剪區域
服用說明
- 先把你要檢測的原圖都放在一個資料夾
- 然後先檢測第一張 比如1.jpg
- 假設顯示第一張圖片有18張人臉。
- 開啟你的儲存路徑,你看到生成了編號為1~18的18張人臉圖
- 這時候你要檢測2.jpg。首先你要把1.jpg改成2.jpg,其次把cv2.imwrite(path_save+“img_face_”+str(k+1)+".jpg", img_blank)改成cv2.imwrite(path_save+“img_face_”+str(k+1+18)+".jpg", img_blank)
- 檢測第三張圖片,依此類推