python使用dlib进行人脸检测和关键点的示例
作者:dangxusheng 发布时间:2021-12-14 20:56:04
标签:python,dlib,人脸检测
#!/usr/bin/env python
# -*- coding:utf-8-*-
# file: {NAME}.py
# @author: jory.d
# @contact: dangxusheng163@163.com
# @time: 2020/04/10 19:42
# @desc: 使用dlib进行人脸检测和人脸关键点
import cv2
import numpy as np
import glob
import dlib
FACE_DETECT_PATH = '/home/build/dlib-v19.18/data/mmod_human_face_detector.dat'
FACE_LANDMAKR_5_PATH = '/home/build/dlib-v19.18/data/shape_predictor_5_face_landmarks.dat'
FACE_LANDMAKR_68_PATH = '/home/build/dlib-v19.18/data/shape_predictor_68_face_landmarks.dat'
def face_detect():
root = '/media/dangxs/E/Project/DataSet/VGG Face Dataset/vgg_face_dataset/vgg_face_dataset/vgg_face_dataset'
imgs = glob.glob(root + '/**/*.jpg', recursive=True)
assert len(imgs) > 0
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(FACE_LANDMAKR_68_PATH)
for f in imgs:
img = cv2.imread(f)
# The 1 in the second argument indicates that we should upsample the image
# 1 time. This will make everything bigger and allow us to detect more
# faces.
dets = detector(img, 1)
print("Number of faces detected: {}".format(len(dets)))
for i, d in enumerate(dets):
x1, y1, x2, y2 = d.left(), d.top(), d.right(), d.bottom()
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
i, x1, y1, x2, y2))
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 1)
# Get the landmarks/parts for the face in box d.
shape = predictor(img, d)
print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1)))
# # Draw the face landmarks on the screen.
'''
# landmark 顺序: 外轮廓 - 左眉毛 - 右眉毛 - 鼻子 - 左眼 - 右眼 - 嘴巴
'''
for i in range(shape.num_parts):
x, y = shape.part(i).x, shape.part(i).y
cv2.circle(img, (x, y), 2, (0, 0, 255), 1)
cv2.putText(img, str(i), (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.3, (0, 0, 255), 1)
cv2.resize(img, dsize=None, dst=img, fx=2, fy=2)
cv2.imshow('w', img)
cv2.waitKey(0)
def face_detect_mask():
root = '/media/dangxs/E/Project/DataSet/VGG Face Dataset/vgg_face_dataset/vgg_face_dataset/vgg_face_dataset'
imgs = glob.glob(root + '/**/*.jpg', recursive=True)
assert len(imgs) > 0
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(FACE_LANDMAKR_68_PATH)
for f in imgs:
img = cv2.imread(f)
# The 1 in the second argument indicates that we should upsample the image
# 1 time. This will make everything bigger and allow us to detect more
# faces.
dets = detector(img, 1)
print("Number of faces detected: {}".format(len(dets)))
for i, d in enumerate(dets):
x1, y1, x2, y2 = d.left(), d.top(), d.right(), d.bottom()
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
i, x1, y1, x2, y2))
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 1)
# Get the landmarks/parts for the face in box d.
shape = predictor(img, d)
print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1)))
# # Draw the face landmarks on the screen.
'''
# landmark 顺序: 外轮廓 - 左眉毛 - 右眉毛 - 鼻子 - 左眼 - 右眼 - 嘴巴
'''
points = []
for i in range(shape.num_parts):
x, y = shape.part(i).x, shape.part(i).y
if i < 26:
points.append([x, y])
# cv2.circle(img, (x, y), 2, (0, 0, 255), 1)
# cv2.putText(img, str(i), (x,y),cv2.FONT_HERSHEY_COMPLEX, 0.3 ,(0,0,255),1)
# 只把脸切出来
points[17:] = points[17:][::-1]
points = np.asarray(points, np.int32).reshape(-1, 1, 2)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
black_img = np.zeros_like(img)
cv2.polylines(black_img, [points], 1, 255)
cv2.fillPoly(black_img, [points], (1, 1, 1))
mask = black_img
masked_bgr = img * mask
# 位运算时需要转化成灰度图像
mask_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
masked_gray = cv2.bitwise_and(img_gray, img_gray, mask=mask_gray)
cv2.resize(img, dsize=None, dst=img, fx=2, fy=2)
cv2.imshow('w', img)
cv2.imshow('mask', mask)
cv2.imshow('mask2', masked_gray)
cv2.imshow('mask3', masked_bgr)
cv2.waitKey(0)
if __name__ == '__main__':
face_detect()
来源:https://www.cnblogs.com/dxscode/p/12676293.html
0
投稿
猜你喜欢
- isset和is_null啥区别,看手册上讲的话, isset和is_null的功能几乎完全”相反的一样”..是不是isset就是一个is_
- 前言在学习go语言时,做算法题会很经常遇到go语言的各种int类型,为什么会有int、int8、int16等等的类型呢?为什么不像java一
- 字典的本质就是 hash 表,hash 表就是通过 key 找到其 value ,平均情况下你只需要花费 O(1) 的时间复杂度即可以完成对
- PYTHON Pandas批量读取csv文件到DATAFRAME首先使用glob.glob获得文件路径。然后定义一个列表,读取文件后再使用c
- docker安装mysql版本8.0.20,供大家参考,具体内容如下第一步 下拉镜像docker pull mysql:8.0.20第二步
- 本文实例讲述了python使用 request 发送表单数据操作。分享给大家供大家参考,具体如下:# !/usr/bin/env pytho
- 循环结构的应用场景如果在程序中我们需要重复的执行某条或某些指令,例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就
- 导入执行后VM292:1 thirdScriptError sdk uncaught third Error mod
- 本文实例为大家分享了Vue日期时间选择器组件的具体代码,供大家参考,具体内容如下1.效果图如下单选日期选择器多选日期选择器日期时间选择器2.
- 前言利用JS实现对form表单登录提交的验证在大多数web中都会使用到。首先,我们要使用JavaScript的一个库:jQuery,jQue
- 今天训练faster R-CNN时,发现之前跑的很好的程序(是指在运行程序过程中,显卡利用率能够一直维持在70%以上),今天看的时候,显卡利
- 本文代码实现Python多线程扫描端口,具体实现代码如下。#coding:utf-8import socketimport threadim
- 先来看javascript的直接写在了input上 <input name="pwuser" type="
- 前言最近经历了一次服务器SQL SERVER 数据库服务器端事务日志爆满,导致服务器数据库写入不进数据的宕机事件,经过此次事件的发生,奉劝各
- 前言orztop是一款实时show full processlist的工具,我们可以实时看到数据库有哪些线程,执行哪些语句等。工具使用方便简
- 有效地加载数据有时我们需大量地把数据加载到数据表,采用批量加载的方式比一个一个记录加载效率高,因为MySQL不用每加载一条记录就刷新一次索引
- 建表、insert数据create table tmp_login ( user_id int(11) , logi
- 第一种,在方法后面加问号,然后执行,如 abs?第二种,光标移动到方法上面,按shift+tab,弹出文档,连续按选择文档详细程度补充知识:
- 定义通用视图修改 book/models.py 代码中的 AuthorInfo 类,如果一致则不必修改class AuthorInfo(mo
- 实现一个柱状图,这个柱状图的高度在不停的刷新,效果如下:官网是没有动态刷新的示例的,由于需要我查看了其源码,并根据之前示例做出了动态柱状图的