社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

CDA数据分析师 • 3 年前 • 228 次点击  

作者:刘早起

来源:早起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 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框架进行整合,还是先上代码之后拆分讲解

import PySimpleGUI as sg
import os.path
sg.change_look_and_feel("BrightColors")
file_list_column = [
    [sg.Submit('Go',tooltip='按下面的要素添加圣诞帽',size=(151)), sg.Cancel(size=(15 1))],
    [
        sg.Text("图片位置"),
        sg.In(size=(251), enable_events=True, key="-FOLDER-"),
        sg.FolderBrowse('浏览'),
    ],
    [
        sg.Text("帽子宽度"),
        sg.In(size=(251), enable_events=True, key="hat-w"),
    ],
    [
        sg.Text("帽子高度"),
        sg.In(size=(251), enable_events=True, key="hat-h"),
    ],
    [
        sg.Text("帽子横移"),
        sg.In(size=(251), enable_events=True, key="hat-x"),
    ],
    [
        sg.Text("帽子纵移"),
        sg.In(size=(251), enable_events=True, key="hat-y"),
    ],
    [
        sg.Listbox(
            values=[], enable_events=True, size=(4020), key="-FILE LIST-"
        )
    ],
]
image_viewer_column = [
    [sg.Text("从左边图片列表中选择一张图片:",size=(601),key = "notice")],
    [sg.Text("左边的四个参数调节是在上面的参数基础上进行加减乘除;其中宽度和高度调试单位为个位数(需要大于0且是整数),横纵移动调试单位可任意调",size=(503), 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模块

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键。


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


 

CDA课程咨询

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/103931
 
228 次点击