[python美颜系列一] python使用opencv给视频/图片添加萌萌哒贴纸

Song • 21547 次浏览 • 1 个回复 • 2019年04月30日

如今美颜相机非常流行,作为钢铁直男,我不关注如何让自己美颜更加好看,我更加关注如何实现这个功能呢?

在这里我们不计划使用复杂的深度学习等人工智能的算法实现(其实使用了),我们这里使用python+opencv来实现此功能,直接开始:

一、环境需求

  • 1、python
  • 2、opencv
  • 3、pillow

二、具体实现

为了实现这个方法,初步构造我计划使用3步实现此功能,简单直接实时捕捉视频,人脸识别,添加头像

1、实时捕捉摄像头

opencv已经提供了很好的方法可以实现录像功能,直接上代码:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

videoWriter = cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc(*'MJPG'), 15, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)
        videoWriter.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
videoWriter.release()
cv2.destroyAllWindows()

如上代码每秒获取15张图片保存为视频。

2、人脸识别

懂视频的人都知道,视频是按照每帧图片合成在一起的,所以我的构思就是要实现视频人脸识别,就对每张图片进行识别。

import numpy as np
import cv2

img = cv2.imread('sachin.jpg')

# 人脸识别数据
face_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/4.0.1/share/opencv4/haarcascades/haarcascade_frontalface_default.xml')
# 人眼识别数据
eye_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/4.0.1/share/opencv4/haarcascades/haarcascade_eye.xml')
# 二值化,变为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 获取人脸识别数据
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    # 绘画人脸识别数据
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)

cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

如上代码我们进行了单张图片进行人脸识别,最终绘制人脸范围,大家可以修改自己的人脸识别数据文件地址和眼睛数据地址。

3、python+opencv实现添加贴纸

具体这个叫啥名字我也不清楚了,就是在视频中添加帽子啊,雪糕啊啥的,然后我的实现方式是:根据人脸识别数据,在头的上方添加贴纸 ,就是这么简单,其实就是一个添加水印的功能。

我们这里使用pillow进行水印的添加,当然也可以只使用opencv添加,不过我在实现时效果不是很好,如下是python添加图片水印的方法。

from PIL import Image
im = Image.open("1.jpg")
mark=Image.open("2.jpg")
layer=Image.new('RGBA', im.size, (0,0,0,0))
layer.paste(mark, (0,0))
out=Image.composite(layer,im,layer)
out.show()

三、最终代码与效果

import numpy as np
import cv2
import time
import datetime
from PIL import Image

cap = cv2.VideoCapture(0)

''' 人脸识别 '''
def getface(img):
    # 人脸识别数据
    face_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/4.0.1/share/opencv4/haarcascades/haarcascade_frontalface_default.xml')
    # 人眼识别数据
    eye_cascade = cv2.CascadeClassifier('/usr/local/Cellar/opencv/4.0.1/share/opencv4/haarcascades/haarcascade_eye.xml')
    # 二值化,变为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 获取人脸识别数据
    faces = face_cascade.detectMultiScale(gray, 1.3, 5)
    for (x,y,w,h) in faces:
        # 绘画人脸识别数据
        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        # 根据人脸识别数据添加头像
        img = christmas(img,x,y,w,h)
    return img

def christmas(img,x,y,w,h):
    im = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
    # 你的贴纸地址
    mark=Image.open("hat/2.png")
    height = int(w*987/1024)
    mark = mark.resize((w, height))
    layer=Image.new('RGBA', im.size, (0,0,0,0))
    layer.paste(mark, (x,y-height))
    out=Image.composite(layer,im,layer)
    img = cv2.cvtColor(np.asarray(out),cv2.COLOR_RGB2BGR)
    return img

videoWriter = cv2.VideoWriter('testwrite.avi', cv2.VideoWriter_fourcc(*'MJPG'), 15, (1000,563))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        # 从新定义图片大小
        img = cv2.resize(frame,(1000,563))

        # 添加录像时间
        # img = addtime(img)
        # 实时识别
        img = getface(img)
        # 视频显示
        cv2.imshow('frame',img)
        # 保存视频
        videoWriter.write(img)
        if cv2.waitKey(10) & 0xFF == ord('q'):
            print("退出视频")
            break
    else:
        break

cap.release()
videoWriter.release()
cv2.destroyAllWindows()

如上我们实现效果如下图,单张图添加贴纸就更简单的,大家改改代码就可以了。

python使用opencv给视频/图片添加萌萌哒贴纸 图片素材来自百度。


原创文章,转载请注明 :[python美颜系列一] python使用opencv给视频/图片添加萌萌哒贴纸 - pytorch中文网
原文出处: https://ptorch.com/news/242.html
问题交流群 :168117787
提交评论
要回复文章请先登录注册
用户评论
Pytorch是什么?关于Pytorch! python使用Rasa_NLU/Rasa_NLU_Chi将中文自然语言转化为结构化数据(中文自然语言理解)