Python+Opencv实战之人脸追踪详解

目录
  • 前言
  • 人脸追踪技术简介
  • 使用基于 dlib DCF 的跟踪器进行人脸跟踪
  • 使用基于 dlib DCF 的跟踪器进行对象跟踪
  • 小结

前言

人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份、意图和情感;而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用。由于外观变化、遮挡、快速运动、运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性。

人脸追踪技术简介

基于判别相关滤波器 (discriminative correlation filter, DCF) 的视觉跟踪器具有优异的性能和较高的计算效率,可用于实时应用程序。DCF 跟踪器是一种非常流行的基于边界框跟踪的方法。

dlib 库中实现了基于 DCF 的跟踪器,可以很方便的将其用于对象跟踪。在本文中,我们将介绍如何使用此跟踪器进行人脸和用户选择对象的跟踪,这种方法也称为判别尺度空间跟踪器 (Discriminative Scale Space Tracker, DSST),追踪器仅需要输入原始视频和目标初始位置的边界框,然后跟踪器自动预测目标的轨迹。

使用基于 dlib DCF 的跟踪器进行人脸跟踪

在进行人脸追踪时,我们首先使用 dlib 人脸检测器进行初始化,然后使用基于 dlib DCF 的跟踪器 DSST 进行人脸跟踪。调用以下函数初始化相关跟踪器:

tracker = dlib.correlation_tracker()

这将使用默认值 (filter_size = 6, num_scale_levels = 5, scale_window_size = 23, regularizer_space = 0.001, nu_space = 0.025, regularizer_scale = 0.001, nu_scale = 0.025, scale_pyramid_alpha = 1.020) 初始化跟踪器。 filter_size num_scale_levels 的值越大,跟踪精度越高,但它需要算力也更大;filter_size 的推荐使用值为 5、6 和 7;num_scale_levels 的推荐使用值为 4、5 和 6。

使用 tracker.start_track() 可以开始跟踪。在开始追踪前,我们需要先执行人脸检测,并将检测到的人脸位置传递给这个方法:

if tracking_face is False:
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 尝试检测人脸以初始化跟踪器
    rects = detector(gray, 0)
    # 检查是否检测到人脸
    if len(rects) > 0:
        # 开始追踪
        tracker.start_track(frame, rects[0])
        tracking_face = True

当检测到人脸后,人脸跟踪器将开始跟踪边界框内的内容。为了更新被跟踪对象的位置,需要调用 tracker.update() 方法:

tracker.update(frame)

tracker.update() 方法更新跟踪器并返回衡量跟踪器置信度的指标,此指标可用于使用人脸检测重新初始化跟踪器。

要获取被跟踪对象的位置,需要调用 tracker.get_position() 方法:

pos = tracker.get_position()

tracker.get_position() 方法返回被跟踪对象的位置。最后,绘制人脸的预测位置:

cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)

下图中,显示了人脸跟踪算法的跟踪效果过程:

在上图中,可以看到算法当前正在跟踪检测到的人脸,同时还可以按数字 1 以重新初始化跟踪。

完整代码

完整代码如下所示,同时我们需要提供按下数字 1 时重新初始化跟踪器的选项。

import cv2
import dlib

def draw_text_info():
    # 绘制文本的位置
    menu_pos_1 = (10, 20)
    menu_pos_2 = (10, 40)
    # 绘制菜单信息
    cv2.putText(frame, "Use '1' to re-initialize tracking", menu_pos_1, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
    if tracking_face:
        cv2.putText(frame, "tracking the face", menu_pos_2, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0))
    else:
        cv2.putText(frame, "detecting a face to initialize tracking...", menu_pos_2, cv2.FONT_HERSHEY_SIMPLEX, 0.5,
                    (0, 0, 255))

# 创建视频捕获对象
capture = cv2.VideoCapture(0)
# 加载人脸检测器
detector = dlib.get_frontal_face_detector()
# 初始化追踪器
tracker = dlib.correlation_tracker()
# 当前是否在追踪人脸
tracking_face = False

