Python&face_recognition寻找人脸在视频中出现的时间点

  • Post author:
  • Post category:python


有时候需要在一个长视频中找到某个人出现的位置,在几分钟的视频还可以人工操作,过长的视频中去寻找则十分枯燥,这里介绍一种方法,通过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 版权协议,转载请附上原文出处链接和本声明。