实用指南:计算机视觉:人脸关键点定位与轮廓绘制

news/2025/9/28 19:09:11/文章来源:https://www.cnblogs.com/ljbguanli/p/19117424

实用指南:计算机视觉:人脸关键点定位与轮廓绘制

目录

一、关键模型准备

二、实战 1:人脸 68 个关键点定位

2.1 核心原理

2.2 完整代码实现

2.3 结果说明

三、实战 2:基于关键点的面部轮廓绘制

3.1 核心原理

3.2 完整代码实现

3.3 运行效果

四、常见问题与解决方案

1.模型路径错误

2.未检测到人脸

3.关键点绘制错位

五、技术扩展:关键点的应用场景


在计算机视觉领域,人脸关键点检测是表情识别、人脸编辑、疲劳监测等高级应用的核心基础。本文将跳过环境搭建环节,直接从核心原理出发,结合 OpenCV 与 dlib 库,详细讲解人脸 68 个关键点的定位与面部轮廓绘制的完整实现过程。


一、关键模型准备

dlib 的人脸关键点预测依赖预训练模型shape_predictor_68_face_landmarks.dat,该模型可精准检测人脸的 68 个关键点(涵盖眼睛、眉毛、鼻子、嘴巴、面部轮廓)。

  • 下载地址:https://github.com/davisking/dlib-models
  • 使用说明:下载后将模型文件与代码放在同一目录,避免后续路径调用错误。

二、实战 1:人脸 68 个关键点定位

2.1 核心原理

dlib 的关键点检测基于级联回归树算法,整体流程分为三步:

  • 人脸检测:通过dlib.get_frontal_face_detector()识别图像中的人脸区域,输出人脸边界框;
  • 关键点预测:利用预训练的shape_predictor模型,在人脸边界框内定位 68 个关键点的坐标;
  • 可视化展示:将关键点坐标转换为 NumPy 数组,通过 OpenCV 绘制关键点及编号,直观呈现检测结果。

2.2 完整代码实现

'''
功能:检测人脸68个关键点,并绘制关键点及编号
依赖库:numpy, cv2, dlib
模型:shape_predictor_68_face_landmarks.dat(需与代码同目录)
'''
import numpy as np
import cv2
import dlib
# 1. 读取图像(替换为你的图像路径,支持png/jpg格式)
img = cv2.imread("man.png")
# 读取失败判断
if img is None:raise ValueError("图像读取失败,请检查文件路径是否正确!")
# 2. 初始化人脸检测器(正面人脸检测)
detector = dlib.get_frontal_face_detector()
# 3. 检测图像中的人脸(参数0:不放大图像,平衡速度与精度)
faces = detector(img, 0)
if len(faces) == 0:print("未检测到人脸,请更换清晰正面人脸图像重试!")
else:print(f"共检测到 {len(faces)} 张人脸")
# 4. 加载关键点预测模型
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 5. 遍历人脸,获取并绘制关键点
for face in faces:# 5.1 预测当前人脸的68个关键点shape = predictor(img, face)  # shape包含68个关键点对象# 5.2 转换关键点为(x, y)坐标数组(便于后续处理)landmarks = np.array([[p.x, p.y] for p in shape.parts()])# 5.3 绘制关键点(绿色实心圆)与编号(白色文字)for idx, point in enumerate(landmarks):pos = (point[0], point[1])  # 关键点坐标# 绘制实心圆:图像、坐标、半径2、颜色(0,255,0)(BGR)、厚度-1(填充)cv2.circle(img, pos, radius=2, color=(0, 255, 0), thickness=-1)# 绘制编号:字体SIMPLEX、字号0.4、颜色(255,255,255)、厚度1、抗锯齿cv2.putText(img, str(idx), pos, cv2.FONT_HERSHEY_SIMPLEX,fontScale=0.4, color=(255, 255, 255), thickness=1, lineType=cv2.LINE_AA)
# 6. 显示结果与释放资源
cv2.imshow("Face 68 Landmarks", img)
cv2.waitKey(0)  # 按任意键关闭窗口
cv2.destroyAllWindows()

