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

相关文章

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python从零打造高安全密码管理器

《Python从零打造高安全密码管理器》在数字化时代,每人平均需要管理近百个账号密码,本文将带大家深入剖析一个基于Python的高安全性密码管理器实现方案,感兴趣的小伙伴可以参考一下... 目录一、前言:为什么我们需要专属密码管理器二、系统架构设计2.1 安全加密体系2.2 密码强度策略三、核心功能实现详解