python + opencv + dlib 实现实时唇色变换 | 虚拟上妆

2023-10-20 00:20

本文主要是介绍python + opencv + dlib 实现实时唇色变换 | 虚拟上妆,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击下方“AI算法与图像处理”,一起进步!重磅干货,第一时间送达

代码:https://github.com/ai-coodinator/lipstick

大家好,今天跟大家分享一个利用python + opencv + dlib 实现一个带滑动条控制的唇色变换案例!

大致内容包括:

1、demo展示

2、思路剖析

3、算法实现

如果内容对你有所帮助的话,这次帮我点个在看分享一下吧

一、demo效果展示

demo已经上传到视频号上了,可以直接点击观看,欢迎关注!

从demo 中可以看到,当我们调整下方的三个RGB 滑动条的时候,可以实现实时的调整嘴唇的颜色。

下面看一下具体的实现思路!

二、思路剖析

具体的思路可以分为下面几个部分:

1、人脸关键点检测

2、嘴唇区域mask提取

3、嘴唇区域上色并与原图融合


1、关键点检测

这里使用的dlib,进行人脸关键点检测(检测到 68 个人脸关键点)

在项目中的 Face_Parts.py  中已实现了对人脸的各个区域的关键点和关键点围成的多边形可视化,后续如果需要对其他部分(非嘴唇区域)进行类似上色,或者变装等,都可以自行拓展使用。

2、嘴唇区域mask提取

通过dlib 检测到的嘴唇区域关键点序列(关键点序号48-61),提取序列并将嘴唇区域关键点连成一个多边形,制作成一个mask,以便后续进行上色处理

3、嘴唇区域上色并与原图融合

这里通过opencv 的滑动条,来进行交互,实现从外部输入 自定义的 rgb 颜色,从而改变唇色,并使用 alpha 融合与原图融合生成最终的效果(PS:这里作者使用高斯模糊处理,让 mask 区域更加的平滑,不会那么尖锐,看起来更加自然)

滑动条的创建和值的获取使用的函数分别是:

cv2.createTrackbar
cv2.getTrackbarPos

三、算法实现

下面是具体的算法实现,这里备注

shape_predictor_68_face_landmarks.dat

可以去 dlib 项目去下载:

https://github.com/davisking/dlib-models

import cv2
import numpy as np
import dlibdetector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")def empty(a):passcv2.namedWindow('BGR')
cv2.resizeWindow('BGR',640,240)
cv2.createTrackbar('Blue','BGR',0,255,empty)
cv2.createTrackbar('Green','BGR',0,255,empty)
cv2.createTrackbar('Red','BGR',0,255,empty)def createBox(img,points,scale=5,masked=False,cropped = True):if masked:mask = np.zeros_like(img)mask = cv2.fillPoly(mask,[points],(255,255,255))img = cv2.bitwise_and(img,mask)# cv2.imshow('Mask',img)if cropped:bbox = cv2.boundingRect(points)x,y,w,h = bboximgCrop = img[y:y+h,x:x+w]imgCrop = cv2.resize(imgCrop,(0,0),None,scale,scale)return imgCropelse:return maskwhile True:# image# 1 读入图片并进行人脸关键点检测img = cv2.imread('1.jpg')img = cv2.resize(img,(0,0),None,0.5,0.5)imgOriginal = img.copy()imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = detector(imgGray)for face in faces:x1,y1 = face.left(),face.top()x2,y2 = face.right(),face.bottom()# imgOriginal = cv2.rectangle(img, (x1,y1),(x2,y2),(0,255,0),2)landmarks = predictor(imgGray,face)myPoints =[]for n in range(68):x = landmarks.part(n).xy = landmarks.part(n).ymyPoints.append([x,y])# cv2.circle(imgOriginal,(x,y),5,(50,50,255),cv2.FILLED)# cv2.putText(imgOriginal,str(n),(x,y-10),cv2.FONT_HERSHEY_COMPLEX_SMALL,0.9,(0,0,255),1)myPoints = np.array(myPoints)# imgLeftEye = createBox(img,myPoints[36:42],8)# cv2.imshow('LeftEye',imgLeftEye)# 2 嘴唇区域mask提取imgLips = createBox(img,myPoints[48:61],8,masked=True,cropped=False)imgColorLips = np.zeros_like(imgLips)# 3 创建滑动条,以及获取滑动条的值,嘴唇区域上色并与原图融合b = cv2.getTrackbarPos('Blue','BGR')g = cv2.getTrackbarPos('Green','BGR')r = cv2.getTrackbarPos('Red','BGR')imgColorLips[:] = b,g,rimgColorLips = cv2.bitwise_and(imgLips,imgColorLips)imgColorLips = cv2.GaussianBlur(imgColorLips,(7,7),10)#color_imageimgColorLips = cv2.addWeighted(imgOriginal,1,imgColorLips,0.4,0)#gray_image# imgOriginalGray = cv2.cvtColor(imgOriginal,cv2.COLOR_BGR2GRAY)# imgOriginalGray = cv2.cvtColor(imgOriginalGray,cv2.COLOR_GRAY2BGR)# imgColorLips = cv2.addWeighted(imgOriginalGray,1,imgColorLips,0.4,0)cv2.imshow('BGR',imgColorLips)# cv2.imshow('Lips',imgLips)print(myPoints)cv2.imshow("Original",imgOriginal)cv2.waitKey(1)

