基于 OpenCV 和 DLib 实现面部特征调整(眼间距、鼻子、嘴巴)

摘 要

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

技术栈
    • Python 3.8+

    • OpenCV 4.x

    • Dlib 19.24

    • NumPy

    • SciPy

实现步骤
1. 环境准备

图片

    import cv2import dlibimport numpy as npfrom scipy.spatial import Delaunayimport gdownimport os
     2. 模型文件下载
    import gdownimport osos.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 = 10for idx in left_eye_indices:    modified_points[idx][0] -= shift_amountfor 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) * 255combined_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++双语言实现)。

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

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

    相关文章

    Spring Data Redis 实战指南

    Spring Data Redis 核心特性 Spring Data Redis 是基于 Redis 的 NoSQL 内存数据结构存储解决方案,为 Spring 应用程序提供与 Redis 交互的高级抽象层。其核心架构设计体现了对现代应用需求的深度适配,主要技术特性可归纳为以下维度: 数据结构支持体系 作为多模型数据存储…

    AI IDE 正式上线!通义灵码开箱即用

    近期,通义灵码AI IDE正式上线,即日起用户可在通义灵码官网免费下载开箱即用。 作为AI原生的开发环境工具,通义灵码AI IDE深度适配了最新的千问3大模型,并全面集成通义灵码插件能力,具备编程智能体、行间建议预测、行间…

    如何搭建Z-Blog PHP版本:详细指南

    Z-Blog是一款功能强大且易于使用的博客平台,支持PHP和ASP两种环境。本文将重点介绍如何在PHP环境下搭建Z-Blog博客系统,帮助您快速上线自己的个人博客站点。 准备工作 1. 获取Z-Blog PHP版本 首先,访问Z-Blog官方网站下载最新版本的Z-Blog…

    App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离

    引入webview的页面添加safeAreaInsets&#xff0c;对weview的webviewStyles做处理 在myApp中改造 entry.vue代码如下 template><view class"entry-page" :style"{ paddingTop: safeAreaInsets.top px }"><web-view :webview-styles"we…

    机器学习:支持向量机(SVM)原理解析及垃圾邮件过滤实战

    一、什么是支持向量机&#xff08;SVM&#xff09; 1. 基本概念 1.1 二分类问题的本质 在机器学习中&#xff0c;分类问题是最常见的任务之一。最简单的情况就是二分类&#xff1a;比如一封邮件是“垃圾邮件”还是“正常邮件”&#xff1f;一个病人是“患病”还是“健康”&a…

    腾讯云V3签名

    想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…

    STM32中自动生成Flash地址的方法

    每页大小为 2KB(0x800 字节),地址间隔为 0x800 总地址空间覆盖范围:0x08000000 ~ 0x0803F800(共 256KB) 适用于 STM32 大容量 / 中容量产品(如 F103 系列) 代码如下 // 通用定义(需根据实际页大小调整) #define FLASH_BASE_ADDR 0x08000000 #define FLASH_PAGE_SIZ…

    (12)java+ selenium->元素定位大法之By_link_text

    1.简介 本章节介绍元素定位中的link_text,顾名思义是通过链接定位的(官方说法:超链接文本定位)。什么是link_text呢,就是我们在任何一个网页上都可以看到有一个或者多个链接,上面有一个文字描述,点击这个文字,就可以跳转到其他页面。这个就是link_Text。 注意:link_t…

    Tomcat 线程模型详解性能调优

    1. Tomcat I/O模型详解**&#xff08;了解&#xff09;** 1.1 Linux I/O模型详解 I/O要解决什么问题 I/O&#xff1a;在计算机内存与外部设备之间拷贝数据的过程。 程序通过CPU向外部设备发出读指令&#xff0c;数据从外部设备拷贝至内存需要一段时间&#xff0c;这段时间CPU就…

    C++课设:智能优惠快餐点餐系统

    名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、项目介绍与亮点功能1. 项目背景2.完…

    PHP的namespace

    文章目录 环境Java的packagepackage关键字包结构和目录结构访问权限import关键字总结 PHP的namespacenamespace关键字在同一个文件里使用资源限定&#xff0c;完全限定&#xff0c;非限定限定完全限定非限定 use关键字use VS 直接指定资源在不同的文件里使用总结 环境 Windows…

    矩阵分解相关知识点总结(二)

    文章目录 三、矩阵的QR分解3.1、Givens矩阵与Givens变换3.2、Householder矩阵与Householder变换3.3、QR分解 书接上文矩阵分解相关知识点总结&#xff08;一&#xff09; 三、矩阵的QR分解 3.1、Givens矩阵与Givens变换 设非零列向量 x ∈ R n \bm{x}\in {\bf{R}}^n x∈Rn及单…

    Chorme如何对于youtube视频进行画中画背景播放?

    画中画可以让你小窗播放&#xff0c;然后浏览器放后台还可以做点别的事情。 B站直接可以选择小窗播放&#xff0c;游览器最小化就可以&#xff0c;但是youtube的小窗播放游览器一切换就不显示了。 其实是因为youtube的小窗播放不是真的小窗播放。要想真的实现需要在youtube视…

    14.AI搭建preparationのBERT预训练模型进行文本分类

    一、回顾&#xff1a; 对深度学习框架Python2.0进行自然语言处理有了一个基础性的认识注意力模型编码器(encoder_layer,用于分类的全连接层dense_layer)&#xff0c;抛弃了传统的循环神经网络和卷积神经网络&#xff0c;通过注意力模型将任意位置的两个单词的距离转换成1编码器…

    OD 算法题 B卷【最长公共前缀】

    文章目录 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组 中的最长公共前缀&#xff0c;如果不存在公共前缀&#xff0c;返回字符串’Zero’字符串长度范围【2,1000】&#xff0c;字符串中字符长度范围为【1,126】 示例1 输入&#xff1a; [“flower”, “flow”, …

    pycharm F2 修改文件名 修改快捷键

    菜单&#xff1a;File-> Setting&#xff0c; Keymap中搜索 Rename&#xff0c; 其中&#xff0c;有 Refactor-> Rename&#xff0c;右键添加快捷键&#xff0c;F2&#xff0c;删除原有快捷键就可以了。

    WEB安全--SQL注入--bypass技巧2

    继之前文章的补充&#xff1a; WEB安全--SQL注入--bypass技巧_sql注入过滤空格-CSDN博客 Q1&#xff1a;发现sql注入的时间盲注时&#xff0c;如果时间盲注的函数都被过滤了&#xff0c;怎么办&#xff1f; 除了找其他函数替换、编码等方式&#xff0c;还有以下方式绕过&…

    自定义事件wpf

    // 自定义控件 public class MyCustomControl : Control { public static readonly RoutedEvent MyCustomEvent EventManager.RegisterRoutedEvent( "MyCustom", RoutingStrategy.Bubbling, typeof(RoutedEventHandler), typeof(MyCustomControl) ); public event R…

    【汇编逆向系列】一、无参数的函数调用- RSP,EAX寄存器,全局变量,INT类型和MOV,INC,SHL指令

    给出一段简单的汇编 no_params_function:0000000000000000: 40 57 push rdi0000000000000002: 8B 05 00 00 00 00 mov eax,dword ptr [global_counter]0000000000000008: FF C0 inc eax000000000000000A: 89 05 00 00 00 0…

    知识蒸馏:从模型输出到深层理解

    1. 概念阐释: 还记得上次说的“老师教你画画,不只教‘猫’,还教‘像狗像树叶’的细微感觉”吗?那是最初的蒸馏。 后来大家发现,老师不仅仅通过“最后画出来像什么”来教你。 有时候,老师是教你“他画画时,哪里用了力气,哪里画得特别认真”(这叫基于特征的蒸馏,学习…