基于 OpenCV 和 DLib 实现面部特征调整(眼间距、鼻子、嘴巴)
摘 要
本文介绍如何利用Dlib面部特征点检测和OpenCV图像处理技术,通过Python实现面部特征的精准调整。我们将以改变眼间距为例,演示包括地标检测、三角剖分变形等关键技术,该方法可扩展至嘴唇、眉毛等面部特征的调整。
技术栈
-
-
Python 3.8+
-
OpenCV 4.x
-
Dlib 19.24
-
NumPy
-
SciPy
-
实现步骤
1. 环境准备
import cv2
import dlib
import numpy as np
from scipy.spatial import Delaunay
import gdown
import os
2. 模型文件下载
import gdown
import os
os.chdir('/content')
SHAPE_PREDICTOR_URL = 'https://drive.google.com/uc?id=17lKsYuDwBuc4O-OSKRzgwpoNnrwC2ws-'
gdown.download(SHAPE_PREDICTOR_URL, 'shape_predictor_81_face_landmarks.dat', quiet=False)
3. 加载模型和图像
detector = dlib.get_frontal_face_detector()
predictor = dlib. shape_predictor("/content/shape_predictor_81_face_landmarks.dat")
image = cv2.imread("/content/your_image.jpg")detector = dlib.get_frontal_face_detector()
predictor = dlib. shape_predictor("/content/shape_predictor_81_face_landmarks.dat")
image = cv2.imread("/content/your_image.jpg")
4. 检测人脸并提取特征点
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = detector(gray)
landmarks = predictor(gray, faces[0])
original_points = np.array([(p.x, p.y) for p in landmarks.parts()], dtype=np.float32)
将图像转换为灰度图像以便更好地检测。然后首先检测人脸并提取其 81 个人脸特征点。
5. 修改眼睛特征点
modified_points = original_points.copy()
left_eye_indices = [36, 37, 38, 39, 40, 41]
right_eye_indices = [42, 43, 44, 45, 46, 47]
shift_amount = 10
for idx in left_eye_indices:
modified_points[idx][0] -= shift_amount
for idx in right_eye_indices:
modified_points[idx][0] += shift_amount
这部分代码是实际面部作发生的地方。它会创建原始面部特征点的副本,并移动眼睛特征点以增加它们之间的距离。左眼点(索引 36-41)通过从 x 坐标中减去shift_amount向左移动,而右眼点 (42-47) 通过添加相同的量向右移动。这会将眼睛间距增加 2 × shift_amount。相同的逻辑可用于作其他面部特征,只需更改地标索引以针对不同的区域,并根据所需的移动方向调整 x 或 y 值。增加或减少 x 轴可水平移动要素,而更改 y 轴可垂直移动要素。
6. 使用 Delaunay 三角剖分进行面部变形
delaunay = Delaunay(original_points)
triangles = delaunay.simplices
使用 Delaunay 三角剖分将面部划分为三角形,这可确保图像平滑变形。
7. 逐个扭曲三角形
pts_src = np.array([original_points[i] for i in tri], dtype=np.float32)
pts_dst = np.array([modified_points[i] for i in tri], dtype=np.float32)
matrix = cv2.getAffineTransform(pts_src, pts_dst)
triangle_mask = np.zeros((h, w), dtype=np.uint8)
cv2.fillConvexPoly(triangle_mask, pts_src.astype(np.int32), 255)
warped_triangle = cv2.warpAffine(image, matrix, (w, h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_REFLECT)
warped_image[triangle_mask == 255] = warped_triangle[triangle_mask == 255]
对于每个三角形,计算仿射变换并应用它。这部分对于自然的经纱至关重要。
8. 合并并显示结果
mask = np.any(warped_image != 0, axis=-1).astype(np.uint8) * 255
combined_image = cv2.bitwise_and(image, image, mask=255 - mask)
combined_image += cv2.bitwise_and(warped_image, warped_image, mask=mask)
cv2_imshow(image)
cv2_imshow(combined_image)
cv2.imwrite("Result_eyes.jpg", combined_image)
创建原始图像和 Warp 版本的平滑合成。结果看起来不错,就好像这个人恰好有一双更宽的眼睛一样。
这项技术不仅限于眼睛,您还可以使用它来纵其他面部特征,例如嘴唇、鼻子、眉毛或下巴。您所需要的只是一组正确的地标。
我们查看一些示例图像,这些图像突出显示了各种经过处理的面部属性。
眼睛部分
鼻子部分
嘴唇部分
大礼包1:Pytorch常用函数手册
Pytorch函数手册,即可下载学习全网第一份Pytorch函数常用手册,包括Tensors介绍、基础函数介绍、数据处理函数、优化函数、CUDA编程、多处理等十四章内容。
大礼包2:145个OpenCV实例应用代码
145个OpenCV实例应用代码(Python和C++双语言实现)。
相关文章:

基于 OpenCV 和 DLib 实现面部特征调整(眼间距、鼻子、嘴巴)
摘 要 本文介绍如何利用Dlib面部特征点检测和OpenCV图像处理技术,通过Python实现面部特征的精准调整。我们将以改变眼间距为例,演示包括地标检测、三角剖分变形等关键技术,该方法可扩展至嘴唇、眉毛等面部特征的调整。 技术栈 Python 3.8 …...

spring-boot接入websocket教程以及常见问题解决
我们使用spring-boot接入websocket有三种方式:使用EnableWebSocket、EnableWebSocketMessageBroker以及ServerEndpoint,本文主要介绍使用ServerEndpoint方式的流程以及碰到的问题解决 接入方式 添加依赖 确保spring-boot-starter-websocket依赖 <d…...

迈向分布式智能:解析MCP到A2A的通信范式迁移
智能体与外部世界的桥梁之言: 在深入探讨智能体之间的协作机制之前,我们有必要先厘清一个更基础的问题:**单个智能体如何与外部世界建立连接?** 这就引出了我们此前介绍过的 **MCP(Model Context Protocol&…...

深度学习|pytorch基本运算-hadamard积、点积和矩阵乘法
【1】引言 pytorch对张量的基本运算和线性代数课堂的教学有一些区别,至少存在hadamard积、点积和矩阵乘法三种截然不同的计算方法。 【2】hadamard积 hadamard积是元素对位相乘,用“*”连接张量,代码: # 导入包 import torch …...

FFmpeg移植教程(linux平台)
目录 第三方源码编译三部曲关于 configure 的说明 FFmpeg 移植流程获取源码方法一:git 远程克隆方法二:官网下载压缩包解压 配置安装 第三方源码编译三部曲 Linux平台下有许多开源的第三方库和服务,这些开源代码一般都符合GNU-autotools编码…...

Mybatis:灵活掌控SQL艺术
在前面的文章中,小编分享了spring中相关的知识,但是没有分享到,如何去更高效操作数据库。 操作数据库传统的方法就是通过JDBC来进行操作。 这个传统方法使用上可谓是够麻烦的 1.首先创建一个数据源对象 2.设置该数据源的属性(…...

2025.05.28【Choropleth】群体进化学专用图:区域数据可视化
Load geospatial data Start by loading your geospatial data in R, and build a basic plot. Data from the package The cartography comes with a set of geospatial data included. Learn how to use it to build a choropleth map. 文章目录 Load geospatial dataData …...
Java设计模式详解:策略模式(Strategy Pattern)
在软件开发中,设计模式是解决常见问题的经典方法。策略模式(Strategy Pattern)作为一种行为型设计模式,能够将算法或行为的定义与使用分离,使得算法可以独立于客户端代码进行变化和扩展。本文将深入解析策略模式的核心…...

【春秋云镜】CVE-2022-26965 靶场writeup
知识点 网站的主题或者模块位置一般是可以上传文件的,不过一般为压缩包形式主题或者模块可以上github上找到和cms匹配的源码主题被解压后会放到加入到对应的文件夹中,而且还会自动执行对应的info.php文件(需要主题和cms配套才行)我这里取巧了࿰…...
爬虫的几种方式(使用什么技术来进行一个爬取数据)
在网页数据爬取中,确实存在多种数据呈现和获取形式,远不止静态HTML解析和简单JS渲染。理解这些形式对于应对不同的反爬机制至关重要: 主要数据获取形式与应对策略 纯静态HTML (基础形式) 特点: 数据直接嵌入在服务器返回的初始HT…...
XML 编码:结构化数据的基石
XML 编码:结构化数据的基石 引言 XML(可扩展标记语言)作为互联网上广泛使用的数据交换格式,已经成为结构化数据存储和传输的重要工具。本文旨在深入探讨XML编码的原理、应用场景以及编码规范,帮助读者更好地理解和运用XML。 XML编码概述 1. XML的起源 XML诞生于1998年…...
nt!CcGetVacbMiss函数分析之设置好nt!_VACB然后调用函数nt!SetVacb
第一部分:MmMapViewInSystemCache函数返回 Status MmMapViewInSystemCache (SharedCacheMap->Section, &Vacb->BaseAddress, &NormalOffset, …...

JSP、HTML和Tomcat
9x9上三角乘法表 乘法表的实现 <% page contentType"text/html;charsetUTF-8" language"java" %> <!DOCTYPE html> <html> <head><title>99 上三角乘法表</title><style>body {font-family: monospace;padding…...

(1)pytest简介和环境准备
1. pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它具有如下特点: 非常容易上手,入门简单&a…...
Git 入门学习教程
Git 入门学习教程 什么是 Git? Git 是一个分布式版本控制系统,由 Linus Torvalds 为 Linux 内核开发而创建。它可以帮助开发者: 跟踪代码变化协作开发项目回退到之前的版本创建分支进行实验性开发 安装 Git Windows 下载 Git for Windo…...

构建高性能风控指标系统
一、引言 在金融风控领域,指标是风险识别的核心依据。风控平台核心系统之一--规则引擎的运行依赖规则、变量和指标,一个高性能的指标系统非常重要,本文将深入探讨风控平台指标系统的全链路技术实现,涵盖从指标配置到查询优化的完…...
openfeignFeign 客户端禁用 SSL
要针对特定的 Feign 客户端禁用 SSL 验证,可以通过自定义配置类实现。以下是完整解决方案: 1. 创建自定义配置类(禁用 SSL 验证) import feign.Client; import feign.httpclient.ApacheHttpClient; import org.apache.http.conn…...
DeepSeek 赋能自动驾驶仿真测试:解锁高效精准新范式
目录 一、自动驾驶仿真测试概述1.1 自动驾驶发展现状1.2 自动驾驶仿真测试流程 二、DeepSeek 技术剖析2.1 DeepSeek 简介2.2 DeepSeek 核心技术原理 三、DeepSeek 在自动驾驶仿真测试中的应用原理3.1 与自动驾驶仿真测试流程的结合点3.2 如何提升仿真测试效果 四、DeepSeek 在自…...

晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册
晨控CK-UR12与西门子PLC配置Modbus TCP通讯连接操作手册 晨控CK-UR12系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题:围绕…...

实验一:PyTorch基本操作实验
import torch # PyTorch中初始化矩阵常见有以下几种方法 # 1. 直接使用固定值初始化 # M torch.tensor([[1.0, 2.0, 3.0]]) # 1x3矩阵 # 2. 随机初始化 # M torch.rand(1, 3) # 1x3矩阵,元素在0-1之间均匀分布 # M torch.randn(1, 3) # 1x3矩阵,元…...

可视化大屏通用模板Axure原型设计案例
本文将介绍一款基于Axure设计的可视化大屏通用模板,适用于城市、网络安全、园区、交通、社区、工业、医疗、能源等多个领域。 模板概述 这款Axure可视化大屏通用模板集成了多种数据展示模块和组件,旨在为用户提供一个灵活、可定制的数据展示平台。无论…...
通配符(Wildcard)与正则表达式(Regular Expression)的关系及区别
通配符(Wildcard)与正则表达式(Regular Expression)的关系及区别 1. 通配符(Wildcard) 定义:通配符是用于简单模式匹配的特殊符号,主要用于文件名匹配(如命令行操作&…...

历年山东大学计算机保研上机真题
历年山东大学计算机保研上机真题 2025山东大学计算机保研上机真题 2024山东大学计算机保研上机真题 2023山东大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school 从1到100找质数 题目描述 从 1 1 1 到 100 100 100 中找出所有的质数。 输入格式 …...

Java处理动态的属性:字段不固定、需要动态扩展的 JSON 数据结构
文章目录 引言I `JSONObject` 接收和返回JSONObject 接收和返回数据存储II 签名测试接口dto的定义签名计算III JsonAnySetter 和JsonAnyGetter 注解@JsonAnySetter 的用法@JsonAnyGetter 的用法综合示例引言 应用场景: 签名测试接口、表单配置项、参数列表、插件信息等。技术实…...

MAC电脑怎么通过触摸屏打开右键
在Mac电脑上,通过触摸屏打开右键菜单的方法如下: 法1:双指轻点:在触控板上同时用两根手指轻点,即可触发右键菜单。这是Mac上常用的右键操作方法。 法2:自定义触控板角落:可以设置触控板的右下角或左下角作为右键区域…...

用 Whisper 打破沉默:AI 语音技术如何重塑无障碍沟通方式?
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

【东枫科技】KrakenSDR 天线阵列设置
标准测向需要五根相同的全向天线。您可以折衷使用更少的天线,但为了获得最佳性能,我们建议使用全部五根天线。这些天线通常是磁铁安装的鞭状天线,或偶极子天线。我们建议始终使用均匀圆形阵列 (UCA) 天线,因为它可以确定来自各个方…...
Spring Boot中的事件与JMS消息集成
Spring Boot事件机制 Spring框架的事件处理是其核心特性之一,通过ApplicationEvent类和ApplicationListener接口实现。在Spring Boot应用中,事件机制是实现模块间消息传递的重要方式,通常用于业务逻辑内部通信。 内置事件类型 Spring应用上下文在启动时会触发多种内置事件…...
ubuntu/windows系统下如何让.desktop/.exe文件 在开机的时候自动运行
目录 1,让 .desktop 文件在 Ubuntu 开机时自动启动 1.1 创建 autostart 目录(如果不存在) 1.2 将 .desktop 文件复制到 autostart 目录 1.3 确保 .desktop 文件有可执行权限 2,windows 2.1 打开「启动」文件夹: 2.2 将 .exe 或快捷方…...

云计算数据治理
知识星球:数据书局。打算通过知识星球将这些年积累的知识、经验分享出来,让各位在数据治理、数据分析的路上少走弯路,另外星球也方便动态更新最近的资料,提供各位一起讨论数据的小圈子 1.摘要 云计算可以推动创新和各行业应用的…...