天天看点

python opencv 录制视频_[python美颜系列一] python使用opencv给视频/图片添加萌萌哒贴纸 - pytorch中文网...

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

在这里我们不计划使用复杂的深度学习等人工智能的算法实现(其实使用了),我们这里使用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中文网...

图片素材来自百度。

原创文章,转载请注明 :[python美颜系列一] python使用opencv给视频/图片添加萌萌哒贴纸 - pytorch中文网

原文出处: https://www.ptorch.com/news/242.html

问题交流群 :168117787