应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

不用P图!用Python给头像加圣诞帽并制作成可执行软件

  作者:派森酱
  来源:Python技术
  随着圣诞节的到来,节日气氛也越来越浓厚。大街上随处可见挂满饰品的圣诞树,好多小伙伴的头上也多了一顶红色牛角的圣诞帽。
  往年在这个时候,好多P图软件会推出给头像加一顶圣诞帽的功能,甚至有一年大伙微信官方就可以在自己的微信头像上加一顶圣诞帽。
  作为一个学习Python的技术人,自己可以写程序实现这个功能,做成一个软件当然是一件很酷的事情了。
  今天就给大家分享一下如何用Python制作一款自动给头像添加圣诞帽的软件。
  如果不想看实现,可以直接跳到文末获取软件。思路
  我们的头像添加圣诞帽软件制作的大致思路如下:要实现一个软件,我们需要制作一个GUI界面,供用户操作。要实现头像戴圣诞帽功能,我们需要用户上传一张头像,我们还需要准备一顶圣诞帽子图片。要把圣诞帽戴在头像上,我们需要识别头像中的人脸和头部特征,然后将帽子放在头顶合成一张图片。
  基于以上思路,我们制作这款软件的关键词有:GUI界面圣诞帽图片头像图片人脸识别打包软件实现
  看了以上思路,相信大家脑海中已经对这个软件制作的过程有了一个大致的框架了。我们的实现主要分为:图像制作、GUI界面、打包三大块内容。准备工作
  首先列举一下本次软件制作过程中需要用的的一些包模块:cv2
  pipinstallopencvpythonos
  python系统模块dlib
  pipinstalldlibnumpy
  pipinstallpandasPySimpleGUI
  pipinstallPySimpleGui
  温馨提示:这其中安装dlib会遇到很多坑以及很多困难,一般需要一边安装一边上网搜索报错,从而找到解决办法。保证安装过一次之后不想尝试第二次。图像制作准备圣诞帽
  我们需要准备一个圣诞帽的图片,格式最好为png,因为png图片我们可以直接用Alpha通道作为掩膜使用。如果是jpg图片,需要先转换成png格式图片。注意这里的转换不是只改个后缀名,那样是行不通的。
  我们用到的圣诞帽如下图:
  为了能够与RGB通道的头像图片进行运算,我们需要把圣诞帽图像分离成RGB通道图像和alpha通道图像:r,g,b,acv2。split(hatimg)rgbhatcv2。merge((r,g,b))cv2。imwrite(hatalpha。jpg,a)
  分离之后,得到的alpha通道图像如下所示:
  人脸识别
  我从我的百宝箱中选择了一张傻萌傻萌的图片作为程序的测试图片。
  大家注意,因为我们要做人脸识别,然后自动添加帽子,所以选择的图片一定要是真人的正面照片,不然识别不了人脸,也就不知道在哪添加圣诞帽。
  下面我们用dlib的正脸检测器进行人脸检测,用dlib提供的模型提取人脸的五个关键点。代码如下:dlib人脸关键点检测器predictorpathshapepredictor5facelandmarks。datpredictordlib。shapepredictor(predictorpath)dlib正脸检测器detectordlib。getfrontalfacedetector()正脸检测detsdetector(img,1)如果检测到人脸iflen(dets)0:fordindets:x,y,w,hd。left(),d。top(),d。right()d。left(),d。bottom()d。top()x,y,w,hfaceRectcv2。rectangle(img,(x,y),(xw,yh),(255,0,0),2,8,0)关键点检测,5个关键点shapepredictor(img,d)forpointinshape。parts():cv2。circle(img,(point。x,point。y),3,color(0,255,0))cv2。imshow(image,img)cv2。waitKey()
  我们把图片打印出来的效果是这样的:
  看到这个图片是不是有点熟悉,网上好多人脸识别的图片都是这样的。调整帽子大小
  我们选取两个眼角的点,求中心作为放置帽子的x方向的参考坐标,y方向的坐标用人脸框上线的y坐标表示。
  然后我们根据人脸检测得到的人脸的大小调整帽子的大小,使得帽子大小合适。
  看到这里,你应该明白,我们头像的图片中人的脸越正面那么我们制作出来的效果越好。选取左右眼眼角的点point1shape。part(0)point2shape。part(2)求两点中心eyescenter((point1。xpoint2。x)2,(point1。ypoint2。y)2)根据人脸大小调整帽子大小factor1。5resizedhathint(round(rgbhat。shape〔0〕wrgbhat。shape〔1〕factor))resizedhatwint(round(rgbhat。shape〔1〕wrgbhat。shape〔1〕factor))ifresizedhathy:resizedhathy1根据人脸大小调整帽子大小resizedhatcv2。resize(rgbhat,(resizedhatw,resizedhath))帽子区域处理
  我们先将帽子的alpha通道作为mask掩膜:maskcv2。resize(a,(resizedhatw,resizedhath))maskinvcv2。bitwisenot(mask)
  接着,从人像图中去除需要添加帽子的区域:帽子相对与人脸框上线的偏移量dh0dw0原图ROIbgroiimg〔ydhresizedhath:ydh,xdw:xdwresizedhatw〕bgroiimg〔ydhresizedhath:ydh,(eyescenter〔0〕resizedhatw3):(eyescenter〔0〕resizedhatw32)〕原图ROI中提取放帽子的区域bgroibgroi。astype(float)maskinvcv2。merge((maskinv,maskinv,maskinv))alphamaskinv。astype(float)255相乘之前保证两者大小一致(可能会由于四舍五入原因不一致)alphacv2。resize(alpha,(bgroi。shape〔1〕,bgroi。shape〔0〕))print(alphasize:,alpha。shape)print(bgroisize:,bgroi。shape)bgcv2。multiply(alpha,bgroi)bgbg。astype(uint8)
  提取后的效果图如下:
  接下来,我们提取圣诞帽的区域:hatcv2。bitwiseand(resizedhat,resizedhat,maskmask)
  提取后的效果图如下:
  盖帽
  图像处理的最后一步是盖帽了,就是把提取的圣诞帽区域和图片中提取的区域相加,然后再放到原图中去。这里需要注意的就是,相加之前resize一下保证两者大小一致相加之前保证两者大小一致(可能会由于四舍五入原因不一致)hatcv2。resize(hat,(bgroi。shape〔1〕,bgroi。shape〔0〕))两个ROI区域相加addhatcv2。add(bg,hat)cv2。imshow(addhat,addhat)把添加好帽子的区域放回原图img〔ydhresizedhath:ydh,(eyescenter〔0〕resizedhatw3):(eyescenter〔0〕resizedhatw32)〕addhat
  最后,我们得到的效果图如下:
  GUI界面
  我们先来看效果图:
  然后再来看这部分的实现代码:importPySimpleGUIassgimportos。pathimportcv2filelistcolumn〔〔sg。Submit(生成,keyGo,size(15,1)),sg。Cancel(退出,keyCancel,size(15,1))〕,〔sg。Text(图片位置(选择文件夹)),sg。In(size(25,1),enableeventsTrue,keyFOLDER),sg。FolderBrowse(浏览),〕,〔sg。Listbox(values〔〕,enableeventsTrue,size(40,20),keyFILELIST)〕〕imageviewercolumn〔〔sg。Text(从左边图片列表中选择一张图片:)〕,〔sg。Image(keyIMAGE)〕〕layout〔〔sg。Column(filelistcolumn),sg。VSeperator(),sg。Column(imageviewercolumn),〕〕windowsg。Window(人像添加圣诞帽软件,layout)filenamewhileTrue:event,valueswindow。read()ifeventCanceloreventsg。WINCLOSED:breakifeventFOLDER:foldervalues〔FOLDER〕try:filelistos。listdir(folder)except:filelist〔〕fnames〔fforfinfilelistifos。path。isfile(os。path。join(folder,f))andf。lower()。endswith((。jpg,。png))〕window〔FILELIST〕。update(fnames)elifeventFILELIST:try:filenameos。path。join(values〔FOLDER〕,values〔FILELIST〕〔0〕)iffilename。endswith(。jpg):imcv2。imread(filename)cv2。imwrite(filename。replace(jpg,png),im)window〔IMAGE〕。update(filenamefilename。replace(jpg,png))exceptExceptionase:print(e)elifeventGo:try:outputaddhat(filename)展示效果cv2。imshow(output,output)cv2。waitKey(0)cv2。imwrite(output。png,output)print(output)window〔IMAGE〕。update(filenameoutput。png)except:print(OMG!添加失败了!)cv2。destroyAllWindows()
  这里我选用的是PySimpleGUI框架来做的,比较简单。界面分为左右两部分,左边是两个按钮(确定和取消)加一个文件夹选择器,再加一个图片文件列表;右边是一个图片展示框。
  左边选择文件夹后,会在下方列出文件夹里包含。png和。jpg的图片列表。点击图片列表中的图片,会在右边显示你所选择的图片。这个选中的图片也就是我们后面需要添加圣诞帽的图片。
  这里需要注意的是,PySimpleGUI的图片展示默认只支持png格式的,所以我在展示的时候做了判断,如果是jpg格式的图片,我就用cv2将其转换成png格式,然后再进行展示。
  到这里,我们的关键步骤就完成了。接下来就是将我们两部分代码进行整合。其实也很简单,只需要在GUI界面上用户点击生成按钮时,后台接收到图片的路径,传递给我们的图片处理函数,在处理完后将图片保存在文件夹下,并更新GUI界面右边的展示的图片即可。
  最终的运行效果:
  打包软件
  打包软件我们还是用熟悉的pyinstaller模块,将代码打包成可执行的exe格式。
  首先下载我们所需的模块包:
  pipinstallpyinstaller
  接着在命令行敲下打包命令:
  pyinstallerchristmashat。py
  这个christmashat。py就是我们所写的程序了。
  打包比较耗时,耐心等着就行。打包完成后,在我们代码的目录下会生成三个文件夹:pycachebuilddist
  我们只需要关注dist就行。dist文件夹下面是christmashat子文件夹,再进去就可以找到我们的christmashat。exe文件了。由于我们的程序运行有两个依赖文件,分别是我们的圣诞帽图片和我们的人脸识别训练集,所以我们需要将这两个文件放入这个EXE文件所在的文件夹下。
  现在双击christmashat。exe文件就可以正常运行了。总结
  本文从一个实际需求出发,向大家讲解了一个头像添加圣诞帽软件的诞生过程。相对于之前的一些小应用来说,涉及的知识点较多,可能还是有点复杂的。其中有一些知识点限于篇幅原因没有详细讲解,大家可以自己私下补充。

