@微信官方给不了的圣诞帽,Python和OpenCV给你(附代码)

用到的工具

  • 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)

  # 如果检测到人脸

  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

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

祝大家圣诞快乐,如同大家说的那样,多年前转发QQ信息就可以获得QQ会员,到现在转发朋友圈@微信官方,上当的依然是那一群人。也许,我们只是愿意的相信这个美好的故事而已。愿多年以后,归来依是少年。

完整代码的Github地址:

https://github.com/LiuXiaolong19920720/Add-Christmas-Hat

原文发布时间为:2017-12-24

本文来自合作伙伴“大数据文摘”,了解相关信息可以关注“大数据文摘”微信公众号

时间: 2024-10-05 06:31:36

@微信官方给不了的圣诞帽,Python和OpenCV给你(附代码)的相关文章

@微信官方并不会得到圣诞帽,但 AI 魔法能帮你梦想成真

@微信官方头像并没有加上圣诞帽?想必不少人都中招了.其实这是腾讯天天P图的"一键圣诞帽"H5迅速生成圣诞帽头像,从而换上戴圣诞帽的头像新功能惹的"祸".我们尝试了下,通过H5页面,可以直接在自己的微信头像上进行编辑,加上圣诞帽,非常方便.但如果要设置为微信头像,还需要手动设置. 是下图的效果: 不过,这次火爆朋友圈的"戴圣诞帽"热潮也引来了技术人士的围观.一个大致的分析认为,要实现@微信官方就能让自己的头像戴上圣诞帽的"魔术"

WeUI—微信官方UI库

WeUI 为微信 Web 服务量身设计 概述 WeUI是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信 Web 开发量身设计,可以令用户的使用感知更加统一.包含button.cell.dialog. progress, toast.article.icon等各式元素. 使用 方法一: 使用bower进行安装 bower install --save weui 方法二: 使用npm进行安装 npm install --save weui   开发 git clone https:

微信官方今天上线了朋友圈屏蔽提醒提醒功能

摘要: 自从微信在朋友圈涉水广告之后,不少人悲观地认为,朋友圈很可能最后沦落为广告圈.不过,微信官方今天上线了朋友圈屏蔽提醒提醒功能,不仅有可能缓解用户备受朋友圈小广告困 自从微信在朋友圈涉水广告之后,不少人悲观地认为,朋友圈很可能最后沦落为广告圈.不过,微信官方今天上线了朋友圈屏蔽提醒提醒功能,不仅有可能缓解用户备受朋友圈小广告困扰的问题,更是在表明自己的态度:虽然我也开始发广告了,但是不代表什么广告都可以发到朋友圈的.这个新功能的应用场景是: 对于朋友圈内发信息过于频繁的用户,尤其是消息中经

微信官方发布了《公众号文章增加手机端抄袭举报流程》

摘要: 微信官方发布了<公众号文章增加手机端抄袭举报流程>,进一步整顿公众号内容抄袭的问题. 1.如发现有公众号存在抄袭公众号文章行为,可在手机上发起举报. 2.公众号的管理员或 微信官方发布了<公众号文章增加手机端抄袭举报流程>,进一步整顿公众号内容抄袭的问题. 1.如发现有公众号存在抄袭公众号文章行为,可在手机上发起举报. 2.公众号的管理员或运营者微信号可直接以公众号的主体身份发起举报,他人举报时需要管理员确认. 3.非公众号文章抄袭.冒名.诽谤等其他侵权行为,用电脑进入&q

微信进军线下实体店,微信官方:未来商店

就在昨天,一家打着"微信"标志的实体店在浙江杭州正式开业.实际上,这家店铺的全名是"上品折扣微信店",是线下连锁商铺"上品折扣"的分店之一.与其它分店不同的是,它是由上品折扣与微信官方联合运营的,顾客在店内的挑选和消费行为,都与微信捆绑在了一起.微信官方因此称它为"未来商店"."O2O概念店". 在此之前,如果提到"O2O"或是"线上连接线下"等概念,你可以从已有的互

微信官方赠送,主要作为礼品,并未销售

据http://www.aliyun.com/zixun/aggregation/3640.html" style="line-height: 1.6;">网友爆料,腾讯推出了微信定制耳机,通过按Push键可发送语音消息. 多位网友已经收到了微信定制耳机.与普通耳机相比,微信定制耳机除了通话按键.音量键外,还有一个"Push"键.长按Push键可以直接发送语音消息. 食神摇摇产品经理刘颖博微博展示了微信外包装盒.耳机.说明书等,称是微信官方赠送,目前

微信官方出品第一款硬件

摘要: 就在刚刚,WeMedia 自媒体联盟创始人青龙老贼在其个人微信公众账号上发布了文章,称今日收到了微信官方出品的数码相框.如消息属实,这是微信官方出品的第一款硬件. 根据消息中 就在刚刚,WeMedia 自媒体联盟创始人青龙老贼在其个人微信公众账号上发布了文章,称今日收到了微信官方出品的数码相框.如消息属实,这是微信官方出品的第一款硬件. 根据消息中的照片所示,微信相框屏幕大小和 iPad Mini 差不多,配件只有简单的数据(电源)线和说明书,相框的配置大概如下:内置5G存储,相框内照片

从微信官方反对公众号诱导分享行为引起的思考

中介交易 SEO诊断 淘宝客 云主机 技术大厅 今天刚进入A5站长网,就看到了在显眼位置出现的一则"微信官方发布公告:反对公众号诱导分享行为"的文章,点进去阅读后,发现里面的内容就是说微信官方为了促使自己的这个微信平台保持一种健康.绿色的生态环境,坚决打击各种违反<微信公众平台服务协议>的内容和行为,包括:通过奖励诱使用户进行分享.强制要求分享至朋友圈即可查看等行为. 笔者觉得微信这样做非常不错,毕竟对于一些商家而言,利用各种各样的营销手段来让用户在朋友圈里面进行分享,造成

突发!微信官方证实:“绞杀”了刷量平台

    今天,有关微信刷量平台崩溃的新闻刷爆朋友圈.在朝阳群众的"深扒"之下,不少微信大号的惨淡阅读量展露出了"娇羞的真容". 不过,对此事,微信官方一直保持了"可怕的沉默",今天下午,微信终于做出了官方回应,称这件事为:一种"技术对抗",是"猫鼠斗"的游戏. 这也表示,微信官方承认,是自己用技术力量"绞杀"了诸多刷量平台. 雷锋网(公众号:雷锋网)宅客频道采访到了一些专家,他们普遍表示