大家好,我是黑羽。

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

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

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

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

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

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

主要涉及的Python模块有:

PILPySimpleGUIcv2os

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

一、利用opencv对头像处理

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

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

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

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

下面对代码进行讲解。

首先,引入两个模块,用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框架进行整合,还是先上代码之后拆分讲解

代码解析,这里强烈建议读者结合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文件并运行它即可。文件夹里附带了很多文件,你可以删除它。

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


如果不打包的话,先把圣诞帽的图片(png格式)和代码程序放在相同路径下。
进到软件后先点击浏览按钮选择图片存储路径(注意:路径内不能出现中文,只能英文+数字,这可能是因为Python中的OpenCV库的bug)。完毕后就可以看到下方所在文件夹的全部.jpg和.png文件。点击一个你想要添加圣诞帽的图片,在按Go按钮,在右边的图片框中就会刷新已经代码帽子的头像!同时,在程序的路径下也会有这张图片的.jpg格式文件。
图片框中除了图片还有4个参数,4个参数的作用就是调节帽子大小和位置。因为每张图片不同,所以帽子会出现大小不一、偏移的情况。而后,你就需要在左边的4个输入框中输入参数来调试(4个输入框是在原参数基础上进行数乘运算),以达到帽子的最佳效果,如果超出范围,命令框会提示错误。输入后还是一样按Go键,结束按Cancel键。

圣诞节,用python给微信的头像加一个圣诞帽,整起相关推荐

  1. Python爬微信好友头像,性别,所在地区

    Python爬微信好友头像,性别,所在地区 本文适合新手(有一定基础的小白) 今天没事,用的网页版微信,于是看源码心理作怪,F12打开,研究了一下,结果发现 /斜眼笑/斜眼笑/斜眼笑 再加上,没事干, ...

  2. 用python做头像_如何利用python制作微信好友头像照片墙?

    这个不难,主要用到itchat和pillow这2个库,其中itchat用于获取微信好友头像照片,pillow用于拼接头像生成一个照片墙,下面我简单介绍一下实现过程,代码量不多,也很好理解,实验环境wi ...

  3. python表白代码照片墙-如何利用python制作微信好友头像照片墙?

    这个不难,主要用到itchat和pillow这2个库,其中itchat用于获取微信好友头像照片,pillow用于拼接头像生成一个照片墙,下面我简单介绍一下实现过程,代码量不多,也很好理解,实验环境wi ...

  4. python获取微信好友头像拼接“2020”

    python获取微信好友头像拼接"2020" 背景 思路 源码说明 背景 2019年的最后一天,心想马上就要跨年,大家都在总结和祝福,但是又不想随大流,打开微信,翻看着通讯录,突然 ...

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

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

  6. 用python把微信好友头像拼成一张图

    首先需要用到三个库: wxpy库(用于获取好友头像然后下载). pillow库(用于拼接头像). pyinstaller库(用于打包python程序成exe文件) 这里我说一下创建虚拟环境的步骤: 我 ...

  7. 只需四步,让你成为朋友圈的焦点----Python制作微信好友头像墙

    今天带给大家一波实力干货,让你分分钟成为朋友圈的红人.焦点! 先来张效果图感受一下! 怎么样,是不是很爽! 链接在这↓ 链接:https://pan.baidu.com/s/1qhRkkLPLdZqE ...

  8. Python 制作微信好友头像图片墙

    代码涉及到的外部库: 1.wxpy,用于获取好友头像和下载头像 2.pillow,用于拼接头像 完整代码如下: # -*- coding: UTF-8 -*- from wxpy import * i ...

  9. 如何给微信头像加个圣诞帽

    程序IT圈 只提供有用的编程技术,关注即可习得新技能 昨天,朋友圈突然被这样一句话给刷屏了,[请给我头像一个圣诞帽@微信官方],一开始我还不明真相哈 ,属于后知后觉的一种.后面仔细观察,发现有的人过十 ...

  10. python读取微信好友头像,并把头像拼成一张大图

    文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼:我热爱编程.热爱算法.热爱开源.所有源码在我的个人github :这博客是记录我学习的点点滴滴,如果您对 Python.Java.AI ...

最新文章

  1. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!
  2. 简书非官方大数据(一)
  3. SQL Server存储过程的基本概念以及语法【转】
  4. 比较两组数据的差异用什么图更直观_芯片数据分析中常见的一些图的作用
  5. 从零开始学keras之神经网络的数学表示
  6. 面试常考题:不调用库函数,怎样实现字符串操作函数?
  7. linux中mysql自动备份操作文档_linux下mysql自动备份和自动删除文件功能实现
  8. Glib2之定义手册(十八)
  9. 博客园文章中图片太大显示不全的解决办法
  10. 最小二乘支持向量机LSSVM
  11. 利用MATLAB 实现证件照换底色教程
  12. 新猿木子李:0基础学python培训教程 python下载文件的多种方法汇总
  13. 云大使成长精华指引(全)
  14. 计算机原理74181芯片,利用SN74181芯片构成16位ALU及原理.ppt
  15. TTL RGB信号相关 介绍最为详细 HSYNC VSYNC DE CLK
  16. VS code更改背景图片和颜色
  17. 一招教你在Linux命令行下测网速
  18. iPhone轻松共享wifi密码给好友
  19. Java 面试 :乐观锁 悲观锁
  20. javaweb项目实战(附有源码)

热门文章

  1. python库缺少pkg_resource_Python pkg_resources.ResourceManager方法代码示例
  2. c语言什么意思000094,Hello World 背后的真实故事
  3. 卖家警惕 网购新骗术来袭
  4. 密码学------BAN逻辑总结
  5. d : 无法将“d”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  6. 监控mysql锁定状态_mysql InnoDB锁等待的查看及分析
  7. Qt自定义标题栏可拖动修改窗口大小
  8. 聚合数据iOS SDK 12306火车票查询订票演示示例
  9. 鸿鹄系统和鸿蒙系统的区别,华为鸿蒙系统和全新的鸿鹄处理器将于8月9日正式发布,荣耀首发...
  10. linux dd安装win2003,DD安装win2003,2008系统