2.3 结果说明

关键点编号规则:68 个关键点按区域划分,具体对应关系如下:

  • 0-16:面部轮廓(从下巴到额头两侧)
  • 17-21:左眉,22-26:右眉
  • 27-35:鼻子(含鼻梁、鼻尖、鼻翼)
  • 36-41:右眼,42-47:左眼
  • 48-67:嘴巴(48-59 为外轮廓,60-67 为内轮廓)

可视化效果:图像中每个关键点以绿色实心圆标记,旁边标注白色编号,可清晰区分不同面部区域的关键点位置。


三、实战 2:基于关键点的面部轮廓绘制

在获取 68 个关键点后,通过凸包算法线段绘制,可进一步勾勒面部轮廓,让检测结果更直观。

3.1 核心原理

  • 凸包算法(cv2.convexHull):对于眼睛、嘴巴等闭合区域,通过关键点生成凸多边形,准确包裹区域边界,避免轮廓断裂;
  • 线段绘制(cv2.line):对于面部轮廓、眉毛、鼻子等非闭合区域,将连续关键点用线段连接,形成完整的线性轮廓。

3.2 完整代码实现

'''
功能:基于68个关键点绘制面部轮廓(眉毛、眼睛、鼻子、嘴巴、面部轮廓)
依赖库:numpy, cv2, dlib
'''
import numpy as np
import dlib
import cv2
# 1. 定义轮廓绘制工具函数
def draw_line(start, end):'''绘制线段:连接从start到end的连续关键点(左闭右开区间)'''pts = shape[start:end]  # 获取关键点区间for i in range(1, len(pts)):pt_a = tuple(pts[i-1])  # 前一个关键点pt_b = tuple(pts[i])    # 当前关键点# 绘制绿色线段,厚度2cv2.line(image, pt_a, pt_b, color=(0, 255, 0), thickness=2)
def draw_convex_hull(start, end):'''绘制凸包轮廓:用于眼睛、嘴巴等闭合区域(包含end的闭区间)'''facial_pts = shape[start:end+1]  # 获取关键点区间hull = cv2.convexHull(facial_pts)  # 生成凸包# 绘制绿色凸包轮廓,厚度2(-1表示填充,此处用2保留轮廓线)cv2.drawContours(image, [hull], -1, (0, 255, 0), thickness=2)
# 2. 读取图像
image = cv2.imread("man.png")
if image is None:raise ValueError("图像读取失败,请检查文件路径!")
# 3. 人脸检测与关键点预测(与实战1逻辑一致)
detector = dlib.get_frontal_face_detector()
faces = detector(image, 0)
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
if len(faces) == 0:print("未检测到人脸!")
else:for face in faces:# 获取关键点并转换为数组shape = predictor(image, face)shape = np.array([[p.x, p.y] for p in shape.parts()])# 4. 按区域绘制轮廓(关键:对应68个关键点的正确区间)draw_convex_hull(36, 41)   # 右眼轮廓(36-41号关键点)draw_convex_hull(42, 47)   # 左眼轮廓(42-47号关键点)draw_convex_hull(48, 59)   # 嘴巴外部轮廓(48-59号关键点)draw_convex_hull(60, 67)   # 嘴巴内部轮廓(60-67号关键点)draw_line(0, 17)           # 面部轮廓(0-16号,左闭右开需到17)draw_line(17, 22)          # 左眉轮廓(17-21号关键点)draw_line(22, 27)          # 右眉轮廓(22-26号关键点)draw_line(27, 36)          # 鼻子轮廓(27-35号关键点)
# 5. 结果展示与保存(可选)
cv2.imshow("Face Contours", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存结果图像到当前目录
cv2.imwrite("face_contours_result.png", image)
print("结果图像已保存为 face_contours_result.png")

3.3 运行效果

代码运行后,图像将呈现以下绿色轮廓:

  • 闭合轮廓:左右眼(凸包形状,完整包裹眼球区域)、嘴巴内外侧(区分嘴唇与牙齿边界);
  • 线性轮廓:面部轮廓(从下巴尖沿脸颊到额头两侧)、左右眉毛(沿眉形连接关键点)、鼻子(从鼻梁到鼻尖的中线)。


四、常见问题与解决方案

1.模型路径错误

报错信息:Unable to open shape_predictor_68_face_landmarks.dat

解决:确认模型文件与代码在同一目录,或在shape_predictor中传入完整路径(如"D:/cv_project/shape_predictor_68_face_landmarks.dat")。

2.未检测到人脸

原因:图像中无正面人脸、人脸尺寸过小(小于 80×80 像素,dlib 默认最小检测尺寸)或光线过暗。

解决:更换清晰正面人脸图像,或调整detector参数(如detector(img, 1),1 表示放大图像 1 倍后检测,提升小人脸识别率)。

3.关键点绘制错位

原因:图像读取时通道顺序错误(OpenCV 默认 BGR,若误转为 RGB 会导致坐标偏移)。

解决:确保直接使用cv2.imread()读取图像,不额外转换通道顺序(除非后续有特殊处理需求)。


五、技术扩展:关键点的应用场景

人脸 68 个关键点是计算机视觉中极具价值的基础数据,基于本文技术可进一步扩展以下应用:

表情识别:通过嘴巴关键点(48-67)的开合程度、眼睛关键点(36-47)的眯眼状态,判断微笑、愤怒、惊讶等表情;

疲劳监测:计算眼睛纵横比(如 “眼高 / 眼宽”,当比值 < 0.3 时判定为闭眼),统计单位时间内闭眼次数与时长,预警疲劳状态;

人脸编辑:结合仿射变换(cv2.warpAffine),基于关键点实现人脸对齐、换脸、妆容迁移(如将 A 的眉毛轮廓复制到 B 的脸上)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站定制开发是什么外贸营销网站建设公司

萌新的学习笔记&#xff0c;写错了恳请斧正。 目录 链表的定义 链表的分类 方向&#xff08;单向还是双向&#xff09; 头节点&#xff08;哨兵节点&#xff09;的有无 循环或不循环 8种分类 不带头单向不循环链表的实现 带头单向循环链表的实现 链表与顺序表的差异 链…

mysql 对json 数据进行查询

mysql 对json 数据进行查询数据库字段为 `car_info_list` json DEFAULT NULL COMMENT 车辆信息, SELECT id, event_car_plate->>$[0] as car_plate, car_info_list, car_info_list->$[0].carPlate as i…

快捷的赣州网站建设网站维护公司广州

暴露数据引入模块语法 规范基本语法分别暴露 (按需暴露)统一暴露 export {暴露内容1&#xff0c;暴露内容2}默认暴露 (适合只暴露一个数据) 只能暴露一次同时使用在app.js中引入 规范 每个文件都是一个模块要借助Babel和Browserify依次编译代码&#xff0c;才能在浏览器端运行…

常州微信网站建设流程商城网站内容模块有哪些

信息系统项目管理师教程 第四版【第6章-项目管理概论-思维导图】 课本里章节里所有蓝色字体的思维导图

ubuntu系统挂载硬盘

ubuntu系统挂载硬盘查看硬盘挂载信息 sudo lsblk记下目标分区的UUID,如:UUID=12345678-1234-1234-1234-123456789abcext4文件系统 UUID=12345678-1234-1234-1234-123456789abc /mnt/mydrive ext4 defaults,uid=1000,…

代码之美-代码整洁之道

一、开篇引言 京东零售从9月开始对技术风险系统性地跟踪汇报,以故障数、监控发现率、故障发现时间、故障恢复时间等多个指标进行统计和跟踪汇报,相比于之前线上小故障杖责二十、大故障发配宁古塔,有了向惩前毖后、治…

Chrome for Testing availability

https://googlechromelabs.github.io/chrome-for-testing/#stable

做网站服务器配置怎么选wordpress 新建

目录 单选题1.下列说法正确的是&#xff08;B&#xff09;2.在信息论中&#xff0c;若用对数底2为&#xff0c;则信息量的单位为&#xff08;C&#xff09;3.率失真函数的下限为&#xff08;A&#xff09;4.给定xi条件下随机事件yj所包含的不确定度和条件自信息量p(yj /xi)。&a…

RAG实践:一文掌握大模型RAG过程

一、RAG是什么? RAG(Retrieval-Augmented Generation,检索增强生成), 一种AI框架,将传统的信息检索系统(例如数据库)的优势与生成式大语言模型(LLM)的功能结合在一起。不再依赖LLM训练时的固有知识,而是在回答问…

递归算法实践--到仓合单助力京东物流提效增收

一、背景京东物流到仓业务「对商家」为了减少商家按照京东采购单分货备货过程,对齐行业直接按照流向交接,提升商家满意度;「对京东」揽收操作APP提效;到仓合单功能应运而生;二、问题一次批量采购单(一次50或者10…

开发手机网站用什么语言做电商设计有什么好的网站推荐

目录 k8s是什么 k8s不是什么 云原生 微服务 整体式架构与微服务架构 微服务的特性 微服务的优势 k8s是什么 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快…

网站空间150m分级会员管理系统网站开发

说来惭愧&#xff0c;从事互联网开发好些年了&#xff0c;有些概念一直没有彻底搞清楚。其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections,在网上搜了一圈&#xff0c;发现很多都讲的含含糊糊的。 作者&#xff1a;资深开发讲技术 背景 …

计算机视觉(opencv)练习——抠图(图像裁剪与轮廓提取) - 详解

计算机视觉(opencv)练习——抠图(图像裁剪与轮廓提取) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

完整教程:上下文工程驱动智能体向 透明化推理日志

完整教程:上下文工程驱动智能体向 透明化推理日志pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

基于Mysql+SpringBoot+vue框架-在线宠物用品交易网站的设计与实现 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

深入解析:@scqilin/phone-ui 手机外观组件库

深入解析:@scqilin/phone-ui 手机外观组件库pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

北京网站设计权威乐云践新站建设 app开发网站

原 Linux搭建SVN 服务器 发表于1年前(2014-08-05 17:55) 阅读&#xff08;12257&#xff09; | 评论&#xff08;3&#xff09; 31人收藏此文章, 我要收藏赞3摘要 Linux搭建SVN 服务器目录[-] Linux搭建SVN 服务器1 安装SVN2 使用客户端连接2.1 使用…

全景网站如何建设虚拟主机登录wordpress管理后台

本篇文章包含内容较多&#xff0c;请参照目录浏览,在每一部分结束或,有该部分可能遇到的问题0、开始本教程前请先备份电脑中的重要文件&#xff01;&#xff01;&#xff01;&#xff01;一、Ubuntu20.04 搭建更详细的内容请参照该博客&#xff1a;https://www.cnblogs.com/mas…

Tita项目与绩效一体化管理:驱动企业效能跃升的数字化引擎

在数字经济时代,企业竞争的核心已从单一业务能力转向组织整体效能的协同释放。项目管理作为企业战略落地的关键抓手,正面临从”任务执行”到”价值创造”的范式转变。Tita项目经营管理一体化平台,凭借其独特的项目与…

第七篇

今天是9月28日,今天是星期日但是补星期三的课,调休这玩意真是烦,早上上的离散和马克思主义基本原理,离散没咋明白,马原倒是听进去不少。