作者 | 刘早起

来源 | 早起Python

圣诞节快到了,每年一到圣诞节就会有很多人的头像上多了一顶小红帽

那么你有想过如何用Python去实现吗?

如果你尝试去搜索,会发现网上教程一大堆,但是由于大多数人都将圣诞帽位置固定了,所以放上自己的图片后,要不就是圣诞帽偏移了,要不就是帽子比头还大,代码也不知道在哪里改,无从下手。

因此,本文将手把手教你如何用Python为你的微信头像添加一顶圣诞帽,并结合PySimpleGUI,做成一个带有GUI的小程序,先看效果:

本次主要分为两个部分讲解:

  • 用opencv对头像添加圣诞帽

  • 结合PySimpleGUI制作人性化圣诞帽添加软件

主要涉及的Python模块有:

  • PIL

  • PySimpleGUI

  • cv2

  • os

在开始之前,你需要使用pip对相关依赖库进行安装

pip install pillow   #这是对模块PTL的安装pip install opencv-python    #这是对cv2的安装pip install os pip install PySimpleGui

利用opencv对头像处理

本文用到的圣诞帽,是.png格式的,如下

为了识别照片,我们需要安装一个OpenCV的内置人脸识别插件,安装步骤:

用浏览器打开网址opencv.org---进入Releases---下载对应版本的OpenCV(一定要记住存放这个插件的路径!!!后面要用到)

和以前一样,我们先看本节全部代码,然后进行讲解????

import cv2from PIL import ImagepersonPath = '3.jpg'  #头像hatPath = 'sheng.png'  #圣诞帽personImg = cv2.imread(personPath)face_haar = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#存放的绝对路径faces = face_haar.detectMultiScale(personImg, 1.1,5)personImg = Image.open(personPath)personImg = personImg.convert('RGBA')hatImg = Image.open(hatPath)hatImg = hatImg.convert('RGBA')for face_x,face_y,face_w,face_h in faces:    face_x -= face_w-180    face_y += face_h-250    face_w *= 1    face_h *= 1    hatImg = hatImg.resize((face_w, face_h))    bg = (face_x, face_y - face_h + 100 , face_x + face_w, face_y + 100 )    personImg.paste(hatImg, bg, mask = hatImg)#将调整好的帽子贴上去personImg.save('addHat.png')

下面对代码进行讲解。

首先,引入两个模块,用cv2.imread(personPath)来读取相对路径下的图片。

“cv2.imread('图像路径','读取方式'):默认为cv2.imread_color以彩色图像模式读取。

cv2.CascadeClassifier('分类器的路径'):简单来说就是做人脸检测的一个必备方面,专业名词叫做级联分类器。这个分类器到目前版本容纳了Haar特征器和LBP特征分类器两个分类器。这次我们使用常规用的Harr特征器”

Haar特征分类器就是一个xml文件,是OpenCV官方训练好的检测器,它能反应图像的灰度变化,以像素分模块求差值的一种特征。下面我们讲讲它的路径

在我们准备工作中我们在OpenCV的官网下载了人脸识别的插件。

以安装在D盘为例,Harr特征分类器就在我们的:

D:\opencv\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml

注意:在第6行代码中,我们调用这个特征器的路径最好使用绝对路径!上述代码只是演示

关键代码就是:

detectMultiScale(image,scaleFactor,minNeighbors)。

检验出图片中的所有人脸,并以向量类型保存各个人脸的位置和大小,最后用矩形Rect类表示,该函数由分类器((也就是上述的Haar特征分类器))的对象进行调用。

其中参数如下:

“image是我们要做人脸检测的图片。

scaleFactor表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;

minNeighbors表示构成检测目标的相邻矩形的最小个数(默认为3个)。”

而后就是我们常见的用Pillow模块打开两张图片,不过这次的打开方式是以RGBA模式打开,即四通道模式(A指透明度)。

最后一个for循环就是读取用cv2解析出来的帽子faces参数,这里有趣的一点是,cv2做人脸识别后,会在两眼之间画一条线,并以中间为原点,做x和y轴建立坐标系。最后调节Pillow解析出来的帽子x和y位置,摆到人头上方。所有这个方法对正脸敏感,对侧脸不太友好。

personImg.save('addHat.png')表示存储添加圣诞帽后的照片。

GUI框架整合

现在我们在上一节的基础上,将圣诞帽添加与GUI框架进行整合,还是先上代码之后拆分讲解

