前言
dlib 库的轮廓绘制功能,主要基于其强大的图像处理和机器学习算法。在进行轮廓绘制前,往往需要先通过相关算法对图像中的目标物体进行检测和定位,确定目标区域。之后,dlib 会根据目标物体在图像中的像素分布和特征,准确提取出边界信息,进而实现轮廓绘制。
一、Dlib轮廓绘制
1、什么是轮廓绘制
在Dlib中,人脸识别的轮廓绘制是指通过检测人脸的关键点位置,使用直线或曲线连接这些关键点,从而绘制出人脸的轮廓线条。这些关键点通常包括眉毛、眼睛、鼻子、嘴巴等部位的位置。通过绘制人脸轮廓,可以对人脸进行更精确的分析和识别。
2、步骤
-
1)导入所需的库和模型
使用Dlib库进行人脸识别,需要导入相应的库和模型文件。 -
2)加载人脸检测器
使用Dlib提供的人脸检测器模型,加载并初始化人脸检测器。 -
3)读取图像
将待处理的图像读取到内存中。 -
4)人脸检测
使用人脸检测器对图像进行人脸检测,获取人脸的位置信息。 -
5)关键点定位
使用Dlib提供的关键点检测器模型,对检测到的人脸进行关键点定位,即确定人脸的眼睛、鼻子、嘴巴等部位的位置。 -
6)绘制轮廓线条
通过将关键点的位置连接起来,使用直线或曲线绘制出人脸的轮廓线条。 -
7)展示结果
将绘制好的轮廓线条展示在图像上,并可将结果保存或显示出来。
二、案例实现
1、完整代码
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()
在上述代码中:
- 首先,加载 dlib 的人脸检测器和 68 个关键点的预测模型,这是后续操作的基础。
- 然后,读取图像并将其转换为灰度图,以满足 dlib 算法的处理要求。
- 接着,使用人脸检测器在灰度图上检测人脸,获取人脸区域。
- 针对每个检测到的人脸,利用关键点预测模型获取关键点坐标。
- 从关键点中提取脸部轮廓对应的关键点,将其整理成适合cv2.drawContours函数处理的格式。
- 最后,使用 OpenCV 的cv2.drawContours函数在原始图像上绘制出脸部轮廓。
运行结果:
2、实时摄像头或视频检测
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()
三、dlib 轮廓绘制的应用场景
- 医学影像分析:在 X 光、CT 等医学影像中,通过轮廓绘制可以清晰勾勒出病变组织、器官的边界,辅助医生进行病情诊断和治疗方案制定。
- 工业检测:在工业生产中,对产品进行轮廓绘制,能够快速检测产品的形状、尺寸是否符合标准,及时发现产品缺陷,提高产品质量和生产效率。
- 自动驾驶:在自动驾驶系统中,通过绘制道路边界、车辆、行人等物体的轮廓,帮助车辆感知周围环境,实现精准的导航和避障。
艺术创作与图像处理:在图像编辑软件中,利用轮廓绘制功能可以实现图像分割、特效添加等创意操作,为艺术创作提供更多可能性。
总结
通过学习和实践,我们可以利用 dlib 库高效地完成图像轮廓绘制任务,为计算机视觉相关的应用开发提供有力支持。