opencv进阶 ——(十三)基于三角剖分实现换脸

news2024/11/24 9:38:31

 换脸的关键在于人脸对齐,人脸对齐主要包括以下几点:

1、人脸可能存在一定的角度,因此需要先将倾斜方向进行对齐

2、大小对齐,将模板人脸的大小缩放到同一大小

3、要想有好的效果,关键点选取很重要

4、人脸对齐后,使用seamlessClone函数可以最大化的融合,还可以通过addWeighted函数进行调节比例,让图像看起来更自然。

人脸融合实现

cv::Mat FusionFace(const cv::Mat& srcImg, const cv::Rect& srcBox, const cv::Mat& destImg, const cv::Rect &destBox, std::vector<cv::Point>& vecDstPointRoi)
{
    auto destFace = destImg(destBox);
    cv::Mat destAlignFace;
    cv::resize(destFace, destAlignFace, srcBox.size());
    std::cout << "srcBox:" << srcBox << std::endl;
    auto center = (srcBox.br() + srcBox.tl())/2 ;

    std::vector<cv::Point> vecDstPointKey = vecDstPointRoi;
    vecDstPointKey.erase(vecDstPointKey.begin() + vecDstPointKey.size() - 8, vecDstPointKey.end());
    
    //获取旋转矩阵掩码
    auto rotateRect = cv::minAreaRect(vecDstPointKey);
    cv::Point2f pot[4];
    rotateRect.points(pot);
    std::vector<cv::Point> rotatePoints{pot[0], pot[1], pot[2], pot[3]};
    cv::Mat maskRect(srcBox.size(), CV_8UC1, cv::Scalar(0));
    cv::fillConvexPoly(maskRect, rotatePoints, cv::Scalar(255));
    //获取圆形掩码
    cv::Mat maskCicle(srcBox.size(), CV_8UC1, cv::Scalar(0));
    float radius = std::min(rotateRect.size.width, rotateRect.size.height);
    cv::circle(maskCicle, rotateRect.center, radius, cv::Scalar(255), -1);
    //去并集,最小化掩码区域
    cv::Mat maskArea(srcBox.size(), CV_8UC1, cv::Scalar(0));
    cv::bitwise_and(maskRect, maskCicle, maskArea);

    cv::Mat tmpDestImg;
    cv::Mat srcRoi = srcImg(srcBox);
    cv::seamlessClone(destAlignFace, srcImg, maskArea, center, tmpDestImg, cv::NORMAL_CLONE);
    //图像增强
    return FaceEnhance(srcBox, tmpDestImg, srcImg, vecDstPointKey);
}

融合效果

对图像进行增强后的效果

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

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

相关文章

前端自测 - 那些经典的bug

前言 我一直坚持的一个观点&#xff0c;就是不以bug数论成败&#xff0c;但是这个需要加一个前提&#xff0c;就是不能出现那些低级的bug&#xff0c;更不能反复的出现。 由此整理了一系列我认为比较经典常见的前端bug&#xff0c;都是在项目中多次遇到过的&#xff0c;用于前…

14. WinCC 无法打开画面编辑器Graphis Designer,且提示X值坐标过大,Y值坐标过大

wincc双击画面一直显示在这个界面&#xff0c;并且这个窗口背后还有小窗口。 直接回到桌面主界面下&#xff0c;点一下这个窗口&#xff0c;窗口消失&#xff0c;点击任务栏的wincc图标会弹窗&#xff0c;显示X坐标值过大&#xff0c;Y坐标值过大。将这些窗口都点击确定之后就…

多线程..

线程定义&#xff1a;线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中实际运作单位。简单来说&#xff0c;应用软件中相互独立&#xff0c;可以同时运作的功能。 多线程作用&#xff1a;有了多线程&#xff0c;我们就可以让程序…

扩散模型会成为深度学习的下一个前沿领域吗?

文章目录 一、说明二、 第 1 部分&#xff1a;了解扩散模型2.1 什么是扩散模型2.2 正向扩散2.3 反向扩散 三、他们的高成本四、扩散模型的用处五、为什么扩散模型如此出色六、第 2 部分&#xff1a;使用扩散模型生成6.1 用于自然语言处理和 LLM 的文本扩散6.2 音频视频生成6.3 …

Hadoop3:MapReduce源码解读之Map阶段的CombineFileInputFormat切片机制(4)

Job那块的断点代码截图省略&#xff0c;直接进入切片逻辑 参考&#xff1a;Hadoop3&#xff1a;MapReduce源码解读之Map阶段的Job任务提交流程&#xff08;1&#xff09; 6、CombineFileInputFormat原理解析 类的继承关系 与TextInputFormat切片机制的区别 框架默认的TextI…

docker构建jdk17镜像

资料参考 参考自黑马教程&#xff1a;10.Docker基础-自定义镜像_哔哩哔哩_bilibili 更多详细语法声明&#xff0c;请参考官网文档&#xff1a;https://docs.docker.com/engine/reference/builder 初步准备 1、下载jdk17包&#xff08;linux版&#xff09;&#xff0c;我这边版…

问题:在本案复议阶段,复议机关()。 #其他#媒体

