有时候需要在一个长视频中找到某个人出现的位置,在几分钟的视频还可以人工操作,过长的视频中去寻找则十分枯燥,这里介绍一种方法,通过Python&Face_recognition自动寻找人脸在视频中出现的时间点,再根据时间点去翻看视频,这样能减轻大量的枯燥工作。
一、准备工作
开发环境:Win10、Python3.7
1、安装dlib
在https://pypi.org/simple/dlib/下载跟自己版本对应的安装包,也就是whl文件。
在cmd中,定位到whl文件目录,安装即可。
pip install dlib-19.17.99-cp37-cp37m-win_amd64.whl
这里强烈推荐此种安装方法,如果直接安装,特别容易出现错误。
2、安装face_recognition
pip install face_recogniton
二、寻找人物在视频中出现的时间点
1、测试数据
在网上随便截取了一小段视频,从视频中截取任务人脸,作为测试数据。
2、代码
# -*- coding: utf-8 -*-
# 导入face_recognition模块
import face_recognition
import cv2 as cv
import numpy as np
capture = cv.VideoCapture('D:/Products/Python/work/VideoFaceCapture/face.mp4') # 导入视频
video_face = face_recognition.load_image_file("video_face.jpg") # 加载待比对的人脸图片
video_face_encoding = face_recognition.face_encodings(video_face) # 获取图像面部编码
process_this_frame = True
video_time = []
i = 0
s = 0
fps = int(capture.get(cv.CAP_PROP_FPS)) # 获取视频帧率
print("视频帧数为" + str(fps))
all_frames = int(capture.get(cv.CAP_PROP_FRAME_COUNT)) # 获取视频总帧数
print("视频时长为" + str(all_frames / fps) + "秒")
while (True):
ret, frame = capture.read() # 读取成功后 ret 返回为为布尔值True,frame返回读取的一帧图像
# 每秒只比对一帧,提高效率
if (i % fps == 0):
s = i / fps + 1
print("获取第" + str(s) + "秒")
# 将图像从bgr颜色(opencv使用)转换为rgb颜色(人脸识别使用)
rgb_frame = frame[:, :, ::-1]
if process_this_frame:
# 根据encoding来判断是不是同一个人,是就输出true,不是为flase
face_locations = face_recognition.face_locations(rgb_frame)
face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
# 对每一帧图像进行人脸比对
for face_encoding in face_encodings:
matches = face_recognition.compare_faces(video_face_encoding, face_encoding, tolerance=0.46)
face_distances = face_recognition.face_distance(video_face_encoding, face_encoding)
best_match_index = np.argmin(face_distances)
if matches[best_match_index]:
print("识别到人脸")
video_time.append(s)
i = i + 1
if(i - all_frames == 0):
break;
print("结束")
print("该人物在视频中出现在以下时间点(秒):")
print(video_time)
capture.release()
cv.destroyAllWindows()
我们看一下运行效果:
该人脸图片在视频中出现的时间点,以秒为单位进行了标记。
版权声明:本文为woshigunshen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。