先上几张动图(CSDN没法传视频,放在B站又怕侵权)
创意来自Ryan huang 这位博主的博客,当时看了觉得很有趣,就想自己试一试,选的是推背兔的最强法海(大胆妖孽,我一眼就看出你不是人)。获取B站视频可以看我之前的文章。
代码也是参考的Ryan huang这位博主的,大体过程就是先将视频按帧分为图片,然后对每张图片进行人脸识别检测,最后将检测结果再合为视频。人脸检测用的模型是paddlehub中已经训练好的模型,所以代码量很少,操作比较简单。最后合成的视频是没有声音的,我是通过kdenlive软件在本地合成的,这样简单一点。
还有一个问题是这个代码在进行人脸检测的时候卡的不行,电脑都卡成PPT,我也不知道为什么,所以如果要选择视频的话尽量选择小一点的,清晰度差一点的,我当时选的超清画质,大概才29M左右的样子的,就卡的我怀疑人生,我甚至以为我电脑要坏了,所以选择视频的时候最好不要超过10M。
代码如下:
#-*- coding:UTF-8 -*-
import os
import cv2
import json
import numpy as np
import paddlehub as hub
import matplotlib.image as mping
import matplotlib.pyplot as plt
from tqdm import tqdm
video = cv2.VideoCapture("/home/tanronkai/baidunetdiskdownload/video.mp4")
fps = video.get(cv2.CAP_PROP_FPS)#视频帧率
frameCount = video.get(cv2.CAP_PROP_FRAME_COUNT)#获取视频的总帧数
width = video.get(cv2.CAP_PROP_FRAME_WIDTH)#获取视频的宽度
height = video.get(cv2.CAP_PROP_FRAME_HEIGHT)
print('视频的宽度:{}'.format(width))
print('视频的高度:{}'.format(height))
print('视频帧率:{}'.format(fps))
print('视频总帧数:{}'.format(frameCount))
if not os.path.exists('frame'):
os.mkdir('frame')
all_img = []
all_img_path_dict = {'image':[]}
ret,frame = video.read()
i = 0
while ret:
all_img.append(frame)
i += 1
ret,frame = video.read()
if ret:
path = os.path.join('frame',str(i)+'.jpg')#用于名称拼接,输出1.jpg
all_img_path_dict['image'].append(path)
#cv2.imwrite(path,frame)
all_img_path_dict['image'].pop()
print('完成!')
module = hub.Module(name="ultra_light_fast_generic_face_detector_1mb_640")
results = module.face_detection(data=all_img_path_dict,
use_gpu=True,
visualization=True)
for i,info in tqdm(enumerate(results)):
num_info = info['data']
if not len(num_info):
frame = (all_img[i][:,:,::-1]).copy()
else:
frame = mping.imread(info['path'].replace('frame','face_detector_640_predict_output'))
plt.imsave('./img_out/{}.jpg'.format(i),frame)#要先创建一个img_out文件夹
这时候我们就可以看到img_out文件夹中就是我们想要的图片了,我们下一步要做的就是将文件夹中的图片变为视频,通过ffmpeg来实现(没有安装的话请自行搜索安装)
在终端中进入img_out所在的文件夹,输入以下命令:
ffmpeg -f image2 -i img_out/%d.jpg -r 60.0 temp.mp4
视频便生成了,但是生成的视频没有声音,我是通过视频剪辑软件来添加音频的,我在Ubuntu系统下使用的Kdenlive,添加音频不是很麻烦,有兴趣的可以试一下。