当前位置: 首页 > news >正文

人脸特征可视化进阶:用 dlib+OpenCV 绘制面部轮廓与器官凸包

在上一篇内容中,我们实现了 68 点人脸关键点的检测与标记,但单个的点仅能展示特征位置,无法直观呈现面部器官的整体形态。本文将基于已检测到的关键点,通过线段连接凸包绘制两种方式,实现面部轮廓、眉毛、眼睛、嘴巴等器官的可视化,让人脸特征的呈现更清晰、更具实用性。

一、核心技术:为什么需要线段连接与凸包?

68 点关键点本身是离散的坐标,要形成有意义的面部结构,需要通过特定算法将其 “关联” 起来:

  • 线段连接:适用于轮廓类特征(如下颌线、眉毛、鼻梁),通过按顺序连接相邻关键点,直接勾勒出特征的线性形态;
  • 凸包(Convex Hull):适用于闭合器官(如眼睛、嘴巴),通过计算关键点的凸包,生成包含所有关键点的最小凸多边形,能准确呈现器官的轮廓范围(即使部分关键点位置有微小偏差,凸包也能保证轮廓的完整性)。

二、完整代码实现与核心逻辑解析

1. 完整代码

import numpy as np
import dlib
import cv2# 函数1:按顺序连接关键点(绘制线性轮廓)
def drawLine(start, end):# 获取从start到end索引的关键点(左闭右开区间)pts = shape[start:end]  # 遍历关键点,依次连接相邻两点for l in range(1, len(pts)):ptA = tuple(pts[l - 1])  # 前一个关键点坐标ptB = tuple(pts[l])      # 当前关键点坐标# 绘制线段:绿色(0,255,0),线宽2像素cv2.line(image, ptA, ptB, (0, 255, 0), 2)# 函数2:绘制关键点的凸包(闭合器官轮廓)
def drawConvexHull(start, end):# 获取从start到end索引的关键点(左闭右闭区间,需+1)facial_pts = shape[start:end + 1]# 计算凸包:找到包含所有关键点的最小凸多边形hull = cv2.convexHull(facial_pts)# 绘制凸包轮廓:绿色(0,255,0),线宽2像素,-1表示不填充内部cv2.drawContours(image, [hull], -1, (0, 255, 0), 2)# 1. 读取待处理图像
image = cv2.imread("zjl2.png")
if image is None:print("Error: 无法读取图像,请检查路径是否正确!")exit()# 2. 初始化dlib人脸检测器与关键点预测器
detector = dlib.get_frontal_face_detector()  # 人脸检测器
# 加载68点关键点模型(确保模型路径正确)
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")# 3. 执行人脸检测
faces = detector(image, 0)  # 0表示不上采样,可根据需求调整为1# 4. 遍历每个人脸,绘制特征轮廓
for face in faces:# 4.1 预测当前人脸的68点关键点shape_dlib = predictor(image, face)# 4.2 将dlib关键点转换为numpy数组(便于索引和计算)shape = np.array([[p.x, p.y] for p in shape_dlib.parts()])# 4.3 调用函数绘制器官凸包(闭合轮廓)drawConvexHull(36, 41)  # 右眼(关键点36-41)drawConvexHull(42, 47)  # 左眼(关键点42-47)drawConvexHull(48, 59)  # 嘴巴外部(关键点48-59)drawConvexHull(60, 67)  # 嘴巴内部(关键点60-67)# 4.4 调用函数绘制线性轮廓(线段连接)drawLine(0, 17)   # 下颌线(关键点0-16,左闭右开需取到17)drawLine(17, 22)  # 左眉毛(关键点17-21)drawLine(22, 27)  # 右眉毛(关键点22-26)drawLine(27, 36)  # 鼻梁(关键点27-35)# 5. 显示结果与释放资源
cv2.imshow("Facial Features Visualization", image)
cv2.waitKey(0)  # 等待任意按键关闭窗口
cv2.destroyAllWindows()  # 释放所有OpenCV窗口

运行后的效果图

2. 核心函数与逻辑解析

(1)drawLine():线性轮廓绘制函数

