设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 10756|回复: 5
打印 上一主题 下一主题

新手篇之python3.6实现圣诞帽

[复制链接]

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2017-12-24 23:05:29 |只看该作者 |倒序浏览
本帖最后由 TED 于 2017-12-26 15:28 编辑

Crossin新发的《平安夜,Python送你一顶圣诞帽 @微信官方》,http://mp.weixin.qq.com/s/0px1I4hqQyTUlj9dn0ttVA,介绍了python通过opencv给照片自动进行人脸检测然后添加圣诞帽的大致步骤。源代码在https://github.com/crossin/snippet/tree/master/face_detect。在这里以windows版 python3.6.3为例,记录实现过程,因为本帖子只针对像我一样的新手,对于代码我稍微改动了下,方便直接把图片放在文件夹中,运行.py文件时输入图片名字就能直接运行了。

0.如果不想深入代码,只想自己跑python来戴帽子爽一下,那么执行1.安装完opencv后,直接跳到6.从网盘下载整个crossin文件夹,执行6.的操作就好了~ 如果有报错,欢迎留言,我会在帖子最后注意部分尽量添加解决方案~

1. 已经安装好opencv的请略过本段吧。。。首先我们要安装opencv, 对于windows python3,请到http://www.lfd.uci.edu/~gohlke/pythonlibs/ 向下拉找到OpenCv挑选适合自己的版本下载whl文件,在这我标明了python版本对应的opencv型号:
12.24.2.png
我下载的是opencv 3.4.0,python3.6,windows64位的,下载完后,找到.whl文件所在文件夹,shift+鼠标右键 菜单中选择"在此处打开powershell",在弹出的powershell命令行中输入"pip install 你所下载的.whl文件名",就能自动安装opencv了。(注意:该链接提到python3 只能安装opencv3 https://www.cnblogs.com/combfish/p/5639424.html ;此外,若pip命令没有响应,可能是环境路径没有配置,或者没有下载pip,这个请自行搜索解决吧)至此,第一步安装OpenCv完成。

2. 进入代码部分,import cv2这样就可以利用OpenCv来实现人脸检测的功能,import random用于之后生成随机样式的圣诞帽。 tar获取用户输入的图片名,cv2.imread(tar)读取该图片内容赋给sample_image。接下来要用到cv2的面部模式识别haarcascade_frontalface_default.xml文件,这个文件可以在opencv/sources/data/haarcascades文件夹中找到,在这里我们把这个文件放在crossin文件夹中了,不用加路径只用名字就可以了。
  1. #coding:utf-8
  2. import cv2
  3. import random

  4. #输入图片名字
  5. tar =input("请将图片放入crossin文件夹,输入名字(例如:123.jpg):")
  6. sample_image = cv2.imread(tar)

  7. #OpenCv人脸检测
  8. face_patterns = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
  9. faces = face_patterns.detectMultiScale(sample_image,scaleFactor = 1.1,minNeighbors = 8,minSize = (50,50))
复制代码
这里我们把face_patterns理解成人脸检测的函数。之后faces=face.patterns.detectMultiScale(sample_image,scaleFactor = 1.1,minNeighbors = 8,minSize = (50,50))
参数1是待检测图片;参数2:scaleFactor是前后两次搜索窗口的比例,默认1.1,即每次搜索窗口时依次扩大10%;参数3 minNeighbors是构成检测目标的相邻矩形的最小个数;参数4minSize是限制目标区域大小。(相关链接http://blog.csdn.net/itismelzp/article/details/50379359) 到这里,凡是通过人脸检测得到的face我们都存在faces里了,换句话说:第二步定位人脸位置完成。

3.我们的crossin文件夹里有个img文件夹,里面是圣诞帽的四种样式,这里我们先把从四种圣诞帽图片hat0,hat1,hat2,hat3.png中读取的内容添加到hats这个列表中
  1. #圣诞帽
  2. hats = []
  3. for i in range(4):
  4.     hats.append(cv2.imread('img/hat%d.png'%i,-1))
复制代码
4.接下来我们要实现第三步:根据找出的faces调整圣诞帽的大小和位置,然后把帽子添加到照片中,并且把帽子之外的部分透明化,对于我们这样的新手,具体算法之后再研究吧(其实是我想偷懒了),先了解实现的功能和对应的代码吧~
  1. for face in faces:
  2.     #随机一顶帽子
  3.     hat = random.choice(hats)
  4.     #调整帽子尺寸
  5.     scale = face[3] / hat.shape[0]*1.25
  6.     hat = cv2.resize(hat,(0,0),fx = scale,fy = scale)
  7.     #根据人脸坐标调整帽子位置
  8.     x_offset = int (face[0] + face[2] / 2 - hat.shape[1]/2)
  9.     y_offset = int (face[1] - hat.shape[0] / 2)
  10.     #计算贴图位置,注意防止超过边界的情况
  11.     x1,x2 = max(x_offset,0),min(x_offset + hat.shape[1], sample_image.shape[1])
  12.     y1,y2 = max(y_offset,0),min(y_offset + hat.shape[0], sample_image.shape[0])
  13.     hat_x1 = max(0, -x_offset)
  14.     hat_x2 = hat_x1 + x2 -x1
  15.     hat_y1 = max(0, -y_offset)
  16.     hat_y2 = hat_y1 + y2 -y1
  17.     #透明部分的处理
  18.     alpha_h = hat[hat_y1:hat_y2, hat_x1:hat_x2,3]/255
  19.     alpha = 1 - alpha_h
  20.     #按3个通道合并图片
  21.     for c in range(0,3):
  22.         sample_image[y1:y2,x1:x2,c] = (alpha_h * hat[hat_y1:hat_y2,hat_x1:hat_x2,c]+ alpha*sample_image[y1:y2,x1:x2,c])   
复制代码
注意,该段代码都在for face in faces:遍历循环中,也就是说对每个faces中的face,都会执行上述操作,随机选定一种帽子,调整大小位置贴到对应的face块上。这个for遍历循环,实现了我们的第四步:遍历所有人脸,重复步骤三,随机变换帽子样式。

5.到目前为止,代码全部执行完,图片内容全部都在sample_image中了,我们只要执行第五步保存图片就达成目标了:
  1. cv2.imwrite('out.png',sample_image)
复制代码
将sample_image写入'out.png',运行完代码,crossin文件夹中将会生成带着圣诞帽的图片咯

6.网盘链接是所有的帽子图片和代码.py文件,想执行的话,在crossin文件夹中加入目标图片,然后执行crossin.py,会提示你输入图片名字,输入-回车~  out.png就会出现了 圣诞快乐~~

补充:a.有同学是报错ImportError: numpy.core.multiarray failed to import,原因是没有装numpy而opencv会用到numpy,打开cmd或者powershell,输入pip install numpy   就可以完成numpy的自动安装了

https://pan.baidu.com/s/1i4C4PFJ   密码 763v


回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2017-12-24 23:14:10 |只看该作者
不错不错

代码最后的缩进有点问题?
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

板凳
发表于 2017-12-24 23:30:05 |只看该作者
crossin先生 发表于 2017-12-24 23:14
不错不错

代码最后的缩进有点问题?

嗯 我之前输入tab输不了,就复制空格弄的,我再调整下
回复

使用道具 举报

6

主题

2

好友

654

积分

实习版主

Rank: 7Rank: 7Rank: 7

地板
发表于 2017-12-24 23:37:44 |只看该作者
crossin先生 发表于 2017-12-24 23:14
不错不错

代码最后的缩进有点问题?

调整好了~  刚复制粘贴了下 都OK了
回复

使用道具 举报

12

主题

0

好友

126

积分

注册会员

Rank: 2

5#
发表于 2017-12-25 19:04:27 |只看该作者
版主都自称新手。。。
感觉好受打击,自信瞬间没了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-3 16:48 , Processed in 0.018727 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部