目录
一、Dlib轮廓绘制
1、什么是轮廓绘制
在Dlib中,人脸识别的轮廓绘制是指通过检测人脸的关键点位置,使用直线或曲线连接这些关键点,从而绘制出人脸的轮廓线条。这些关键点通常包括眉毛、眼睛、鼻子、嘴巴等部位的位置。通过绘制人脸轮廓,可以对人脸进行更精确的分析和识别。
2、步骤
1)导入所需的库和模型
使用Dlib库进行人脸识别,需要导入相应的库和模型文件。
2)加载人脸检测器
使用Dlib提供的人脸检测器模型,加载并初始化人脸检测器。
3)读取图像
将待处理的图像读取到内存中。
4)人脸检测
使用人脸检测器对图像进行人脸检测,获取人脸的位置信息。
5)关键点定位
使用Dlib提供的关键点检测器模型,对检测到的人脸进行关键点定位,即确定人脸的眼睛、鼻子、嘴巴等部位的位置。
6)绘制轮廓线条
通过将关键点的位置连接起来,使用直线或曲线绘制出人脸的轮廓线条。
7)展示结果
将绘制好的轮廓线条展示在图像上,并可将结果保存或显示出来。
二、案例实现
1、完整代码
python
import numpy as np
import dlib
import cv2
def drawLine(start,end): # 将指定的点连接起来
pts = shape[start:end] # 索引遍历出来关键点的坐标
for l in range(1,len(pts)):
ptA = tuple(pts[l-1]) # 遍历第一个点开始
ptB = tuple(pts[l]) # 遍历上一个点的后一个点
cv2.line(image, ptA, ptB,(0,255,0),2) # 将两个点连接起来
def drawConvexHull(start,end):
# 将指定的点构成一个凸包,绘制成轮廓,一般眼睛、嘴使用凸包用来绘制
Facial = shape[start:end + 1] # 索引的方式获取关键点的坐标
mouthHull = cv2.convexHull(Facial) # 凸包函数,用于计算二维点集的凸包,凸包是覆盖所有点的最小凸多边形,返回凸包的点集,或者叫二维顶点
cv2.drawContours(image,[mouthHull], -1,(0, 255, 0), 2) # 绘制检测到的凸包轮廓,-1表示绘制所有轮廓
image = cv2.imread("people2.png") # 读取图片
detector = dlib.get_frontal_face_detector() # 构造脸部位置检测器
faces = detector(image,0) # 检测人脸。返回检测到的人脸
# 读取人脸关键点定位模型
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
for face in faces: # 遍历检测到人脸
shape = predictor(image,face) # 调用关键点检测器,获取人脸的关键点
# 将关键点转换为坐标(x,y)的形式
shape = np.array([[p.x,p.y] for p in shape.parts()]) # 获取每个人脸的关键点坐标
drawConvexHull(36,41) # 绘制右眼凸包,因为眼睛的关键点索引为36-41,凸包是覆盖所有点的最小凸多边形
drawConvexHull(48, 59) # 绘制左眼凸包
drawConvexHull(48,59) # 绘制嘴外部凸包
drawConvexHull(60, 67) # 绘制嘴内部凸包
drawLine(0,17) # 绘制脸颊点线,将脸上的点都连接起来
drawLine(17, 22)
drawLine(22, 27)
drawLine(27, 36)
cv2.imshow("Frame",image)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
2、实时摄像头或视频检测
python
def drawLine(start,end):#将指定的点连接起水
pts = shape[start:end] #获取点集
for l in range(1,len(pts)):
ptA = tuple(pts[l-1])
ptB = tuple(pts[l])
cv2.line(image, ptA, ptB,(0,255,0),2)
def drawConvexHull(start,end):
# 将指定的点构成一个凸包,绘制成轮廓,一般眼睛、嘴使用凸包用来绘制
Facial = shape[start:end + 1]
mouthHull = cv2.convexHull(Facial) # 凸包函数
cv2.drawContours(image,[mouthHull], -1,(0, 255, 0), 2)
cap = cv2.VideoCapture("笑容.mp4")
if not cap.isOpened(): # 如果打开失败
print("Cannot open camera")
exit() # 终止程序
detector = dlib.get_frontal_face_detector() # 构造脸部位置检测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
while True:
ret, image = cap.read()
faces = detector(image,0) # 检测人险方位置
# 读取入脸关键点定位模型
for face in faces:# 对检测到的rects,还个遍历
shape = predictor(image,face)# 获取关键点
# 将关键点转换为坐标(x,y)的形式
shape = np.array([[p.x,p.y] for p in shape.parts()])
drawConvexHull(36,41) # 绘制右眼凸包
drawConvexHull(48, 59) # 绘制左眼凸包
drawConvexHull(48,59) # 绘制嘴外部凸包
drawConvexHull(60, 67) # 绘制嘴内部凸包
drawLine(0,17) # 绘制脸颊点线
drawLine(17, 22)
drawLine(22, 27)
drawLine(27, 36)
cv2.imshow("Frame",image)
k = cv2.waitKey(20) # 每一帧画面执行20毫秒
if k == 27: # 如果键盘点击esc键,终止循环
break
cv2.destroyAllWindows()