【对视频中的人物进行模糊处理】
步骤
- 先将视频进行分帧处理
- 将视频分帧后的图片进行依次识别,模糊化处理
- 将新的图片合成为新的视频
import os
from numpy import *
import cv2
import face_recognition
import sys
from PIL import Image, ImageFilter
from scipy.ndimage import filters
import matplotlib.pyplot as plt
def videomosaic(v_path):
#视频分帧
cap=cv2.VideoCapture(v_path)
frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
#对每帧图片进行处理
for i in range(int(frame_count)):
#读取每张图片中的人脸信息
_,img = cap.read()
face_locations=face_recognition.face_locations(img)
#print(face_locations)
#注意!face_location(top,right,bottom,left)
face_num=len(face_locations)
#现在的图片是array格式,需要转成PIL Image格式后才能用PIL操作
pil=Image.fromarray(img.astype('uint8')).convert('RGB')
#对每张人脸进行高斯模糊
for j in range(0,face_num):
#注意!crop(left,upper,right,lower)与face_locaion的默认参数不同,所以在写box时要调换顺序
box=(face_locations[j][3],face_locations[j][0],face_locations[j][1],face_locations[j][2])
#print(box)
#将裁剪下来的图片高斯模糊后粘回
region=pil.crop(box)
#print(type(region))
region1=region.filter(ImageFilter.GaussianBlur(radius=15))
#print(type(region1))
#region1=Image.fromarray(region1.astype('uint8')).convert('RGB')
#print(type(region1))
pil.paste(region1,box)
# plt.imshow(pil)
#plt.title("bear")
#plt.axis('off')
#plt.show()
#再把pil转回array格式之后用cv2存储新文件
pil=array(pil)
cv2.imwrite('./piccc/image{}.jpg'.format(i),pil)
face_locations.clear()
os.chdir(r'C:\Users\81244\Desktop\Python practice')
os.mkdir('./piccc')
path='ghz.mp4'
#image_save=r'C:\Users\81244\Desktop\Python practice\piccc'
videomosaic(path)
延伸想法:视频中的人脸贴上卡通图片
#将裁剪下来的图片高斯模糊后粘回
region=pil.crop(box)
#print(type(region))
region1=region.filter(ImageFilter.GaussianBlur(radius=15))
#print(type(region1))
#region1=Image.fromarray(region1.astype('uint8')).convert('RGB')
#print(type(region1))
pil.paste(region1,box)
将该步骤中的图片剪切粘贴换成卡通