热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于C++的人脸过渡项目

本文主要介绍关于c++,人脸过渡,源码,报告,课程设计的知识点,对【基于C++的人脸过渡项目】和【现在刷脸技术如何】有兴趣的朋友可以看下由【biyezuopin】投稿的技术文章,希望该技术和经验能帮到

本文主要介绍关于c++,人脸过渡,源码,报告,课程设计的知识点,对【基于C++的人脸过渡项目】和【现在刷脸技术如何】有兴趣的朋友可以看下由【biyezuopin】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的相关技术问题。

现在刷脸技术如何

资源下载地址:https://download.csdn.net/download/sheziqiong/85884715
资源下载地址:https://download.csdn.net/download/sheziqiong/85884715

人脸过渡报告 基本功能介绍

此次课程设计实现了从一张人脸照片到另一张人脸照片的过渡。

使用程序流程:

选取控制点(特征点):使用者可以选择已经存储于文件中的控制点,也可以自己手动选择控制点。在选择的时候需要注意,源图像(SI)中控制点和目标图像(DI)中控制点顺序需要对应(比如 SI 中先选眼睛再选鼻子,那么 DI 中也需要先选眼睛再选鼻子),其次,控制点的数量也需要保持一致,如若不然,选取的控制点无效,会被要求重新选取。

显示 Delaunay 分割效果:完成本次作业的核心算法之一便是 Delaunay 三角分割。所以会显示 Delaunay 分割效果。

选择产生多少张过渡图片:过渡图片的数量是使用者选择的。

生成过渡图片并保存:这个过程可能需要一定的时间,程序运行完成之后可以在当前目录下查看产生的图片。

展示过渡图片:每张图片停留 1s。

选择是否保存此次选择的特征点:若保存此次选择的特征点,下次运行程序之时可以直接调用保存后的文件。

设计思路

为了实现程序功能,需要完成以下过程:

人工选取控制点。控制点取在眉心、眼珠、鼻子两侧等特征比较明显的部位。控制点选好之后进行 Delaunay 三角化。根据选择的特征点将一张图片剖分为若干个三角形。根据控制点对应关系,得到 SI 剖分三角形和 DI 剖分三角形对应关系。根据 SI 剖分三角形和 DI 剖分三角形对应关系和过渡系数得到过渡图像中三角形与源/DI 剖分三角形对应关系。根据三角形对应关系,求出仿射矩阵。根据仿射矩阵,求出过渡图像中每一点仿射到源/DI 中的点(很有可能是个浮点数)。不同点在不同三角形中,所以对应的仿射矩阵很可能是不一样的。根据仿射得到点的坐标,再由双线性插值得到过渡图片中每一点在源/DI 中像素值。根据双线性插值结果和过度系数,求出过渡图片像素点的像素值。从而得到过渡图片。改变过度系数,重新得到新的过渡图片,直至过渡完成。 原理

基本原理:

人脸过渡过程,可以使看作 SI 权重不断减小和 DI 权重不断增大,其本质是多次映射。图像权重体现为坐标和像素值权重。

可以这样来想,从 SI 直接变化到 DI 就,没有映射,没有过渡。但是从 SI 照片经过一张过渡照片,再到 DI,就有一次过渡,这个过程中就会发生两次映射,分别是 SI 映射到过渡图片,DI 映射到过渡图片。依此类推,当有两张过渡图片时,会发生四次映射。

在映射的过程中,如果用一个矩阵来代替,必然会导致有很大的误差,为了缩小这个误差,我们应该将图片分为若干个三角形或者是四边形(我选择是分为三角形),这样每个三角形中包含点的映射矩阵就由三角形的三个顶点来确定,而三角形的顶点就是由选取的控制点来确定的。

因为图像可以被剖分为许多三角形,所以我就拿三角形来举个例子:

源图中三角形三个点分别为【(0,0),(100,100)(100,0)】,DI 中三个点分别为【(0,0),(200,200),(200,0)】。若只有一张过渡图片,那么与该三角形对应的过渡三角形应该为【(0,0),(150,150)(150,0)】。若有两张过渡图片,那么对应的两个三角形分别为【(0,0),(133,133,0)(133,0)】和【(0,0),(166,166),(166,0)】。依此类推,就可以知道产生 n 张过渡图片,每张过渡图片的三角形坐标。

得到映射矩阵之后,分别求出 SI 和 DI 到过渡图像的映射,最后再附加上像素值权重,便得到过渡图像。

控制点的选取。

控制点的选取直接影响了过渡图片的质量,根据前面的叙述,三角形映射矩阵是由控制点决定的。那么为什么控制点的选取要选择具有特征的点?

就拿人的眼睛来举例子,如果在 SI 和 DI 中,包含眼睛的三角形控制点不是眼睛,那么 SI 和 DI 分别向过渡图像映射之后,眼睛的位置可能不是重叠的,这就会导致过渡图像中眼睛数量翻了一倍。

三角剖分算法

图像三角化要求产生的三角形边不会相交,并且所有的三角形能够刚好完全覆盖整个图像。在实现此目的时,我选用了 openCV 中的 Delaunay 剖分,Subdiv2D 这个类。

仿射

仿射的目的是要知道过渡三角形中每一个点对应 SI/DI 中三角形的点。

