
前段时间老婆在家里刷电视剧【少年派】 挺喜欢里面的人物,于是在空闲之余整了这段代码,提取了一下里面的人物,做个分享, 代码是Python写的,作为一个PHP的开发者,Python代码写的有点烂,将就着看吧!代码结构如下:

getImg 目录下面 getImg.py 是程序的所有包:
import cv2
import math
import os
import config
from PIL import Image
import operator
from functools import reduce
from aip import AipFace
import base64
import imageio
def video_to_img(vide_name):
mp4 = cv2.VideoCapture("video/" + vide_name) # 读取视频
is_opened = mp4.isOpened()
fps = mp4.get(cv2.CAP_PROP_FPS)
print(fps)
widght = mp4.get(cv2.CAP_PROP_FRAME_WIDTH) # 获取视频的宽度
height = mp4.get(cv2.CAP_PROP_FRAME_HEIGHT) # 获取视频的高度
print(str(widght) + "x" + str(height))
i = 1
j = 1
while is_opened:
(flag, frame) = mp4.read()
if i % (int(fps)) == 0:
file_name = "image/" + str(j) + ".jpg"
if flag == True:
cv2.imwrite(file_name, frame, [cv2.INTER_AREA]) # 保存图片
j += 1
i += 1
cv2.waitKey(1)
mp4.release()
video_to_img() 方法是把我*载下**的视频 切成图片,切的效果如下:

在这里需要注意的是:
if i % (int(fps)) == 0:
file_name = "image/" + str(j) + ".jpg"
我按照帧去存储图片的,如果直接去存储的话 电脑 会黑屏.
切完图片以后, 由于 重复的太多,刚开始 写一个一段 图片 相似度比较 然后 把 相同的图片 给清洗掉,后来发现没有用上,代码如下:
def compare_image(file_image_one, file_image_two):
image1 = Image.open(file_image_one)
image2 = Image.open(file_image_two)
histogram1 = image1.histogram()
histogram2 = image2.histogram()
differ = math.sqrt(
reduce(operator.add, list(map(lambda a, b: (a - b) ** 2, histogram1, histogram2))) / len(histogram1))
# print(differ)
return differ
这个方法 返回的是 两张图片相似度比较 differ 值越小 越相似, 然后做了清洗, 但是整完这些以后 人物头像 只留下了 几个 没啥用 于是 这个方法放弃了.
用百度人脸识别API清洗
最后使用了 百度的 人脸识别API进行了清洗 把 带有头像的 图片给筛选出来,代码如下:
def check_face_img(image_path):
image_str = get_image_base64(image_path)
client = AipFace(config.APP_ID, config.APP_KEY, config.SECRET_KEY)
imageType = "BASE64"
# print(client.detect(image_str, imageType)['error_code'] != 0)
if client.detect(image_str, imageType)['error_code'] != 0:
# print('没有人脸的图片===>' + image_path)
delete_no_face(image_path)
清洗以后就留下了,所有的人像, 但是 在这里 清洗的时候需要注意,由于图片有 4000多张图片, 清洗一次 不一定清洗完全 于是 就清洗了多次,然后留下的 2000多张,效果如下:

然后得到这么多图片,没啥用, 就挑了一些,做了个 gif 图.
做GIF 图:
def image_Intercept(image_path, image):
img = Image.open(image_path + image)
# 图片尺寸
img_size = img.size
h = img_size[1] # 图片高度
w = img_size[0] # 图片宽度
x = 0
y = 0
w = w - 200
h = h - 100
region = img.crop((x, y, x + w, y + h))
region.save(image_path + '\image_Intercept\\' + image)
由于 生成的图片上面有 对话 和 电视剧的标识,所以整了上面的代码 裁剪 掉 生成 新的 没有对话 和 电视剧的 标识.
def create_gif(image_list, gif_name, image_path):
frames = []
print(image_list)
for image_name in image_list:
if image_name.endswith('.jpg'):
print(image_name)
frames.append(imageio.imread(image_path + '\\' + image_name))
imageio.mimsave(image_path + '\\' + gif_name, frames, 'GIF', duration=0.2)
最后,使用了上面的代码生成了 gif 图
整完, 最后整一句, 我也不知道这图片 或者 gif 能干啥, 有点子的来留言说说。