OpenCV与AI深度学习 | 实战 | 使用OpenCV和Streamlit搭建虚拟化妆应用程序(附源码)

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。

原文链接:实战 | 使用OpenCV和Streamlit搭建虚拟化妆应用程序(附源码)

现看看demo演示。

    本文将介绍如何使用Streamlit和OpenCV创建一个虚拟化妆应用程序。

    首先需要一个预先训练好的脸部解析模型,可以从这里下载:

https://github.com/Pavankunchala/Virtual_Makeup_Streamlit/blob/main/cp/79999_iter.pth

导入库

    我们使用Streamlit为该应用程序创建UI,并使用 OpenCV进行图像处理,可以使用以下代码通过 pip 安装它们:

pip install streamlit
pip install opencv-python 
pip install pillow

 导入需要的库

import cv2
import os
import numpy as np
from skimage.filters import gaussian
from test import evaluate
import streamlit as st
from PIL import Image, ImageColor

创建函数

    我们将创建一些函数来锐化图像以及解析头发:

import numpy as np
import cv2def sharpen(img):img = img * 1.0gauss_out = cv2.GaussianBlur(img, (0, 0), sigmaX=5, sigmaY=5, borderType=cv2.BORDER_DEFAULT)alpha = 1.5img_out = (img - gauss_out) * alpha + imgimg_out = img_out / 255.0mask_1 = img_out < 0mask_2 = img_out > 1img_out = img_out * (1 - mask_1)img_out = img_out * (1 - mask_2) + mask_2img_out = np.clip(img_out, 0, 1)img_out = img_out * 255return np.array(img_out, dtype=np.uint8)def hair(image, parsing, part=17, color=[230, 50, 20]):b, g, r = colortar_color = np.zeros_like(image)tar_color[:, :, 0] = btar_color[:, :, 1] = gtar_color[:, :, 2] = rnp.repeat(parsing[:, :, np.newaxis], 3, axis=2)image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)tar_hsv = cv2.cvtColor(tar_color, cv2.COLOR_BGR2HSV)if part == 12 or part == 13:image_hsv[:, :, 0:2] = tar_hsv[:, :, 0:2]else:image_hsv[:, :, 0:1] = tar_hsv[:, :, 0:1]changed = cv2.cvtColor(image_hsv, cv2.COLOR_HSV2BGR)if part == 17:changed = sharpen(changed)changed[parsing != part] = image[parsing != part]return changed

这段代码中使用了 cv2.GaussianBlur 函数来应用高斯模糊,并且假设 gaussian 函数已经被正确定义或者就是指 cv2.GaussianBlur。此外,cv2.cvtColor 用于在BGR和HSV色彩空间之间转换图像。这段代码的目的是修改图像中特定区域的颜色,并可选地对整个图像应用锐化效果。

标题和文件上传器

    那么让我们进入应用程序部分。我们使用 streamlit 的文件上传器来动态上传不同的图像进行测试:

import streamlit as st
from PIL import Image
import numpy as npDEMO_IMAGE = 'imgs/116.jpg'
st.title('Virtual Makeup')
st.sidebar.title('Virtual Makeup')
st.sidebar.subheader('Parameters')
table = {'hair': 17,'upper_lip': 12,'lower_lip': 13,
}img_file_buffer = st.sidebar.file_uploader("Upload an image", type=["jpg", "jpeg", 'png'])
if img_file_buffer is not None:image = np.array(Image.open(img_file_buffer))demo_image = img_file_buffer
else:demo_image = DEMO_IMAGEimage = np.array(Image.open(demo_image))

    上面代码使用了 Streamlit 库来创建一个简单的用户界面,允许用户上传图片或使用默认图片。在上面的代码片段中,我首先为 Demo-Image 创建了一个变量,应用程序默认使用该变量。我使用st.title()和st.sidebar.title()将标题添加到应用程序。

    同时创建了一个名为 table 的字典,它将名字与人脸解析器中的数字进行匹配。如果你想查看主仓库以获得更好的理解,你也可以添加它并解析人脸。

显示和调整大小