while True:
    # 捕获视频帧
    ret, frame = capture.read()
    # 绘制基本信息
    draw_text_info()

    if tracking_face is False:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # 尝试检测人脸以初始化跟踪器
        rects = detector(gray, 0)
        # 通过判断是否检测到人脸来决定是否启动追踪
        if len(rects) > 0:
            # Start tracking:
            tracker.start_track(frame, rects[0])
            tracking_face = True

    if tracking_face is True:
        # 更新跟踪器并打印测量跟踪器的置信度
        print(tracker.update(frame))
        # 获取被跟踪对象的位置
        pos = tracker.get_position()
        # 绘制被跟踪对象的位置
        cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)
    # 捕获键盘事件
    key = 0xFF & cv2.waitKey(1)

    # 按 1 初始化追踪器
    if key == ord("1"):
        tracking_face = False
    # 按 q 退出
    if key == ord('q'):
        break
    # 显示结果
    cv2.imshow("Face tracking using dlib frontal face detector and correlation filters for tracking", frame)
# 释放所有资源
capture.release()
cv2.destroyAllWindows()

使用基于 dlib DCF 的跟踪器进行对象跟踪

除了人脸外,基于 dlib DCF 的跟踪器可以用于跟踪任意对象。接下来,我们使用鼠标选择要跟踪的对象,并监听键盘事件,如果按 1,将开始跟踪预定义边界框内的对象;如果按 2,预定义的边界框将被清空,跟踪算法将停止,并等待用户选择另一个边界框。

例如,我们对检测小姐姐并不感兴趣,而更喜欢猫,那么我们可以首先用鼠标绘制矩形框选择喵咪,然后按 1 开始追踪小猫咪,如果我们想要追踪其他物体,可以按 2 重新绘制矩形框并进行追踪。如下所示,我们可以看到算法跟踪对象并进行实时输出:

完整代码

完整代码如下所示:

import cv2
import dlib

def draw_text_info():
    # 绘制文本的位置
    menu_pos_1 = (10, 20)
    menu_pos_2 = (10, 40)
    menu_pos_3 = (10, 60)
    # 菜单项
    info_1 = "Use left click of the mouse to select the object to track"
    info_2 = "Use '1' to start tracking, '2' to reset tracking and 'q' to exit"

    # 绘制菜单信息
    cv2.putText(frame, "Use '1' to re-initialize tracking", menu_pos_1, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
    cv2.putText(frame, info_2, menu_pos_2, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
    if tracking_state:
        cv2.putText(frame, "tracking", menu_pos_3, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0))
    else:
        cv2.putText(frame, "not tracking", menu_pos_3, cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255))

# 用于保存要跟踪的对象坐标的结构
points = []

def mouse_event_handler(event, x, y, flags, param):
    # 对全局变量的引用
    global points
    # 添加要跟踪的对象的左上角坐标
    if event == cv2.EVENT_LBUTTONDOWN:
        points = [(x, y)]
    # 添加要跟踪的对象的右下角坐标:
    elif event == cv2.EVENT_LBUTTONUP:
        points.append((x, y))
# 创建视频捕获对象
capture = cv2.VideoCapture(0)

# 窗口名
window_name = "Object tracking using dlib correlation filter algorithm"
# 创建窗口
cv2.namedWindow(window_name)
# 绑定鼠标事件
cv2.setMouseCallback(window_name, mouse_event_handler)

# 初始化跟踪器
tracker = dlib.correlation_tracker()
tracking_state = False
while True:
    # 捕获视频帧
    ret, frame = capture.read()
    # 绘制菜单项
    draw_text_info()

    # 设置并绘制一个矩形,跟踪矩形框内的对象
    if len(points) == 2:
        cv2.rectangle(frame, points[0], points[1], (0, 0, 255), 3)
        dlib_rectangle = dlib.rectangle(points[0][0], points[0][1], points[1][0], points[1][1])

    if tracking_face is True:
        # 更新跟踪器并打印测量跟踪器的置信度
        print(tracker.update(frame))
        # 获取被跟踪对象的位置
        pos = tracker.get_position()
        # 绘制被跟踪对象的位置
        cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)

    # 捕获键盘事件
    key = 0xFF & cv2.waitKey(1)

    # 按下 1 键,开始追踪
    if key == ord("1"):
        if len(points) == 2:
            # Start tracking:
            tracker.start_track(frame, dlib_rectangle)
            tracking_state = True
            points = []
    # 按下 2 键,停止跟踪
    if key == ord("2"):
        points = []
        tracking_state = False
    # 按下 q 键,返回
    if key == ord('q'):
        break

    # 展示结果图像
    cv2.imshow(window_name, frame)

# 释放资源
capture.release()
cv2.destroyAllWindows()

小结