该函数的核心是按索引顺序连接相邻关键点,适用于线性特征(如下颌、眉毛),关键参数与逻辑如下:

  • 参数startend:表示关键点的起始索引和结束索引(左闭右开区间)。例如drawLine(0,17)表示连接索引 0 到 16 的关键点(共 17 个点,构成下颌线);
  • pts = shape[start:end]:从 numpy 数组shape中截取指定范围的关键点,得到该特征的所有坐标;
  • cv2.line():OpenCV 的线段绘制函数,参数依次为 “目标图像、起点、终点、颜色、线宽”,这里选择绿色((0,255,0))作为标记色,线宽 2 像素以保证清晰度。
(2)drawConvexHull():凸包绘制函数

该函数的核心是计算关键点的凸包并绘制闭合轮廓,适用于眼睛、嘴巴等闭合器官,关键逻辑如下:

  • 参数startend:表示关键点的起始索引和结束索引(左闭右闭区间,需end+1才能截取到完整范围)。例如drawConvexHull(36,41)表示处理索引 36 到 41 的关键点(右眼);
  • cv2.convexHull():OpenCV 的凸包计算函数,输入为关键点坐标数组,输出为凸包的顶点坐标(凸包是包含所有点的最小凸多边形,能完美贴合器官轮廓);
  • cv2.drawContours():OpenCV 的轮廓绘制函数,参数[hull]表示传入单个轮廓,-1表示绘制所有层级的轮廓,线宽 2 像素,最终形成闭合的器官轮廓。
(3)关键点索引与特征对应关系

要正确调用上述两个函数,必须明确 68 点关键点的索引分布(这是后续所有操作的基础),具体对应关系如下表:

面部特征关键点索引范围绘制方式函数调用示例
下颌线0-16线段连接drawLine(0,17)
左眉毛17-21线段连接drawLine(17,22)
右眉毛22-26线段连接drawLine(22,27)
鼻梁27-35线段连接drawLine(27,36)
右眼36-41凸包绘制drawConvexHull(36,41)
左眼42-47凸包绘制drawConvexHull(42,47)
嘴巴外部48-59凸包绘制drawConvexHull(48,59)
嘴巴内部60-67凸包绘制drawConvexHull(60,67)

http://www.dtcms.com/a/411070.html

相关文章:

  • display ip routing-table故障判断及题目
  • 晨控CK-GW04S与欧姆龙PLC配置Ethernet/IP通讯连接手册
  • 动态IP的特点
  • 团购网站推广怎么做微信公众号怎么创建要多少钱
  • CMDLET使用教程详解
  • 短视频流量|基于SprinBoot+vue的短视频流量数据分析系统(源码+数据库+文档)
  • 安装测试用例
  • ubuntu 网络监听工具及使用方法详解
  • 微信公众号网站自己做导航条WordPress在手机能更新
  • STM32 单片机开发 - FreeRTOS 实时操作系统
  • 网站如何续费深圳网上创建公司
  • UNet改进(41):基于PyTorch的轻量量化UNet
  • [vscode] Tab键无法缩进
  • 网站vr用什么做网站推广的技术有哪些
  • ubuntu24.04安装todesk远程工具
  • GPT-4 赋能恶意软件 GPT-MalPro:国内首现动态生成规避检测的勒索程序技术深度解析
  • ubuntu22.04安装cuda11.4版本
  • 网站建设与用户需求分析网络营销案例ppt课件
  • 八戒网站做推广婚庆策划公司加盟
  • 江苏建设行业证书编号查询网站男女性做那个视频网站
  • uniapp获取设备的IP地址(已踩坑,开箱即用)
  • 怎么做地方门户网站哈尔滨市建筑企业管理站
  • WGCLOUD存在默认账号密码admin/111111
  • FGFR3 K650Q突变的研究进展
  • 最小二乘问题详解1:线性最小二乘
  • vue静态资源优化
  • MiniCPM-V 4.5 视觉模型使用指南
  • 中国建设银行集团网站简单旅游网站开发
  • 口碑好的秦皇岛网站建设哪里有网页设计素材推荐
  • 《道德经》第三章