好的,这样子就实现我们唇色变换的功能,今天的分享就到这里了。喜欢的小伙伴记得三连支持!感谢

怕小伙伴没注意,这里再分享一下代码:

代码:https://github.com/ai-coodinator/lipstick

努力分享优质的计算机视觉相关内容,欢迎关注:

个人微信(如果没有备注不拉群!)
请注明:地区+学校/企业+研究方向+昵称下载1:何恺明顶会分享
在「AI算法与图像处理」公众号后台回复:何恺明,即可下载。总共有6份PDF,涉及 ResNet、Mask RCNN等经典工作的总结分析
下载2:终身受益的编程指南:Google编程风格指南
在「AI算法与图像处理」公众号后台回复:c++,即可下载。历经十年考验,最权威的编程规范!
下载3 CVPR2021在「AI算法与图像处理」公众号后台回复:CVPR,即可下载1467篇CVPR 2020论文 和 CVPR 2021 最新论文

点亮 ,告诉大家你也在看

这篇关于python + opencv + dlib 实现实时唇色变换 | 虚拟上妆的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/flyfor2013/article/details/119012883
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/243315

相关文章

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软

Java 压缩包解压实现代码

《Java压缩包解压实现代码》Java标准库(JavaSE)提供了对ZIP格式的原生支持,通过java.util.zip包中的类来实现压缩和解压功能,本文将重点介绍如何使用Java来解压ZIP或RA... 目录一、解压压缩包1.zip解压代码实现:2.rar解压代码实现:3.调用解压方法:二、注意事项三、总

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一

Linux实现简易版Shell的代码详解

《Linux实现简易版Shell的代码详解》本篇文章,我们将一起踏上一段有趣的旅程,仿照CentOS–Bash的工作流程,实现一个功能虽然简单,但足以让你深刻理解Shell工作原理的迷你Sh... 目录一、程序流程分析二、代码实现1. 打印命令行提示符2. 获取用户输入的命令行3. 命令行解析4. 执行命令

基于MongoDB实现文件的分布式存储

《基于MongoDB实现文件的分布式存储》分布式文件存储的方案有很多,今天分享一个基于mongodb数据库来实现文件的存储,mongodb支持分布式部署,以此来实现文件的分布式存储,需要的朋友可以参考... 目录一、引言二、GridFS 原理剖析三、Spring Boot 集成 GridFS3.1 添加依赖

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

Python+PyQt5实现文件夹结构映射工具

《Python+PyQt5实现文件夹结构映射工具》在日常工作中,我们经常需要对文件夹结构进行复制和备份,本文将带来一款基于PyQt5开发的文件夹结构映射工具,感兴趣的小伙伴可以跟随小编一起学习一下... 目录概述功能亮点展示效果软件使用步骤代码解析1. 主窗口设计(FolderCopyApp)2. 拖拽路径