若已知,三角形 A 的三个顶点,分别为(x1,y1),(x2,y2),(x3,y3)对应三角形 B 的顶点为(a1,b1),(a2,b2),(a3,b3)

可以求出 A->B 的仿射矩阵。

Aff =

基于C++的人脸过渡项目

若已知三角形 A 中某点为(m,n)

可以求出其对应的点(c,d)

基于C++的人脸过渡项目

双线性插值

根据仿射变换求出对应点坐标是为了得到像素值。

得到的坐标多数情况下不是整数,而如何求取非整数(非网格点)处像素值呢?

我采用的是双线性插值法:

如下图:假设 P 为我们要求的插值节点,Q11,Q12,Q21,Q22 为网格点。

基于C++的人脸过渡项目

双线性插值方法是先在一个方向上插值(x 方向),再在另一个方向上插值(y 方向)。

举个例子,先在 x 上插值:

基于C++的人脸过渡项目

再在 y 上插值:

基于C++的人脸过渡项目

程序实现以及结果

控制点选取

主要调用 setMouseCallback()函数,得到鼠标左键点击处坐标。

并且调用 circle()函数将鼠标左键左键点击处点亮。

基于C++的人脸过渡项目

Delaunay 三角化

利用 openCV 中的 Subdiv2D 类,将控制点插入后,就可以得到三角化后,三角形的坐标,然后我再将三角形的边画出来,得到以下结果。

基于C++的人脸过渡项目

基于C++的人脸过渡项目


基于C++的人脸过渡项目

仿射矩阵计算以及坐标仿射

仿射矩阵计算:

基于C++的人脸过渡项目

坐标仿射:

基于C++的人脸过渡项目

双线性插值

基于C++的人脸过渡项目

实验结果以及对结果的讨论

由于产生的图片比较多,不放便一张一张的贴出来,所以找了一张有特点的。

基于C++的人脸过渡项目

以上图片出现了一个问题就是,某些区域会变得模糊,在这张图片中是下巴部分(原因肯可能是我在选取控制点时没选取好,下巴和下巴没有对应起来,也怪 Trump 是个双下巴,不好找。)

实验中遇到的问题

特征点的选取必须要有对应顺序,如果顺序不对应,那么产生的过渡照片质量会很糟糕。

而顺序检验这一点程序无法做到,能做到的只有特征点数量检测。

资源下载地址:https://download.csdn.net/download/sheziqiong/85884715
资源下载地址:https://download.csdn.net/download/sheziqiong/85884715

本文《基于C++的人脸过渡项目》版权归biyezuopin所有,引用基于C++的人脸过渡项目需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 本文详细探讨了OpenCV中人脸检测算法的实现原理与代码结构。通过分析核心函数和关键步骤,揭示了OpenCV如何高效地进行人脸检测。文章不仅提供了代码示例,还深入解释了算法背后的数学模型和优化技巧,为开发者提供了全面的理解和实用的参考。 ... [详细]
  • 面部识别技术面临关键转折点:伦理与应用的平衡挑战
    面部识别技术正面临一个关键的转折点,其伦理与应用之间的平衡问题日益凸显。近日,该技术再次遭遇重大事件。本周二,由90个倡议组织组成的联盟发布了一份联合声明,呼吁全球范围内暂停使用面部识别技术,直到制定出明确的监管框架。这一举措反映了社会各界对隐私保护和技术滥用的担忧,同时也引发了关于如何在保障公共安全和维护个人隐私之间找到合理平衡的广泛讨论。 ... [详细]
  • ImimplementingacustomlexerinC++andwhenattemptingtoreadinwhitespace,theifstreamwont ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • CRZ.im:一款极简的网址缩短服务及其安装指南
    本文介绍了一款名为CRZ.im的极简网址缩短服务,该服务采用PHP和SQLite开发,体积小巧,约10KB。本文还提供了详细的安装步骤,包括环境配置、域名解析及Nginx伪静态设置。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文探讨了一种创新的RGBD多模态融合技术在人脸识别中的应用,该方法通过深度学习算法有效整合了不同模态数据的共有及独特特征,显著增强了系统的识别精度与鲁棒性。此技术特别适用于需要高安全性和准确性的多模态交互场景,如智能监控和身份验证系统。 ... [详细]
  • 利用TensorFlow.js在网页浏览器中实现高效的人脸识别JavaScript接口
    作者|VincentMühle编译|姗姗出品|人工智能头条(公众号ID:AI_Thinker)【导读】随着深度学习方法的应用,浏览器调用人脸识别技术已经得到了更广泛的应用与提升。在 ... [详细]
  • 最近版上有不少人在讨论图像处理的就业方向,似乎大部分都持悲观的态度。我想结合我今年找工作的经验谈谈我的看法。就我看来,个人觉得图像处理的就业还是不错的。 ... [详细]
  • 快加入「我的最爱」吧 Python 开发者不容错过的30 个Github 开源专案(上)
    愈来愈多人使用Python来进行不同的功能,例如进行机器学习等。如果想透过Python使用这些功能,可以在GitHub上找开源专题。以下介绍在GitHu ... [详细]
  • “编程能力差!90%输在了这点上!”谷歌开发:其实你们都是瞎努力
    这是一个很难让人心平气和的年代。通过CSDN的帖子发现,很多人都想学人工智能,但总担心自己编程能力差,学不会,学不懂 ... [详细]
author-avatar
明恋夏日2
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有