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 实现实时唇色变换 | 虚拟上妆的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/243315

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e