前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >圣诞节,教你用Python给微信头像添加一个圣诞帽!

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

作者头像
刘早起
发布2021-01-05 23:41:12
9170
发布2021-01-05 23:41:12
举报
文章被收录于专栏:早起Python早起Python

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

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

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

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

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

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

主要涉及的Python模块有:

  • PIL
  • PySimpleGUI
  • cv2
  • os

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

代码语言:javascript
复制
pip install pillow   #这是对模块PTL的安装
pip install opencv-python    #这是对cv2的安装
pip install os 
pip install PySimpleGui

一、利用opencv对头像处理

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

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

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

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

代码语言:javascript
复制
import cv2
from PIL import Image
personPath = '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框架进行整合,还是先上代码之后拆分讲解

代码语言:javascript
复制
import PySimpleGUI as sg
import os.path
sg.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:
        break
    if event == "-FOLDER-":
        folder = values["-FOLDER-"]
        try:
            file_list = os.listdir(folder)
        except:
            file_list = []
        fnames = [
            f
            for f in file_list
            if 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:
            pass
    elif 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

由于这个GUI框架是进阶篇中的图片查看器的改进版,对loop事件循环做了改动和添加一些文本框,并没有增加新的元素,键的使用也是和往常一样,所以这里就不再介绍元素和键了,感兴趣的可以回看进阶篇(元素介绍部分和键部分)。

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

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

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

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

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

最终效果如下

三、打包

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

代码语言:javascript
复制
pip install pyinstaller

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

代码语言:javascript
复制
pyinstaller hat.py

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

-END-

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 早起Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档