随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情。而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思。

这里要注意:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!

用到的工具

OpenCV(毕竟我们主要的内容就是OpenCV...)

dlib(前一篇文章刚说过,dlib的人脸检测比OpenCV更好用,而且dlib有OpenCV没有的关键点检测。)

用到的语言为Python。但是完全可以改成C++版本,时间有限,就不写了。有兴趣的小伙伴可以拿来练手。

流程

一、素材准备

首先我们需要准备一个圣诞帽的素材,格式最好为PNG,因为PNG的话我们可以直接用Alpha通道作为掩膜使用。我们用到的圣诞帽如下图:

我们通过通道分离可以得到圣诞帽图像的alpha通道。代码如下:

r,g,b,a =cv2.split(hat_img)

rgb_hat =cv2.merge((r,g,b))

cv2.imwrite("hat_alpha.jpg",a)

为了能够与rgb通道的头像图片进行运算,我们把rgb三通道合成一张rgb的彩色帽子图。Alpha通道的图像如下图所示。

二、人脸检测与人脸关键点检测

我们用下面这张图作为我们的测试图片。

下面我们用dlib的正脸检测器进行人脸检测,用dlib提供的模型提取人脸的五个关键点。代码如下:

# dlib人脸关键点检测器

predictor_path ="shape_predictor_5_face_landmarks.dat"

predictor =dlib.shape_predictor(predictor_path)

# dlib正脸检测器

detector =dlib.get_frontal_face_detector()

# 正脸检测

dets =detector(img,1)

# 如果检测到人脸

iflen(dets)>0:

ford indets:

x,y,w,h =d.left(),d.top(),d.right()-d.left(),d.bottom()-d.top()

# x,y,w,h = faceRect

cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2,8,0)

# 关键点检测,5个关键点

shape =predictor(img,d)

forpoint inshape.parts():

cv2.circle(img,(point.x,point.y),3,color=(0,255,0))

cv2.imshow("image",img)

cv2.waitKey()

这部分效果如下图:

三、调整帽子大小

我们选取两个眼角的点,求中心作为放置帽子的x方向的参考坐标,y方向的坐标用人脸框上线的y坐标表示。然后我们根据人脸检测得到的人脸的大小调整帽子的大小,使得帽子大小合适。

# 选取左右眼眼角的点

point1 =shape.part(0)

point2 =shape.part(2)

# 求两点中心

eyes_center =((point1.x+point2.x)//2,(point1.y+point2.y)//2)

# cv2.circle(img,eyes_center,3,color=(0,255,0))

# cv2.imshow("image",img)

# cv2.waitKey()

#  根据人脸大小调整帽子大小

factor =1.5

resized_hat_h =int(round(rgb_hat.shape[0]*w/rgb_hat.shape[1]*factor))

resized_hat_w =int(round(rgb_hat.shape[1]*w/rgb_hat.shape[1]*factor))

ifresized_hat_h >y:

resized_hat_h =y-1

# 根据人脸大小调整帽子大小

resized_hat =cv2.resize(rgb_hat,(resized_hat_w,resized_hat_h))

四、提取帽子和需要添加帽子的区域

按照之前所述,去Alpha通道作为mask。并求反。这两个mask一个用于把帽子图中的帽子区域取出来,一个用于把人物图中需要填帽子的区域空出来。后面你将会看到。

# 用alpha通道作为mask

mask =cv2.resize(a,(resized_hat_w,resized_hat_h))

mask_inv =cv2.bitwise_not(mask)

从原图中取出需要添加帽子的区域,这里我们用的是位运算操作。

# 帽子相对与人脸框上线的偏移量

dh =0

dw =0

# 原图ROI

# bg_roi = img[y+dh-resized_hat_h:y+dh, x+dw:x+dw+resized_hat_w]

bg_roi =img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)]

# 原图ROI中提取放帽子的区域

bg_roi =bg_roi.astype(float)

mask_inv =cv2.merge((mask_inv,mask_inv,mask_inv))

alpha =mask_inv.astype(float)/255

# 相乘之前保证两者大小一致(可能会由于四舍五入原因不一致)

alpha =cv2.resize(alpha,(bg_roi.shape[1],bg_roi.shape[0]))

# print("alpha size: ",alpha.shape)

# print("bg_roi size: ",bg_roi.shape)

bg =cv2.multiply(alpha,bg_roi)

bg =bg.astype('uint8')

这是的背景区域(bg)如下图所示。可以看到,刚好是需要填充帽子的区域缺失了。

然后我们提取帽子区域。

# 提取帽子区域

hat =cv2.bitwise_and(resized_hat,resized_hat,mask =mask)

提取得到的帽子区域如下图。帽子区域正好与上一个背景区域互补。

五、添加圣诞帽

最后我们把两个区域相加。再放回到原图中去,就可以得到我们想要的圣诞帽图了。这里需要注意的就是,相加之前resize一下保证两者大小一致,因为可能会由于四舍五入原因不一致。

