【导读】本文是专栏《计算机视觉40例简介》的第34个案例《勾勒五官轮廓》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。 目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。 大家可以在公众号“计算机视觉之光”回复关键字【案例34】获取本文案例的源代码及使用的测试图片等资料。 针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。 本文简要介绍了本案例的一些基础知识,更详细的理论介绍、代码实现等内容请参考《计算机视觉40例简介》第27章《dlib库》以获取更详细信息。 |
Dlib是一个现代工具包,包含机器学习算法和工具,用于在程序中构造软件来解决复杂的现实世界问题。它被工业界和学术界广泛应用于机器人、嵌入式设备、移动电话和大型高性能计算环境等领域。Dlib的开源许可允许用户在任何应用程序中免费使用它。
Dlib官网提供了非常翔实的资料,对它的函数有非常具体的使用说明。除此以外,Dlib官网还提供了大量的案例帮助我们快速掌握该工具的使用。
本章中,我们使用Dlib实现几个跟人脸识别相关的具有代表性的案例,具体如下:
本章中所使用的模型均可在Dlib官网下载。
通过人脸的关键点,可以勾勒出人脸的五官如图1所示。这里,我们针对人脸分别使用连接线条和绘制凸包轮廓处理。
图1 运行结果
1 绘制连接线条
针对脸颊、眉毛、鼻子等五官,直接采用连接关键点方式,将关键点连接起来构成其大致轮廓。具体步骤如下:
步骤1:获取当前五官所对应的关键点集。即获取当前五官的关键点从哪个索引开始,到哪个索引结束。例如,脸颊的关键点索引从0开始到16结束。
步骤2:在关键点集合中索引相邻的两个关键点之间绘制直线,将相邻的关键点连接。例如,在构造脸颊轮廓时,分别将相邻的关键点使用直线连接,即可得到脸颊的轮廓。
根据上述思路,构造函数drawLine绘制五官对应的轮廓,具体如下:
- 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)
2 绘制凸包轮廓
针对眼睛、嘴等封闭区域构造凸包,并绘制其对应的轮廓。基本步骤如下:
步骤1:获取某个特定五官所对应的关键点索引集。例如,左眼所对应的关键点集是索引从42到47的各个关键点所构成的。
步骤2:根据关键点集,获取当前五官的凸包。
步骤3:根据凸包,绘制当前五官的轮廓。
根据上述思路,构造函数drawConvexHull,具体如下:
- def drawConvexHull(start,end):
-
- # 获取某个特定五官的点集
-
- Facial = shape[start:end]
-
- # 针对该五官构造凸包
-
- mouthHull = cv2.convexHull(Facial)
-
- # 把凸包轮廓绘制出来
-
- cv2.drawContours(image, [mouthHull], -1, (0, 255, 0), 2)
当然,眼睛、嘴也可以用通过直线绘制。但是,使用凸包绘制轮廓,更方便进行颜色填充等设置。
在《计算机视觉40例——从入门到深度学习(OpenCV-Python)》第27章《dlib库》中详细介绍了定位人脸、绘制关键点、勾勒五官轮廓、人脸对齐、调用CNN实现人脸检测等案例。
《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。