如今美颜相机非常流行,作为钢铁直男,我不关注如何让自己美颜更加好看,我更加关注如何实现这个功能呢?
在这里我们不计划使用复杂的深度学习等人工智能的算法实现(其实使用了),我们这里使用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美颜系列一] python使用opencv给视频/图片添加萌萌哒贴纸 - pytorch中文网
原文出处: https://www.ptorch.com/news/242.html
问题交流群 :168117787