# 相加之前保证两者大小一致(可能会由于四舍五入原因不一致)

hat =cv2.resize(hat,(bg_roi.shape[1],bg_roi.shape[0]))

# 两个ROI区域相加

add_hat =cv2.add(bg,hat)

# cv2.imshow("add_hat",add_hat)

# 把添加好帽子的区域放回原图

img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)]=add_hat

最后我们得到的效果图如下所示。

最后注意:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教!

本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

python头像教程_用Python给头像加上圣诞帽,新手必学相关推荐

  1. python认证教程_基于 Python+SendCloud 的邮箱认证

    项目简介:为了方便日后密码遗忘进行修改或者进行消息推广等,现在各大网站在注册的时候总是免不了填写邮箱验证邮箱的流程.本门课程将通过使用 SendCloud 提供的 API 来实现一个本地版的邮箱认证过 ...

  2. python ai教程_带有Python的AI教程

    python ai教程 带有Python的AI教程 (AI with Python Tutorial) PDF Version Quick Guide Resources Job Search Dis ...

  3. python异步教程_【Python 异步编程入门】

    本文是写给 JavaScript 程序员的 Python 教程. Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似.JavaS ...

  4. 图解python专业教程_图解Python视频教程(基础篇)课程

    第2章HelloWorld:第一个Python程序 2-1在Windows操作系统中安装Python 2-2在MacOS操作系统中安装Python 2-3在Ubuntu操作系统中安装Python 2- ...

  5. python数据结构教程_利用Python演示数型数据结构的教程

    使用 Python 内建的defaultdict方法可以轻松定义一个树的数据结构. 简单的说树也可以是一个字典数据结构 def tree(): return defaultdict(tree) 这就是 ...

  6. python手把手教程_【Python 1-7】Python手把手教程之——详解列表List

    列表 作者 | 弗拉德 来源 | 弗拉德(公众号:fulade_me) 列表,在其他语言中又被称为数组,是由一系列按特定顺序排列的元素组成.你可以创建包含字母表中所有字母.数字0~9或所有家庭成员姓名 ...

  7. python日历教程_利用Python自动化生成逼格高的日历!简单又实用

    本次内容有感于<Python编程快速上手-让繁琐工作自动化>. 根据书中的「处理Excel电子表格」章节内容,做出一份专属日历. 使用的模块为openpyxl,一个能读取和修改Excel电 ...

  8. python简易程序教程_用Python制作简单的钢琴程序的教程

    录一段音频,把它的音高改变50次并把每一个新的音频匹配到键盘的一个键位,你就能把电脑变成一架钢琴! 一段音频可以被编码为一组数值的数组(或者列表),像这样: 我们可以在数组中每隔一秒拿掉一秒的值来将这 ...

  9. 南京python基础教程_南京Python课程价格

    1.每个算法模块按照"原理讲解→分析数据→自己动手实现→特征与调参"的顺序. 2."Python数据清洗和特征提取",提升学习深度.降低学习坡度. 3.增加网络 ...

最新文章

  1. RHEL6 64位系统安装ORACLE 10g 64bit 数据库
  2. 快速构建Windows 8风格应用6-GridView数据控件
  3. 微软华人团队刷新COCO记录!全新目标检测机制达到SOTA|CVPR 2021
  4. win10系统 计算机配置要求高吗,win10配置要求_win10配置要求高吗-太平洋电脑网
  5. 【ML】 李宏毅机器学习一:error
  6. kafka后台启动命令
  7. 用户sa登陆失败 SQLServer 错误18456的解决方法
  8. HTML 4.01 event 事件
  9. Vue页面手动刷新,导航栏激活项还原到初始状态问题解决方案
  10. python string模块template_Python - 定制pattern的string模板(template) 详解
  11. OpenHarmony移植案例:如何适配服务启动引导部件bootstrap_lite
  12. pytorch使用早停策略
  13. Android 学习心得(2)——Android内置数据库SQLite
  14. Soul网关源码阅读(八)路由匹配初探
  15. python入门(七):CGI编程
  16. 使用Flink实现索引数据到Elasticsearch
  17. 单片机c语言程序编写歌谱,51单片机播放音乐简谱的函数库
  18. python画玫瑰图_python windrose(风玫瑰图)
  19. UG NX 工程图视图概述
  20. 计算机科学科普(一):什么是计算机

热门文章

  1. 2019年天猫度软件服务年费缴纳折扣优惠及结算标准
  2. QT qrc 资源加载失败
  3. 函数组:SCMS_CONV 字符内码转化
  4. 软件测试是在吃青春的饭吗?
  5. python模拟浏览器下载文件_python第一个脚本,模拟浏览器下载文件
  6. 开源简史基础:Linux基金会
  7. 杜邦分析模型 java_1.杜邦分析法的核心指标是(  )。
  8. Sentinel流量控制
  9. 3个简单好用的U盘数据恢复方法
  10. C++接口实现总结 http://qimo601.iteye.com/blog/1393427