python画圣诞帽_用Python给头像加上圣诞帽
原标题:用Python给头像加上圣诞帽
随着圣诞的到来,大家纷纷@官微给自己的头像加上一顶圣诞帽。我们有必要写一个程序来做这件事情。
用到的工具
OpenCV
dlib
流程
一、素材准备
首先我们需要准备一个圣诞帽的素材,格式最好为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) # 如果检测到人脸 if len(dets)>0: for d in dets: 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) for point in shape.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)) if resized_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知识点进阶——生成器
生成器为什么要将列表转化为迭代器?因为列表太大的话用内存太大,做成迭代器可以节省空间,用的时候再拿出部分。生成器是不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,知道…

以太坊开启区块链2.0时代
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 今天我们唠唠以太坊,这个开启区块链2.0时代的伟大项目。 前面我们说比特币实际上是一个大账本,从比特币白皮书里走出来的区…

手把手教你架构3d游戏引擎pdf_一个在游戏行业摸爬滚打了十几年的人,为何我对这本书情有独钟...
Big News!《游戏开发:世嘉新人培训教材》今日开始预售啦!经过漫长的等待,这次终于可以买到了。现在下单,你将在图书出印厂的第一时间收到书哦~这本书由世嘉一线开发者执笔,并被选为世嘉新人培训…