new_image = image.copy()
st.subheader('Original Image')
st.image(image,use_column_width = True)cp = 'cp/79999_iter.pth'
ori = image.copy()
h,w,_ = ori.shape
#print(h)
#print(w)
image = cv2.resize(image,(1024,1024))

    我们使用st.image()函数显示原始图像,并将其大小调整为 1024*1024,以使其与模型兼容。我们还创建了一个包含模型路径的变量。

评估并展示

import cv2
import streamlit as st
from PIL import Image, ImageColor
import numpy as np# 假设 evaluate 函数和 hair 函数已经定义parsing = evaluate(demo_image, cp)
parsing = cv2.resize(parsing, image.shape[0:2], interpolation=cv2.INTER_NEAREST)
parts = [table['hair'], table['upper_lip'], table['lower_lip']]hair_color = st.sidebar.color_picker('Pick the Hair Color', '#000000')
hair_color = ImageColor.getcolor(hair_color, "RGB")
lip_color = st.sidebar.color_picker('Pick the Lip Color', '#edbad1')
lip_color = ImageColor.getcolor(lip_color, "RGB")colors = [hair_color, lip_color, lip_color]for part, color in zip(parts, colors):image = hair(image, parsing, part, color)image = cv2.resize(image, (w, h))st.subheader('Output Image')
st.image(image, use_column_width=True)

    我们创建了一个名为valuate()的函数,可以从这里的test.py文件中找到它.

    使用 streamlit 的color_picker()函数创建了一个颜色选择器,并使用 PIL 库使其兼容应用于图像。

    最后,我调整输出图像的大小,然后基于图像的虚拟化妆应用程序就准备好了。

    要运行应用程序,请在终端中输入以下内容:

streamlit run app.py

    只需将 app.py 替换为您的代码的文件名。

    以下是我们得到的一些结果:

完整项目代码:

https://github.com/Pavankunchala/Virtual_Makeup_Streamlit

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

【GUI设计】基于Matlab的图像去噪GUI系统(8),matlab实现

博主简介&#xff1a; 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作&#xff0c;可联系主页个人简介提供的联系方式或者文末的二维码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像去噪GUI系统&am…

Android界面控件概述

节选自《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年7月出版 做最简单的安卓入门教程&#xff0c;手把手视频、代码、答疑全配齐 控件是Android界面的重要组成单元&#xff0c;Android应用主要通过控件与用户交互&#xff0c;Android提供了非常…

PPT 快捷键使用、技巧

前言&#xff1a; 本文操作是以office 2021为基础的&#xff0c;仅供参考&#xff1b;不同版本office 的 ppt 快捷键 以及对应功能会有差异&#xff0c;需要实践出真知。 shift 移动 水平/垂直 移动 &#xff1b; shift 放大/缩小 等比例放大 缩小 &#xff1b; 正圆 正…

AOP-代理实现

三种代理实现 1 JDK动态代理实现-基于接口代理 2 CGLIB动态代理实现-基于类代理 3 AspectJ 适配实现 为什么Proxy.newProxyInstance 会生成新的字节码&#xff1f; 创建代理类&#xff1a; Proxy.newProxyInstance 首先会检查缓存中是否有已存在的代理类字节码。 如果没有&…

Pencils Protocol 即将登录各大 CEX,依旧看好 $DAPP

近期&#xff0c;Scroll生态头部DeFi协议Pencils Protocol迎来了系列重磅市场进展。自9月18日开始&#xff0c;$DAPP通证分别在Tonkensoft、Bounce以及Coresky等平台陆续开启了IDO&#xff0c;并且在短期内售罄。同时在通证售卖完成后&#xff0c;DAPP 通证又在9月27日陆续登录…

​极狐阿尔法 S5安全至上,北汽极狐打造移动防护堡垒

在新能源汽车的广阔舞台上&#xff0c;北汽极狐以其卓越的品质和创新的技术&#xff0c;不断书写着辉煌篇章。其中&#xff0c;极狐阿尔法 S5更是以其强大的性能、豪华的配置和亲民的价格&#xff0c;成为了众多消费者关注的焦点。 北汽极狐的品质追求 北汽极狐一直以来都将品…

Mysql建表遇到重复的列名

调用接口拿到的数据rows&#xff0c;有很多行&#xff0c;每一行又有很多key-value pair&#xff0c;一开始代码是遍历第一行&#xff0c;每一对key-value&#xff0c;key作为建表时的列名&#xff0c;value的类型决定了该列在mysql中的类型 之后出现问题&#xff0c;表能建&am…