dlib 库实现了基于 DCF 的跟踪器,非常适合用于进行人脸追踪,使用 dlib.correlation_tracker() 函数初始化跟踪器,tracker.start_track() 函数用于开始追踪对象,tracker.update() 函数更新追踪器并且返回追踪器置信度,若要获取被跟踪对象的位置需要使用 tracker.get_position() 函数。

 以上就是Python+Opencv实战之人脸追踪详解的详细内容,更多关于Python Opencv 人脸追踪的资料请关注我们其它相关文章!

(0)

相关推荐

  • 基于python3+OpenCV实现人脸和眼睛识别

    基于python3+OpenCV的人脸和眼睛识别,供大家参考,具体内容如下 一.OpenCV人脸检测的xml文件下载 人脸检测和眼睛检测要用到haarcascade_eye.xml和haarcascade_frontalface_default.xml这两个文件,这两个文件可以在OpenCV的官网下载,具体下载方法如下: 1.打开要下载的xml文件,如下图: 2.点击Raw: 3.在新打开的网页中右击,选择另存为,最后保存就可以了. 二.人脸检测文件的导入以及图片的处理 接下来就可以在代码中载入

  • python计算机视觉OpenCV库实现实时摄像头人脸检测示例

    目录 设备准备: 实现过程 调用模型库文件 打开摄像头 人脸检测 设置退出机制 程序运行 全部代码 OpenCV 是一个C++库,目前流行的计算机视觉编程库,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉领域的模块.在Python中常使用OpenCV库实现图像处理. 本文将介绍如何在Python3中使用OpenCV实现实时摄像头人脸检测: 设备准备: USB摄像头 接入PC电脑USB口,并调试正常打开视频.如果电脑内置了电脑摄像头,测试一下摄像头能否正常使用. 下载特征分类模型: XM

  • 基于python+opencv调用电脑摄像头实现实时人脸眼睛以及微笑识别

    本文教大家调用电脑摄像头进行实时人脸+眼睛识别+微笑识别,供大家参考,具体内容如下 一.调用电脑摄像头进行实时人脸+眼睛识别 # 调用电脑摄像头进行实时人脸+眼睛识别,可直接复制粘贴运行 import cv2 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier(cv2.data.ha

  • python基于opencv实现人脸识别

    将opencv中haarcascade_frontalface_default.xml文件下载到本地,我们调用它辅助进行人脸识别. 识别图像中的人脸 #coding:utf-8 import cv2 as cv # 读取原始图像 img = cv.imread('face.png') # 调用熟悉的人脸分类器 识别特征类型 # 人脸 - haarcascade_frontalface_default.xml # 人眼 - haarcascade_eye.xml # 微笑 - haarcascad

  • Python+Opencv实战之人脸追踪详解

    目录 前言 人脸追踪技术简介 使用基于 dlib DCF 的跟踪器进行人脸跟踪 使用基于 dlib DCF 的跟踪器进行对象跟踪 小结 前言 人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份.意图和情感:而目标跟踪试图估计目标在整个视频序列中的轨迹,其中只有目标的初始位置是已知的,将这两者进行结合将产生许多有趣的应用.由于外观变化.遮挡.快速运动.运动模糊和比例变化等多种因素,人脸追踪非常具有挑战性. 人脸追踪技术简介 基于判别相关滤波器 (d

  • Python OpenCV学习之图像滤波详解

    目录 背景 一.卷积相关概念 二.卷积实战 三.均值滤波 四.高斯滤波 五.中值滤波 六.双边滤波 七.Sobel算子 八.Scharr算子 九.拉普拉斯算子 十.Canny算法 背景 图像滤波的作用简单来说就是将一副图像通过滤波器得到另一幅图像:明确一个概念,滤波器又被称为卷积核,滤波的过程又被称为卷积:实际上深度学习就是训练许多适应任务的滤波器,本质上就是得到最佳的参数:当然在深度学习之前,也有一些常见的滤波器,本篇主要介绍这些常见的滤波器: 一.卷积相关概念 卷积核大小一般为奇数的原因:

  • Python+MediaPipe实现检测人脸功能详解

    目录 MediaPipe概述 人脸检测 MediaPipe概述 谷歌开源MediaPipe于2019年6月首次推出.它的目标是通过提供一些集成的计算机视觉和机器学习功能,使我们的生活变得轻松. MediaPipe是用于构建多模态(例如视频.音频或任何时间序列数据).跨平台(即eAndroid.IOS.web.边缘设备)应用ML管道的框架. Mediapipe还促进了机器学习技术在各种不同硬件平台上的演示和应用程序中的部署. 应用 人脸检测 多手跟踪 头发分割 目标检测与跟踪 目标:三维目标检测与

  • Python+Opencv实现图像模板匹配详解

    目录 引言 一.匹配方法 二.匹配单个对象 三.匹配多个对象 引言 什么是模板匹配呢? 看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见 等等. 模板匹配可以看作是对象检测的一种非常基本的形式.使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象. 一.匹配方法 cv2.matchTemplate(img, templ, method) 参数:(img: 原始图像.temple: 模板图像.method: 匹配度计算方法) 方法如下: cv2.TM_SQD

  • Python OpenCV使用dlib进行多目标跟踪详解

    目录 1.使用dlib进行多目标跟踪 2.项目结构 3.dlib多对象跟踪的简单“朴素”方法 4.快速.高效的dlib多对象跟踪实现 5.完整代码 6.改进和建议 在本教程中,您将学习如何使用 dlib 库在实时视频中有效地跟踪多个对象. 我们当然可以使用 dlib 跟踪多个对象:但是,为了获得可能的最佳性能,我们需要利用多处理并将对象跟踪器分布在处理器的多个内核上. 正确利用多处理使我们能够将 dlib 多对象跟踪每秒帧数 (FPS) 提高 45% 以上! 1.使用 dlib 进行多目标跟踪

  • Python OpenCV实现图像模板匹配详解

    目录 1.什么是模板匹配及模板匹配方法matchTemplate() 介绍 素材准备 2.单模板匹配 2.1 单目标匹配 2.2 多目标匹配 3.多模板匹配 1.什么是模板匹配及模板匹配方法matchTemplate() 介绍 提供一个模板图像,一个目标图像,且满足模板图像是目标图像的一部分,从目标图像中寻找特定的模板图像的过程,即为模板匹配.OpenCV提供了matchTemplate()方法帮助我们实现模板匹配. 该方法语法如下: cv2.matchTemplate(image, templ

  • Python OpenCV之常用滤波器使用详解

    目录 1. 滤波器 1.1 什么是滤波器 1.2 关于滤波核 1.3 素材选择 2.均值滤波器 cv2.blur() 2.1 语法简介 2.2 代码示例 3. 中值滤波器 cv2.medianBlur() 代码示例 4. 高斯滤波器 cv2.GaussianBlur() 5. 双边滤波器 cv2.bilateralFilter() 1. 滤波器 1.1 什么是滤波器 滤波器是对图像做平滑处理 的一种常用工具. 平滑处理即在尽可能地保留原图像信息的情况下,对像素值进行微调,使邻近的像素值之间,值的

  • Python OpenCV实现图形检测示例详解

    目录 1. 轮廓识别与描绘 1.1 cv2.findComtours()方法 1.2 cv2.drawContours() 方法 1.3 代码示例 2. 轮廓拟合 2.1 矩形包围框拟合 - cv2.boundingRect() 2.2圆形包围框拟合 - cv2.minEnclosingCircle() 3. 凸包 绘制 4. Canny边缘检测 - cv2.Canny() 4.1 cv2.Canny() 用法简介 4.2 代码示例 5. 霍夫变换 5.1 概述 5.2 cv2.HoughLin

  • Python+OpenCV实现图像识别替换功能详解

    OpenCV-Python是一个Python库,旨在解决计算机视觉问题. OpenCV是一个开源的计算机视觉库,1999年由英特尔的Gary Bradski启动.Bradski在访学过程中注意到,在很多优秀大学的实验室中,都有非常完备的内部公开的计算机视觉接口.这些接口从一届学生传到另一届学生,对于刚入门的新人来说,使用这些接口比重复造轮子方便多了.这些接口可以让他们在之前的基础上更有效地开展工作.OpenCV正是基于为计算机视觉提供通用接口这一目标而被策划的. 安装opencv pip3 in

  • Python+OpenCV读写视频的方法详解

    目录 读视频,提取帧 接口函数:cv2.VideoCapture() 获取视频信息 使用set(cv2.CAP_PROP_POS_FRAMES)读取指定帧 读取函数(重点) 将图像写为视频 示例 fourcc 读视频,提取帧 接口函数:cv2.VideoCapture() 通过video_capture = cv2.VideoCapture(video_path)可以获取读取视频的句柄.而后再通过flag, frame = video_capture.read()可以读取当前帧,flag表示读取

随机推荐