欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-23 10:58:09
成果展示项目简介原理很简单,就是先把图像中的人脸检测出来,然后在人脸的上方添加圣诞帽。我们这里采用opencv来实现,所以建议你先了解一下如何在python中使用opencv检测图像中的脸部。项目地址https://github.com/XavierJiezou/opencv-christmas-hat预备知识【python】15行代码实现人脸检测(opencv)【python】15行代码实现猫脸检测(opencv)【python】15行代码实现动漫人脸检测(open...


1. 成果展示

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

2. 项目简介

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

3. 项目地址

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

4. 预备知识

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

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

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

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

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

【python】60行代码实现给头像戴上圣诞帽(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. 圣诞素材

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

8. 引用参考

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

9. 相关推荐

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

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

本文地址:https://blog.csdn.net/qq_42951560/article/details/111940034