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

有时候需要在一个长视频中找到某个人出现的位置,在几分钟的视频还可以人工操作,过长的视频中去寻找则十分枯燥,这里介绍一种方法,通过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()

我们看一下运行效果:
在这里插入图片描述
该人脸图片在视频中出现的时间点,以秒为单位进行了标记。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有趣的代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值