1. 程式人生 > >檢測一張圖片中的多個人臉、裁剪出所有的人臉區域並儲存裁剪後的人臉影象

檢測一張圖片中的多個人臉、裁剪出所有的人臉區域並儲存裁剪後的人臉影象

我可愛的導師叫我去收集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)

注意事項

  1. predictor = dlib.shape_predictor(‘E:/3Python_learn/Face/shape_predictor_68_face_landmarks.dat’),這個路徑寫你.dat檔案存的路徑
  2. 通過減小d.left(),減小d.top(),增加d.right(),增加d.bottom 擴大裁剪區域
    畫圖示意

服用說明

  1. 先把你要檢測的原圖都放在一個資料夾
  2. 然後先檢測第一張 比如1.jpg
  3. 假設顯示第一張圖片有18張人臉。
  4. 開啟你的儲存路徑,你看到生成了編號為1~18的18張人臉圖
  5. 這時候你要檢測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)
  6. 檢測第三張圖片,依此類推