cve 漏洞排查流程

1、打开CVE连接 确认漏洞jar包以及版本信息 https://gitee.com/opengauss/security/issues/IASNOA?fromproject-issue 2、通过命令导出对应jar包的依赖树 并导出到目标结果文件中 mvn dependency:tree -Dincludes:gson > gson.result.txt 3、过滤test引用…

Python PyQt5 在frame中生成多个QLabel控件和彻底销毁QLabel控件

文章目录 步骤 1: 创建主窗口和布局步骤 2: 添加QLabel到QFrame步骤 3: 销毁QLabel示例代码 在PyQt5中&#xff0c;在QFrame或任何其他容器控件中生成多个QLabel控件并通过一个标志位或方法来彻底销毁这些QLabel控件是相对直接的操作。以下是一个简单的示例&#xff0c;展示了如…

【Midjourney中文版:AI绘画新纪元,赋能创意设计与开发】

在数字艺术与设计领域&#xff0c;创新与效率并重。Midjourney中文版&#xff0c;作为一款强大的AI绘画工具&#xff0c;正引领我们步入一个全新的创意时代。它不仅简化了复杂的绘画流程&#xff0c;更以智能算法为驱动力&#xff0c;为开发者、设计师及所有创意工作者带来了前…

如何在postman中传入文件参数

如何在postman中传入文件参数 打开Body中的form-data&#xff0c;将请求所需的参数写到Key中&#xff0c;点击右侧的按钮选择File&#xff0c;在Value列中即可上传本地文件。

并发编程---线程与进程

业务场景&#xff1a;小明去理发店理发。 小明去理发店理发&#xff0c;完成理发需要吹&#xff0c;剪&#xff0c;洗、理的过程。由这个场景我们引用进程和线程这两个 概念。 一.进程 1.什么是进程 进程是具有独立功能的程序关于某个数据集合上的一次运行活动&#xff0c;是…

js删除emoji表情问题

emoji标签占位两个 &#xff0c;直接删除后一位会出现乱码符&#xff1b; 判断是否是emoji function isEmoji(char) {let code char.charCodeAt(0);return code>55296&&code<57343 } // 使用方法&#xff0c;传入单字符 console.log(isEmoji(1)); // false con…

算法复杂度之时间复杂度

一 . 数据结构前言 1.1 数据结构 数据结构(Data structure) 是计算机存储&#xff0c;组织数据的方式&#xff0c;指互相之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用&#xff0c;所以要学习各式各样的数据结构&#xff0c;如&#…

pilz皮尔兹PSSuniversal分散控制平台 Dezentrale Steuerungsplattform 手测

pilz皮尔兹PSSuniversal分散控制平台 Dezentrale Steuerungsplattform 手测

【科研小小白】理解图片容量、像素、尺寸、分辨率各自含义、 像素、分辨率与实际尺寸之间的转换关系

理解图片容量、像素、尺寸、分辨率各自含义&#xff1a; 通过之前的学习&#xff0c;我们知道了图片有这4个参数&#xff0c;下面给大家总结一这下4个参数的具体含义。 1、容量&#xff08;占内存&#xff09;&#xff1a;是指图像文件的存贮空间&#xff0c;也就是文件的大小…

华为OD机试 - 获取最多食物 - 拓扑排序、动态规划(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python+Django+Vue Python爬虫 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

职场基本功:情绪管理的行动指南(前置情绪管理)

文章目录 引言情绪管理的目标情绪产生的阶段前置情绪管理避免情绪失控的技巧案例分析引言 成熟的职场人,必备的五项技能: 管理自己的情绪:职场需要你的行为是可控的,只有情绪是稳定的,其他人才能顺利地跟你展开协作。称赞他人:赞赏能让你获得一个友好的交流环境求助他人…

为什么这款智能在线派单软件成为行业首选?

智能在线派单软件通过自动化任务分配等提升效率&#xff0c;ZohoDesk因其全方位服务管理、智能分配、定制性强、数据分析等功能&#xff0c;成为企业优选。实例涵盖物流、家政、维修、医疗等行业&#xff0c;提高效率和客户满意度。 一、智能在线派单软件有什么功能 在深入探讨…