年度总结丨2023丨启航!文橘皮;第55篇原创;字数:1180,阅读:3min;你的2022年怎么样呢?我的2022年,虽然不是荒废着度过,可也没有多充实啊。要说实现了什么目标,……再见2021在西藏,那些与生灵草木的相遇(草木篇)今天是2021年的最后一天,你是否也有不舍?这一年,顺遂也好,困顿也罢,总有些温暖的遇见,回应着我们的情绪,抚慰着我们的心灵。而人生哪……踏春出游开啥车这几款能让出行体验加分不少每年的35月,天气渐暖,万物复苏,是一年当中最好的时景,在这个时间段非常适合带上家人或者朋友一起踏春出游,而一辆好的车能让这趟旅行变得事半功倍,甚至能为自己的出行体验加分不少。……3个中成药,破瘀散结行气开郁活血通络,调治甲状腺结节甲状腺属于人体的内分泌器官,可控制能量代谢的速度、制造蛋白质、调节体内钙的平衡,促进机体新陈代谢。甲状腺正常,人生病的几率会降低,反之就会升高。甲状腺结节是一种常见的疾病……买手机就要买新不买旧近期把最好的手机都给你这三款兼具性能颜值今年已经又发布了几款新机了,手机特别是新机,不论从性能上还有颜值上都比老款的手机要好,所以说买手机要买新不买旧,今天我就给大家推荐三款近期最好的手机,款款都兼具性能颜值,把最好……砍瓜切菜26分击溃山东,汤神首秀,广东队是如何满血复活的?吉伦沃特的脸上露出极度沮丧的神色,可他并没有丝毫的放弃。竭尽所能把球打进去,很不服气地与裁判争执,和自己斗气较劲,展现出了强烈的斗志,他在场上全力死拼,陶汉林和哈德森亦然,可却……如果把韩国体育史写成一本书,书名就两个字作弊韩国运动员的体育精神,一直备受关注。尤其在短道速滑上,韩国运动员更是劣迹斑斑,故意推倒对手,自杀式犯规,保送队友夺冠,几乎成了韩国选手之间公开的战术。2018年的韩国平昌……智能门锁品牌十大排名推荐源自德国,2009年进入中国市场,定位高端指纹锁品牌,旗下有德施曼、小嘀系列产品,其产品采用后包豪斯主义风格享誉欧洲。致力于指纹生物识别技术的研究,拥有100多项行业专利,集机……流浪太空300多天,回来却发现自己的家没了1991年12月,庞大的苏联宣布解体了,这样一个在世界上雄霸多年的大国一夜之间分解为十几个国家。正当地球上混乱异常的时候,天上太空站里却还留着一个苏联人,克里卡廖夫。……阿布首次考虑出售切尔西!至少三方盼收购,瑞士医械富豪率先表态时至今日,俄乌冲突还在不断发酵,切尔西也受到了非常大的影响。此前切尔西老板阿布已经交出了俱乐部的管理权,如今,根据英国《电讯报》的最新报道,阿布已经有了出售切尔西的念头,目前至……苹果SE3马上要发布了苹果官宣春季发布会,时间将会定在3月9日凌晨。眼看发布会要来了,关于苹果新品的小道消息络绎不穷,这一次会有哪些惊喜呢?从媒体曝光消息来看,这场发布会的主角将是iPhone……拌饺子馅时,用料越简单越好,教你一招,饺子鲜嫩多汁特别香导语:拌饺子馅时,用料越简单越好,教你一招,饺子鲜嫩多汁特别香饺子一直很受欢迎,男女老少都喜欢吃,一到过年过节饺子就成了主角,不管和面擀皮调馅多麻烦,我们都不嫌弃,还是会……
公认最克制东皇的并非蔡文姬项羽,而是被玩家低估的姜子牙王者荣耀上线六年的时间,峡谷中英雄数量已经来到110位,虽然英雄众多,但是他们都有各自的强势技能,东皇太一作为一名坦克型辅助,该英雄可以说没有弱势期,一级的时候就有能力入侵敌方……易建联赴美与妻儿团聚,1000万豪宅曝光,美艳娇妻带2子定居世预赛正在如火如荼地进行中,在杜峰的率领下,中国男篮打得有声有色!不过,作为中国男篮一哥,易建联却落选了此次国家队,无缘参加比赛!一方面,是易建联的伤病还没完全康复。另一方面,……常看手机眼睛花,推荐2款护眼茶随着国内新冠疫情的防控,许多大人开始居家办公,儿童则是居家学习上网课,使用计算机或是手机上网的时间都随之延长。于是,眼睛开始出现红肿、干涩等不适,严重者甚至感到视力模糊。给大家……明日小暑,苦夏养心要吃2种养心菜,帮助你心平气和度伏天导语:明日就是小暑了,这意味着从明天开始全国各地的气温都会进一步升高,南方地区降雨会明显增加,北方地区多连晴高温天气,如此燥热难熬的天气,难免会使身体出现一些不适,为了维持身体……法甲姆巴佩帽子戏法巴黎客场狂胜里尔新华社巴黎8月21日电(记者肖亚卓)巴黎圣日耳曼延续着在国内联赛中高歌猛进的势头,在21日进行的20222023赛季法甲联赛第三轮比赛中,他们客场7:1大胜里尔,联赛前三轮狂轰……人最大的教养,不是礼貌,不是客气,而是让人舒服让人舒服,是一个人最高级的教养。和人相处,处的是真心实意;长久不分,看的是人品良心。外貌如何,不是致胜的法宝;讨不讨喜,才是交往的重点!圆滑的欺骗,得到的是虚……老话说立秋到,贴秋膘,记得多吃5种美食,滋养身体精神佳今天是秋天的第一个节气立秋,但苦夏却并未因此告一段落。进入立秋之后,暑热与干燥还会持续一段时间,并且秋燥的现象也会慢慢呈现,这种现象就被叫做立秋撞中伏!在这个特殊的节气里……学生党新手党必看的正确护肤步骤正确护肤步骤第一步:洁面早上洁面最好用温和的洗面奶,如果脸上不是出油很严重的肌肤,早上只用清水洁面即可,晚上用洗面奶一般是在卸妆过后,所以要选择清洁力强一些的洗面奶……317川藏北线和318南线,风景差别太大了!但最大的差别还不以前不才不大敢聊317川藏北线,因为我只走过一半。某度胡扯不是我的风格。现在好了,317川藏北线的全程我已经走完。它的优点、缺点,我都有的聊了。两条路的区别确实挺大……吉祥航空假如买下了海航?2021年,海航破产重整,并公开招募航空板块的战略投资者。王均金的吉祥航空、郭广昌的复星集团、方威的方大集团角逐海南航空。对于均瑶、吉祥联合竞购海航,业界被震惊到了……致命女人温峥嵘,24年不温不火,隐婚初恋生子,43岁风采依旧温峥嵘,拥有一张标准的美人脸,五官立体,气场强大,尤其是西装造型,透着一种夺屏而出的总攻感,霸气、冷艳、魅惑、性感。。。。。。正因如此,她是观众心目中唯一标准的致命女人,……人人看得见千余年中医争论不休的自然科学阳生阴长,阳杀阴藏阳生阴长,阳杀阴藏就是古人观察到的以地球为中心的四方、四季东西南北、春夏秋冬四方位置由于受太阳光照多少的差异而产生万物由始至终生长化收藏的生物代谢自然现象。《灵枢。刺节真……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网