暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

教你用python实现抖音上的头像特效合成

做一个柔情的程序猿 2021-02-08
771

点击上面“蓝字”关注我们!

一个人静静地与岁月交错,于平淡之中细细体会生活的深意,去注视,去聆听,去感受那些带着希望的别离以及那些经受沧桑的相逢,不论时光如何飞转,那些落花一样的往事,依然鲜活地存在于我的脑海之中。当岁月和美丽的回忆已成为风中的叹息,我们伤感的眼里也许依然残存旧时的泪痕,模糊了视线,不敢轻易触碰。

1 头像特效合成

实现思路

使用OpenCV检测出头部位置,向上移动20像素添加虚拟帽子,帽子的宽度等于脸的大小,高度等比缩小,需要注意的是如果高度小于脸部向上移动20像素的值,那么帽子的高度就等于最小高度=(脸部位置-20)。

为什么是20而不是30或者40,因为取得是检测的脸部和头顶的一般距离20,开发者可自己调整。

注意事项

图片合成元件,要是黑背景图片,透明的图片也会有问题,在ps手动处理一下透明图片,添加新图层,选中alt+Del添加黑背景,把新图层层级放到最底部即可。

2 效果图预览

3 代码实现

    #coding=utf-8
    import cv2

    # OpenCV人脸识别分类器
    classifier = cv2.CascadeClassifier(
    "C:\Python36\Lib\site-packages\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml"
    )

    img = cv2.imread("img/ag-3.png") # 读取图片
    imgCompose = cv2.imread("img/compose/maozi-1.png")

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换灰色
    color = (0, 255, 0) # 定义绘制颜色
    # 调用识别人脸
    faceRects = classifier.detectMultiScale(
    gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
    if len(faceRects): # 大于0则检测到人脸
    for faceRect in faceRects:
    x, y, w, h = faceRect
    sp = imgCompose.shape
    imgComposeSizeH = int(sp[0]/sp[1]*w)
    if imgComposeSizeH>(y-20):
    imgComposeSizeH=(y-20)
    imgComposeSize = cv2.resize(imgCompose,(w, imgComposeSizeH), interpolation=cv2.INTER_NEAREST)
    top = (y-imgComposeSizeH-20)
    if top<=0:
    top=0
    rows, cols, channels = imgComposeSize.shape
    roi = img[top:top+rows,x:x+cols]

    # Now create a mask of logo and create its inverse mask also
    img2gray = cv2.cvtColor(imgComposeSize, cv2.COLOR_RGB2GRAY)
    ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
    mask_inv = cv2.bitwise_not(mask)

    # Now black-out the area of logo in ROI
    img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)

    # Take only region of logo from logo image.
    img2_fg = cv2.bitwise_and(imgComposeSize, imgComposeSize, mask=mask)

    # Put logo in ROI and modify the main image
    dst = cv2.add(img1_bg, img2_fg)
    img[top:top+rows, x:x+cols] = dst

    cv2.imshow("image", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    推荐阅读

    (点击标题可跳转阅读)

    汇总超全Matplotlib可视化最有价值的 50 个图表(附 Python 源代码)(二)

    教你用Python制作实现自定义字符大小的简易小说阅读器

    小程序云开发项目的创建与配置

    汇总超全Matplotlib可视化最有价值的 50 个图表(附 Python 源代码)(一)

    超详细讲解CTC理论和实战

    ODBC连接主流数据库的配置方法

    教你用python进行数字化妆,可爱至极

    加速Python列表和字典,让你代码更加高效

    老铁,三连支持一下,好吗?↓↓↓


    点分享

    点点赞

    点在

    文章转载自做一个柔情的程序猿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论