【python】60行代码实现给头像戴上圣诞帽(opencv)


1. 成果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 项目简介

原理很简单,就是先把图像中的人脸检测出来,然后在人脸的上方添加圣诞帽。我们这里采用opencv来实现,所以建议你先了解一下如何在python中使用opencv检测图像中的脸部。

3. 项目地址

https://github.com/XavierJiezou/opencv-christmas-hat

4. 预备知识

【python】15行代码实现人脸检测(opencv)

【python】15行代码实现猫脸检测(opencv)

【python】15行代码实现动漫人脸检测(opencv)

5. 完整代码

import cv2
import random


def face_detect(img, cname):
    # 脸部检测代码
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_hist = cv2.equalizeHist(img_gray)
    face_cascade = cv2.CascadeClassifier(cname)
    faces = face_cascade.detectMultiScale(img_hist)
    return faces


def christmas_hat(fname, cname):
    img = cv2.imread(fname)
    # 脸部检测
    faces = face_detect(img, cname)
    # 读取圣诞帽
    hats = [cv2.imread(f'img/hats/hat_{i+1}.png', -1) for i in range(3)]
    for face in faces:
        hat = random.choice(hats) # 随机选择一个帽子
        scale = face[3] / hat.shape[0] * 2  # 设置缩放因子
        hat = cv2.resize(hat, (0, 0), fx=scale, fy=scale) # 调整帽子大小
        x_offset = int(face[0] + face[2] / 2 - hat.shape[1] / 2) # 计算帽子的x偏移
        y_offset = int(face[1] - hat.shape[0] / 2)  # 计算帽子的y偏移
        # 计算贴图位置,注意防止超出边界的情况
        x1 = max(x_offset, 0)
        x2 = min(x_offset + hat.shape[1], img.shape[1])
        y1 = max(y_offset, 0)
        y2 = min(y_offset + hat.shape[0], img.shape[0])
        hat_x1 = max(0, -x_offset)
        hat_x2 = hat_x1 + x2 - x1
        hat_y1 = max(0, -y_offset)
        hat_y2 = hat_y1 + y2 - y1
        # 透明部分的处理
        alpha_h = hat[hat_y1:hat_y2, hat_x1:hat_x2, 3] / 255
        alpha = 1 - alpha_h
        # 按3个通道合并图片
        for c in range(3):
            img[y1:y2, x1:x2, c] = alpha_h * hat[hat_y1:hat_y2, hat_x1:hat_x2, c] + alpha * img[y1:y2, x1:x2, c]
        # 保存最终结果
        cv2.imwrite(f'img/result/{fname.split("/")[-1]}', img) 


def main(fname):
    target = input('请选择要添加圣诞帽的对象: 1 人 2 猫 3 动漫 (默认1) ')
    target = target if target else '1'
    if target == '1':
        cname = 'data/haarcascade_frontalface_alt.xml'
    elif target == '2':
        cname = 'data/haarcascade_frontalcatface.xml'
    elif target == '3':
        cname = 'data/lbpcascade_animeface.xml'
    else:
        print('检测对象输入有误')
    christmas_hat(fname, cname)


if __name__ == "__main__":
    main('img/test/test_3.jpg') # 这里输入要添加圣诞帽的图像路径

6. 必要组件

以下三个文件分别是人脸、猫脸和动漫脸的级联分类器:

7. 圣诞素材

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. 引用参考

https://github.com/crossin/snippet/tree/master/face_detect

9. 相关推荐

【python】30行代码实现视频中的动漫人脸检测(opencv)

posted @ 2020-12-30 01:05  XavierJ  阅读(354)  评论(0编辑  收藏  举报