PostgreSQL获取年月日
1.获取当前日期的年份 select to_char(t.detect_date,YYYY) select extract(year from now())为double precision 格式类型select to_char((SELECT now()::timestamp),yyyy) 2.获取下一年select to_char((SELECT now()::timestamp 1 year),yyyy) 3.获取上一年select to_char((S…

查看mysql主外键信息
SELECT *FROMinformation_schema.key_column_usage tWHERE t.constraint_schema 库名称AND t.constraint_name 外键名;转载于:https://www.cnblogs.com/igoodful/p/8954091.html

什么是以太坊,它是区块链2.0的代表,它又什么特点?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 以太坊 是一种全球共享计算,是各种分散应用程序的基础。它有一个独立于比特币的独立区块链,但与之类似。以太坊的区块链有显…

四川第七届 I Travel(bfs)
Travel The country frog lives in has nn towns which are conveniently numbered by 1,2,…,n1,2,…,n. Among n(n−1)2n(n−1)2 pairs of towns, mm of them are connected by bidirectional highway, which needs aa minutes to travel. The other pairs are connected by …

python社会学科需要学些什么_学好Python能做什么
近年来,选择学Python的人也在逐年增多。然而,很多人学Python只是盲目的跟随潮流,对于Python却不了解,学好Python能做什么?今天源码时代小编就来给大家介绍一下Python的就业方向。首先我们要了解一下Python是什么Python是一种计算…

解决Android5.0以后DatePicker选择时间无效的bug。
一、在布局中加上这句话。 加上了这句话后,就相当于强制用5.0以前的外观,所以外观会有所变化: 5.0以上没有这句话的外观: 加上之后的外观: 二、可以用DatePickerDialog代替 转载于:https://www.cnblogs.com/fuyouG/p/f…

【区块链Go语言实现】区块链基本原型
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 0x00 介绍 区块链(Blockchain)是21世纪最具革命性的技术之一,目前它仍处于逐渐成熟阶段,且其发展潜力…

python2和python3 在windows下公用 导致python2 pip无法使用 报ssl的错误
在查找资料的过程中,网上的信息说。高版本的pip是默认使用ssl,而python2的pip是不使用ssl; 本机的环境,是将python2的pip和python3的 pip做过处理的 最后会有一个叫pip2和pip3环境 有可能是我的操作失误,导致直接使用的…

阻塞队列与非阻塞队列
阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场…

python unicodedecodeerror utf8_python-pip install和UnicodeDecodeError:’utf-8’编...
尝试安装:pip install python-binance结果:Exception:Traceback (most recent call last):File "c:\users\анна\appdata\local\programs\python\python36\lib\site-packages\pip\compat\__init__.py", line 73, in console_to_strreturn s…

Go语言指针详解
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 不像 Java 和 .NET,Go语言为程序员提供了控制数据结构的指针的能力;但是,并不能进行指针运算。通过给予程序员基…

java基础--日期--练习集锦
题目1 --日期 借助随机数,创建一个从1995.1.1 00:00:00 到 1995.12.31 23:59:59 之间的随机日期 package date;import java.util.Date;public class TestDate {public static void main(String[] args) {long second 1000;long minute 60*second;long hour minut…

python多变量非线性拟合_python实现多变量线性回归(Linear Regression with Multiple Variables)...
本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn)表示为:引入x01,…

【bzoj3150】 cqoi2013—新Nim游戏
www.lydsy.com/JudgeOnline/problem.php?id3105 (题目链接) 题意 在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游戏者也有这样一次机会。从第三个回合(又…

再见,Python!你好,Go语言
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 AI 前线导读:Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 写成。由于出身…

tensorflow intel platform 优化
intel平台优化 TensorFlow *是深度学习领域中主要使用的机器学习框架,要求高效利用计算资源。 为了充分利用英特尔架构和提高性能,TensorFlow *库已经使用英特尔MKL-DNN原语进行了优化,该原语是深度学习应用的流行性能库。 已进行优化的平台 …

basePath = request.getScheme()+://+request.getServerName()+:+r
basePath request.getScheme()"://"request.getServerName()":"r (2014-06-30 18:29:54) 转载▼标签: 宠物 分类: JavaString path request.getContextPath();String basePath request.getScheme()"://"request.getSe…

python dump函数_python中实现php的var_dump函数功能
最近在做python的web开发(原谅我的多变,好东西总想都学着。。。node.js也是),不过过程中总遇到些问题,不管是web.py还是django,开发起来确实没用php方便,毕竟存在的时间比较短,很多不完善的地方。比如我在调…

Go语言的Channel文章,整个人都感觉不好了
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 Go的Channel是一个很强大的并发数据模型,在一个发送者和多个消费者情况下工作得最好,但是如果是多个发送者,那么…
图书管理系统(源码)
本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1070 实例使用java语言实现了一个网页版的图片管理系统, 系统前端使用bootstrap技术,可以进行浏览器适配, 实现功能: 管理图书管书, 管理图书借还信息࿰…

linux 如何禁用账号和解除禁用账号
把账号禁用可以有几个方法:1. # usermod -L <username> # usermod -U <username> // 解除禁用2. 修改/etc/passwd文件,可以有几个地方1)把第二个字段中的"x"变成其它的字符,该账号就不能…

maya批量命名插件_教你玩转MAYA的四十二精华造诣(第一期)
最近在整理文档时发现我收藏了一篇关于MAYA应用技巧的文章,突然有兴趣看了看,结果发现老版本MAYA中的某些内容很多已经无法应用于新版本。我又上网查了一下,结果发现网上好多帖子和我收藏的这篇内容基本一致,看来好多都是转载和抄…

Go语言开发常见陷阱,你遇到过几个?
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 Go作为一种简便灵巧的语言,深受开发者的喜爱。但对于初学者来说,要想轻松驾驭它,还得做好细节学习工作。 初学者…

sxoi爆炸祭
好吧,纯粹是去玩玩的,我这么一个弱省的蒟蒻,进队纯粹是开玩笑。。。。 Day0 去五中试机,感觉电脑手感不错,打了半个线段树的板子才发现试机要在自己的电脑上试,然后我无奈的搬东西(从26号搬到2号…

wiki多个文件一起导入_mac文件信息管理工具EagleFiler for Mac分享给大家
EagleFiler for mac使得管理您的信息方便。它可以让你存档和搜索邮件,网页,PDF文件,字处理文档,图像,等等。使用它可以从不同的来源收集信息。浏览不同类型的文件采用标准的三窗格界面。组织他们到文件夹中,…

【bzoj1951】 Sdoi2010—古代猪文
http://www.lydsy.com/JudgeOnline/problem.php?id1951 (题目链接) 题意 废话一堆。。求解:$$g^{\sum_{d|n} C_n^d}~mod~p$$ Solution 真的是数论经典题,什么都用上了。 因为费马小定理,每$p-1$个$g$相乘会得到$1$,那么容易得到&…

区块链之智能合约详解
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 什么是智能合约? 智能合约又称智能合同,是由事件驱动的、具有状态的、获得多方承认的、运行在区块链之上的、且能够根据预设…