问题&#xff1a;在本案复议阶段&#xff0c;复议机关&#xff08;&#xff09;。 A&#xff0e;有权责令被申请人纠正违法的征税行为 B&#xff0e;应当对被申请人作出的税务具体行政行为所依据的事实证据、法律程序、法律依据及设定权利义务内容的合法性、适当性进行全面审…

暑期来临,AI智能视频分析方案筑牢防溺水安全屏障

随着夏季暑期的来临&#xff0c;未成年人溺水事故频发。传统的防溺水方式往往依赖于人工巡逻和警示标识的设置&#xff0c;但这种方式存在人力不足、反应速度慢等局限性。近年来&#xff0c;随着视频监控智能分析技术的不断发展&#xff0c;其在夏季防溺水中的应用也日益凸显出…

【十二】图解mybatis日志模块之设计模式

图解mybatis日志模块之设计模式 概述 最近经常在思考研发工程师初、中、高级工程师以及系统架构师各个级别的工程师有什么区别&#xff0c;随着年龄增加我们的技术级别也在提升&#xff0c;但是很多人到了高级别反而更加忧虑&#xff0c;因为it行业35岁年龄是个坎这是行业里的共…

Day30 登录界面设计

​ 本章节,实现了登录界面窗口设计 一.准备登录界面图片素材(透明背景图片) 把准备好的图片放在 Images 文件夹下面,格式分别是 .png和 .icoico 图片,右键属性,生成操作选 内容 png 图片,右键属性,生成操作选 资源 选中 login.png图片鼠标右键,选择属性。生成的操作选…

(学习笔记)数据基建-数据安全

&#xff08;学习笔记&#xff09;数据基建-数据安全 数据安全数据安全实施难点数据安全保障流程数据安全措施实施阶段数据安全如何量化产出数据安全思考 数据安全 数据安全问题是最近比较热的话题&#xff0c;数据泄漏引发的用户信任危机事件也比比皆是&#xff0c;以及跨部门…

windows架设NTP时间服务器进行时间同步

一、windows架设NTP时间服务器 1.win11更改注册表 winR输入regedit 2.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config&#xff0c;找到Config目录&#xff0c;双击Config目录下的AnnounceFlags&#xff0c;设为5。 3.HKEY_LOCAL_MACHINE\SYSTEM\Current…

Unity + 雷达 粒子互动(待更新)

效果预览: 花海(带移动方向) VFX 实例 脚本示例 使用TouchScript,计算玩家是否移动,且计算移动方向 using System.Collections; using System.Collections.Generic; using TouchScript; using TouchScript.Pointers; using UnityEngine; using UnityEngine.VFX;public …

Java概述 , Java环境安装 , 第一个Hello World

环境变量,HelloWorld 1.会常用的dos命令 2.会安装java所需要的环境(jdk) 3.会配置java的环境变量 4.知道java开发三步骤 5.会java的入门程序(HelloWorld) 6.会三种注释方式 7.知道Java入门程序所需要注意的地方 8.知道println和print的区别第一章 Java概述 1.1 JavaSE体系介绍…

【干货】视频文件抽帧(opencv和ffmpeg方式对比)

1 废话不多说&#xff0c;直接上代码 opencv方式 import time import subprocess import cv2, os from math import ceildef extract_frames_opencv(video_path, output_folder, frame_rate1):"""使用 OpenCV 从视频中抽取每秒指定帧数的帧,并保存到指定文件夹…

关于队列的知识点以及例题讲解

本篇文章将带大家学习队列的相关知识点&#xff0c;并且讲解几道例题&#xff0c;请各位小伙伴耐心观看 队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表 遵循原则 先进先出 队列的实现 图解&#xff1a; 代码实…

性能监控工具

性能是任何一款软件都需要关注的重要指标。除了软件的基本功 能&#xff0c;性能可以说是评价软件优劣的最重要的指标之一。我们该如何有 效地监控和诊断性能问题呢?本章基于实践&#xff0c;着重介绍一些针对系统 和Java虚拟机的监控和诊断工具&#xff0c;以帮助读者在实际开…

软件测试——蓝桥杯笔记(自用)

Before和BeforeClass&#xff0c;在测试前&#xff0c;初始化Driver&#xff0c;BeforeClass适用于静态方法 After和AfterClass&#xff0c;在测试后&#xff0c;关闭Driver&#xff0c;AfterClass适用于静态方法 自动化测试记得使用BeforeClass&#xff0c;AfterClass 单元…

Linux应用 sqlite3编程

1、概念 SQLite3是一个轻量级的、自包含的、基于文件的数据库管理系统&#xff0c;常用于移动设备、嵌入式设备和小型应用程序中&#xff0c;应用场景如下&#xff1a; 移动应用程序&#xff1a;由于SQLite3是零配置、无服务器的数据库引擎&#xff0c;非常适合用于移动应用程…

【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)

导航&#xff1a; 本文一些内容需要聚簇索引、非聚簇索引、B树、覆盖索引、索引下推等前置概念&#xff0c;虽然本文有简单回顾&#xff0c;但详细可以参考下文的【MySQL高级篇】 【Java笔记踩坑汇总】Java基础进阶JavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成…