dlib人脸检测
import os
import dlib
import numpy as np
import cv2
def mkdir_for_save_images(img_path_save):
if not os.path.isdir(img_path_save):
os.mkdir(img_path_save)
def clear_images(img_path_save):
img_list = os.listdir(img_path_save)
for img in img_list:
os.remove(img_path_save + img)
def face_detector_save(img_path):
img_path_save = "save_img/"
# Dlib 正向人脸检测器
detector = dlib.get_frontal_face_detector()
# Dlib 人脸 landmark 特征点检测器
predictor = dlib.shape_predictor('data/dlib/shape_predictor_68_face_landmarks.dat')
# 新建文件夹, 清理存下来的图像文件
# mkdir_for_save_images(img_path_save)
# clear_images(img_path_save)
img = cv2.imread(img_path)
faces = detector(img, 1)
print("人脸数 / faces in all:", len(faces), '\n')
for i, d in enumerate(faces): # 绘制人脸区域
# cv2.rectangle(img, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255), 2)
cv2.rectangle(img, (int(d.left() - (d.right() - d.left()) / 6), int(d.top() - (d.bottom() - d.top()) / 2)),
(int(d.right() + (d.right() - d.left()) / 6), int(d.bottom() + (d.bottom() - d.top()) / 10)),
(0, 0, 255), 2)
# cv2.imwrite(img_path_save + "img_face_" + img_path + ".jpg", img)
for num, face in enumerate(faces):
# 计算矩形框大小
# height = face.bottom() - face.top()
# width = face.right() - face.left()
height = int(face.bottom() + (face.bottom() - face.top()) / 10) - int(
face.top() - (face.bottom() - face.top()) / 2)
# # print(height)
width = int(face.right() + (face.right() - face.left()) / 6) - int(
face.left() - (face.right() - face.left()) / 6)
# print(width)
# 根据人脸大小生成空的图像
img_blank = np.zeros((height, width, 3), np.uint8)
for i in range(height):
for j in range(width):
# img_blank[i][j] = img[face.top() + i][face.left() + j]
img_blank[i][j] = img[int(face.top() - (face.bottom() - face.top()) / 2) + i][
int(face.left() - (face.right() - face.left()) / 6) + j]
img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_CUBIC)
# 灰度化
gray_img = cv2.cvtColor(img_blank, cv2.COLOR_BGR2GRAY)
img_blank = cv2.medianBlur(gray_img, 5)
# cv2.imshow("median_blur_demo", dst)
# cv2.imshow("face_" + str(num + 1), img_blank)
# img_blank = cv2.resize(img_blank, (200, 200), interpolation=cv2.INTER_CUBIC)
# 存在本地
print("Save into:", img_path_save + "img_face_" + str(num + 1) + ".jpg")
# gray_img = cv2.cvtColor(img_blank, cv2.COLOR_BGR2GRAY)
cv2.imwrite(img_path_save + "img_face_" + str(num + 1) + ".jpg", img_blank)
# cv2.namedWindow("img_faces") # , 2)
# cv2.imshow("img_faces", img)
cv2.waitKey(0)
def video_read(video=None, video_path_save = None, Show=True, Write=False):
#=====================================
# https://blog.csdn.net/weixin_40922285/article/details/102967331
cap = cv2.VideoCapture(video) # 生成读取视频对象
n = 1 # 计数
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频的宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频的高度
fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频的帧率
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 视频的编码
# 定义视频输出
writer = cv2.VideoWriter("result.avi", fourcc, fps, (width, height))
import time
k = 0
timeF = 5 # 视频帧计数间隔频率
# while cap.isOpened():
while True:
s = time.time()
ret, frame = cap.read() # 按帧读取视频
# 到视频结尾时终止
if ret is False:
break
# 每隔timeF帧进行存储操作
if (n % timeF == 0):
# frame = cv2.resize(frame, None, fx=0.5, fy=0.5)
k += 1
detector = dlib.get_frontal_face_detector()
faces = detector(frame, 1)
for i, d in enumerate(faces): # 绘制人脸区域
# cv2.rectangle(frame, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255), 2)
cv2.rectangle(frame,
(int(d.left() - (d.right() - d.left()) / 6), int(d.top() - (d.bottom() - d.top()) / 2)),
(int(d.right() + (d.right() - d.left()) / 6),
int(d.bottom() + (d.bottom() - d.top()) / 10)),
(0, 0, 255), 2)
print("人脸数 / Faces in all:", len(faces), "\n")
print("time {}".format(time.time() - s))
writer.write(frame)
print('保存第 %s 张图像' % k)
save_image_dir = video_path_save +"%s.jpg" % k
print("Save into:", save_image_dir)
cv2.imwrite(save_image_dir, frame) # 保存视频帧图像
face_detector_save(save_image_dir)
# cv2.imshow("frame", frame)
# video_img_save_path = "save_img/"
# face_detector_save(save_image_dir)
n = n + 1
if n > 100:
break
# cv2.waitKey(1) # 延时1ms
cv2.destroyAllWindows()
cap.release() # 释放视频对象
if __name__ == '__main__':
Video_File = 'videos/1.mp4'
# Video_File = 'videos/'
# Video_File = 'videos/'
video_read(Video_File,"save_video/", Show=True, Write=False)
# Show: Show the result on the monitor
# Write: Save the result as a new video
print('—————————— Project Finish ——————————')
人脸检测保存图片:
# Author: coneypo
# Blog: http://www.cnblogs.com/AdaminXie
# GitHub: https://github.com/coneypo/Dlib_face_cut
import dlib
import numpy as np
import cv2
import os
# Dlib 正向人脸检测器
detector = dlib.get_frontal_face_detector()
# Dlib 人脸 landmark 特征点检测器
predictor = dlib.shape_predictor('data/dlib/shape_predictor_68_face_landmarks.dat')
# 读取图像的路径
#path_read = "data/images/faces_for_test/"
# path = "imgs/18.jpg"
# 用来存储生成的单张人脸的路径
# img_path_save = "save_img/"
def mkdir_for_save_images(img_path_save):
if not os.path.isdir(img_path_save):
os.mkdir(img_path_save)
def clear_images(img_path_save):
img_list = os.listdir(img_path_save)
for img in img_list:
os.remove(img_path_save + img)
def face_detector_save(img_path, img_path_save):
# 新建文件夹, 清理存下来的图像文件
# mkdir_for_save_images(img_path_save)
# clear_images(img_path_save)
img = cv2.imread(img_path)
faces = detector(img, 1)
print("人脸数 / faces in all:", len(faces), '\n')
for i, d in enumerate(faces): # 绘制人脸区域
# cv2.rectangle(img, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255), 2)
cv2.rectangle(img, (int(d.left() - (d.right() - d.left()) / 6), int(d.top() - (d.bottom() - d.top()) / 2)),
(int(d.right() + (d.right() - d.left()) / 6), int(d.bottom() + (d.bottom() - d.top()) / 10)),
(0, 0, 255), 2)
# cv2.imwrit