import PySimpleGUI as sgimport os.pathsg.change_look_and_feel("BrightColors")file_list_column = [    [sg.Submit('Go',tooltip='按下面的要素添加圣诞帽',size=(15, 1)), sg.Cancel(size=(15, 1))],    [        sg.Text("图片位置"),        sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"),        sg.FolderBrowse('浏览'),    ],    [        sg.Text("帽子宽度"),        sg.In(size=(25, 1), enable_events=True, key="hat-w"),    ],    [        sg.Text("帽子高度"),        sg.In(size=(25, 1), enable_events=True, key="hat-h"),    ],    [        sg.Text("帽子横移"),        sg.In(size=(25, 1), enable_events=True, key="hat-x"),    ],    [        sg.Text("帽子纵移"),        sg.In(size=(25, 1), enable_events=True, key="hat-y"),    ],    [        sg.Listbox(            values=[], enable_events=True, size=(40, 20), key="-FILE LIST-"        )    ],]image_viewer_column = [    [sg.Text("从左边图片列表中选择一张图片:",size=(60, 1),key = "notice")],    [sg.Text("左边的四个参数调节是在上面的参数基础上进行加减乘除;其中宽度和高度调试单位为个位数(需要大于0且是整数),横纵移动调试单位可任意调",size=(50, 3), key="-TOUT-")],    [sg.Image(key="-IMAGE-")],]layout = [    [        sg.Column(file_list_column),        sg.VSeperator(),        sg.Column(image_viewer_column),    ]]window = sg.Window("圣诞帽添加软件", layout)while True:    event, values = window.read()if event == "Cancel" or event == sg.WIN_CLOSED:breakif event == "-FOLDER-":        folder = values["-FOLDER-"]try:            file_list = os.listdir(folder)except:            file_list = []        fnames = [            ffor f in file_listif os.path.isfile(os.path.join(folder, f))and f.lower().endswith((".jpg", ".png"))        ]        window["-FILE LIST-"].update(fnames)elif event == "-FILE LIST-":try:            filename = os.path.join(                values["-FOLDER-"], values["-FILE LIST-"][0]            )            window["-TOUT-"].update(filename)except:passelif event== "Go" :        personPath = filename'''        圣诞帽添加部分        '''        window["notice"].update()        window["-IMAGE-"].update(filename='addHat.png')window.close()

代码解析,这里强烈建议读者结合GUI进阶篇中的图片查看器讲解一起看。当然在做PySimpleGUI之前继续唠叨基本步骤:

“Import   Create some widgets  Create the window  Create the event loop”

这里我们layout的摆放思路如下:一个圣诞帽添加键、一个退出程序键、4个文本框来调节图片中的圣诞帽、一个列表箱子装路径下的所有图片、一个图片显示框、几条用于提示用户的文本框。按照这个思路,我们就有了while循环上面的代码编写。

接着是loop事件循环:这里我们以Go键促发圣诞帽添加,所以我们以这个按钮为第一个主if元素。

在按钮Go促发前我们需要进行两个判断:

“一是文本框没有输入任何东西、

二是文本框输入的东西。如果是前者,我们直接调动添加圣诞帽的程序(默认参数)并且在图片上方显示4个参数(x,y,w,h),即坐标和帽子大小。”

如果是后者的话,我们会让添加圣诞帽程序中的4个参数在原基础上加减乘除用户输入的数字,并在图片上方显示最终的4个参数。

最终效果如下

打包

最后简单讲一下如何将上面的程序打包为exe格式,让没有Python环境的用户也能使用,首先下载pyinstaller模块

pip install pyinstaller

如果你的上述项目代码文件命名为:hat.py。那么你要用下面命令在cmd窗口进行打包

pyinstaller hat.py

打包过程会有点慢。成功后,在py文件所在文件夹找到一个dist的子文件夹。进去之后,找到pachong.exe文件并运行它即可。文件夹里附带了很多文件,你可以删除它。

最后早起也将源码和打包后的程序提供给大家下载,你可以在公众号「早起Python」后台回复圣诞即可。

因为打包后的exe较大(200多M),为了方便大家从Python脚本中使用,你必须按照本文开头提示的安装对应模块与下载插件,如果有问题的话,相信下面的tips可以帮到你。

“如果不打包的话,先把圣诞帽的图片(png格式)和代码程序放在相同路径下。

进到软件后先点击浏览按钮选择图片存储路径(注意:路径内不能出现中文,只能英文+数字,这可能是因为Python中的OpenCV库的bug)。完毕后就可以看到下方所在文件夹的全部.jpg和.png文件。点击一个你想要添加圣诞帽的图片,在按Go按钮,在右边的图片框中就会刷新已经代码帽子的头像!同时,在程序的路径下也会有这张图片的.jpg格式文件。

图片框中除了图片还有4个参数,4个参数的作用就是调节帽子大小和位置。因为每张图片不同,所以帽子会出现大小不一、偏移的情况。而后,你就需要在左边的4个输入框中输入参数来调试(4个输入框是在原参数基础上进行数乘运算),以达到帽子的最佳效果,如果超出范围,命令框会提示错误。输入后还是一样按Go键,结束按Cancel键。”

以上就是本文的分享,你可以在本文的基础上进行修改来实现不同的效果。

更多精彩推荐
  • 赠书 | 手把手教你自己动手打造一个智能恒温器

  • 仅剩一周!!CSDN年终大放血!人人有份的大奖你确定不来?

  • 对人脑而言,阅读计算机代码和阅读语言有何不同?

  • 最高要价 8888元,小米 11 邀请函现身闲鱼;荣耀与微软签署全球 PC 合作协议;Xfce 4.16 发布|极客头条

  • Python 新人笑、C# 旧人哭,你立的技术 Flag 2020 实现了吗?

圣诞节,教你用Python给微信头像添加一个圣诞帽相关推荐

  1. 圣诞节,教你用Python给微信头像添加一个圣诞帽!

    作者:刘早起 来源:早起Python 圣诞节快到了,每年一到圣诞节就会有很多人的头像上多了一顶小红帽 那么你有想过如何用Python去实现吗? 如果你尝试去搜索,会发现网上教程一大堆,但是由于大多数人 ...

  2. 教你用 Python 将微信头像秒变成表情包

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料 ...

  3. python软件设计背景_教你用Python制作微信好友背景墙

    目录: 0 引言 1 环境 2 代码实现 3 后记 0 引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这 ...

  4. python头像右上角加红色数字_利用python实现微信头像加红色数字功能

    通过Python实现将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 实现过程: 准备两张图片如下: 使用PIL图像处理库,导入moudle ...

  5. python itchat教程_Python学习教程:教你用Python通过微信来控制电脑摄像头

    原标题:Python学习教程:教你用Python通过微信来控制电脑摄像头 如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证.今天的Python学习教程就来通 ...

  6. 如何用计算机自动回复微信,10分钟教你用Python实现微信自动回复功能

    01 前言&&效果展示 相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息.但微信又不能像QQ一样设置自动回复.无妨,今天,我们就来用Python实现微信的自动回复功能吧,并且把 ...

  7. Python玩微信头像组字

    Python玩微信头像组字 思路 itchat 获取头像图片 汉字转点阵 头像图片拼接 九宫格效果 回顾 代码 最后 上一篇,用Python实现了拿微信好友头像来拼接背景,融合成自己的新头像. 再之前 ...

  8. python程序设置头像_利用python实现微信头像加红色数字功能

    通过Python实现将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 实现过程: 准备两张图片如下: 使用PIL图像处理库,导入moudle ...

  9. python实现淘宝自动回复_10分钟教你用Python实现微信自动回复功能

    01 前言&&效果展示 相信大家都有忙碌的时候,不可能一直守在微信上及时回复消息.但微信又不能像QQ一样设置自动回复.无妨,今天,我们就来用Python实现微信的自动回复功能吧,并且把 ...

  10. 求求你给你的微信头像戴个圣诞帽吧!

    作者 |  刘早起  责编 | 张文 头图 | CSDN 下载自视觉中国 来源 | 早起Python(ID:zaoqi-python) 圣诞节快到了,每年一到圣诞节就会有很多人的头像上多了一顶小红帽. ...

最新文章

  1. python实现平衡二叉树_LeetCode 110. 平衡二叉树 | Python
  2. Python 之 Numpy (四)索引
  3. 二十二:制作app的时候超出部分不能滑动
  4. C++使用类静态成员跟踪对象的个数
  5. Android高级第九讲--JVM 与Android Dalvik之间的异同
  6. Ubuntu的网络设置
  7. QQ无法安装,不用着急,用毒霸2011来解决
  8. attachment delete deletion commit work issue
  9. 灵动标签调用友情链接
  10. MyBatis_ibatis和mybatis的区别【转】
  11. 中添加复选框_Word/excel中在方框中打钩/叉的符号,简单方便快捷
  12. 互联网日报 | 7月15日 星期四 | B站赠送所有用户1天大会员;饿了么投入3亿用于今夏骑手保障;小米智能工厂二期开工...
  13. Selenium代码示例
  14. java暂停脚本_用Rhino解析Java中的JavaScript:暂停/恢复脚本
  15. java教程视频下载,你值得拥有
  16. C++ 虚函数和虚函数表
  17. ros buntu安装手册_超详细 ROS安装教程
  18. java判断一个点在不在直线上,判断点在直线左侧或者右侧
  19. android跨应用调用方法是,Android如何实现不同应用之间的调用
  20. Js放在head和body中的区别

热门文章

  1. ios10下的通知更新
  2. vb如何调用计算机日历,跪求vb.net简易日历制作的源代码
  3. 手机APP开发之MIT Appinventor详细实战教程(二),实现音乐软件的编程
  4. 综述:图像风格化算法最全盘点 | 内附大量扩展应用
  5. ES根据日期查询数据
  6. 日期抽象数据类型设计与实现作业总结
  7. 新计算机分区,新电脑如何分区 新电脑怎么分盘
  8. (二)大话深度学习编译器中的自动调优·DSL与IR
  9. ios 网速监控_iOS开发网络篇—监测网络状态
  10. appcan代码迁出失败