专栏首页算法与数据之美三十行代码实现自动戴口罩

三十行代码实现自动戴口罩

自1月20日钟南山院士肯定此次新型肺炎存在着人传人的现象起,到今日的武汉封城,我们人民群众需要提高对此次疫情的重视程度,做好自身的防范工作,平平安安,过个好年

尽量少去人群密集的场所,如果非要出门一定要戴上口罩,勤用肥皂和清水或含有酒精的洗手液洗手也是非常有必要的。

在网络世界中,我们可以通过给头像戴口罩,来呼吁广大群众积极保护自身安全。在这里,我们运用Python简单的几十行代码来实现在社交网络中也给自己的头像自动戴上口罩。

大致的效果如下:

用到的技术主要有人脸识别(当然,调用了接口)、openCV图像处理这两项。

人脸识别

旷视提供了人脸识别的API,输入图片便可以得到人脸的各个稠密关键点的所在位置,通俗来讲,就是可以自动勾画出五官。

我们通过使用其嘴巴的位置数据,可以定位口罩的佩戴位置。并通过计算人脸嘴巴的大小,自动调整口罩的大小进行适配。

def get_mouth(dst_pic):
    with open(dst_pic, 'rb') as f:
        base64_data = base64.b64encode(f.read())
    url='https://api-cn.faceplusplus.com/facepp/v1/face/thousandlandmark'
    headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'}
    data={
             # api_key,api_secret需自己申请
          'api_key':'',
          'api_secret':'',
          'return_landmark': 'mouth',
          'image_base64': base64_data
                         }
    r=requests.post(url,headers=headers,data=data)
    mouth=r.json()['face']['landmark']['mouth']
    x,y=[],[]
    for i in mouth.values():
        y.append(i['y'])
        x.append(i['x'])
    y_max=max(y)
    y_min=min(y)
    x_max=max(x)
    x_min=min(x)
    middle_x=int((x_max+x_min)/2)
    middle_y=int((y_max+y_min)/2)
    size=(int(3*(x_max-x_min)),int(5*(y_max-y_min)))
    return (middle_x,middle_y),size

图像处理

有了口罩的估计大小,可以自动更改口罩的图像大小,根据计算得到的口罩的中心位置来摆放口罩,并通过简单的掩膜处理,利用seamlessClone函数将口罩照片添加到头像图片上。

def add_mask(img_path,img_outPath):
    src_pic="/root/Documents/abc.jpg"
    center,size=get_mouth(img_path)
    src=cv2.imread(src_pic)
    src=cv2.resize(src,size)
    dst=cv2.imread(img_path)
    # 掩膜mask
    mask=255*np.ones(src.shape, src.dtype)
    output=cv2.seamlessClone(src, dst, mask, center, cv2.NORMAL_CLONE)
    cv2.imwrite(img_outPath, output)

当然,这只是一个小demo, 有许多地方可以改进,例如我们可以根据鼻梁的倾斜程度判断人脸的倾斜程度,从而对口罩做相应的旋转操作,更加适配人脸。

END

本文分享自微信公众号 - 算法与数据之美(algo_and_data),作者:斐波那契小李

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 上班摸鱼系列|Python开发命令行斗地主

    今天给大家带来的是如何上班如何高级摸鱼:用Python开发一个命令行斗地主小游戏,利用跑程序的时间来一把斗地主岂不是非常快乐,关键是没有时间限制,不仅可以喊上老...

    老肥码码码
  • 「Summary」July

    这是我进实验室的第二个月,主要还是自习,和导师讨论之后大概定了一下自己的研究方向,下面总结了一下这个月的学习~

    老肥码码码
  • 武大樱花又盛开,用Python画一棵樱花树

    黑夜可能漫长,但总会迎来温暖的阳光,三月如期而至,武大的樱花又一次盛开。那么今天就一起来看看怎样在python中画一棵美丽的樱花树~

    老肥码码码
  • 三十行代码实现自动戴口罩

    自 1 月 20 日钟南山院士肯定此次新型肺炎存在着人传人的现象起,到近日的武汉封城,我们人民群众也需要提高对此次疫情的重视程度,做好自身的防范工作,平平安安,...

    GitHubDaily
  • MySQL 性能优化--优化数据库结构之优化数据类型

    l 对于唯一ID或其它可用字符串或数字表示的值,选择用数字列好过用字符串列。因为相比对应的字符串,可使用更少的字节存储大数字,同时,转换并比较数字速度更快...

    授客
  • java中的IO操作

    使用FileReader读取 用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 F...

    爱撒谎的男孩
  • 华尔街失算!从英伟达财报看AI芯片市场的狂奔之路

    英伟达今天发布的Q1财报,实实在在打脸了华尔街此前的唱衰之声。 对于英伟达 AI 业务和自动驾驶的潜力,大家往好的一面预测的话,能乐观到什么程度? 对于老黄...

    AI科技大本营
  • 选型宝访谈 | 什么是没有基因缺陷的信息安全体系?

    ​ ...

    选型宝
  • Javascript获取数组中的最大值和最小值的方法汇总

    比较数组中数值的大小是比较常见的操作,下面同本文给大家分享四种放哪广发获取数组中最大值和最小值,对此感兴趣的朋友一起学习吧 比较数组中数值的大小是比较常见的操作...

    前朝楚水
  • 中科院遗传所课题组开发高质量基因组组装软件

    2019年11月25日,中国科学院遗传与发育生物学研究所梁承志研究组开发的高质量基因组组装软件HERA在Nature Communications在线发表。论文...

    生信宝典

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动