current position:Home>Python artificial intelligence example │ face tracking using optical flow method (with code)

Python artificial intelligence example │ face tracking using optical flow method (with code)

2022-09-09 06:49:25Red Panda Aicha Rice

嗨害大家好鸭!我是小熊猫

Today I am going to bring you an article on face tracking using optical flow method!

感兴趣的可以往下滑了

请添加图片描述

一、背景知识

1. 光流法

目前,光流(optical flow)法It is one of the important methods of moving image analysis,

它是由James J. Gibson于20世纪40年代首先提出的.

它是像素的运动瞬时速度,

即空间中的运动物体在观察平面上的像素运动的瞬时速度.

光流利用图像序列中像素在时间域上的变化与相邻帧之间的相关性,

找到当前帧跟上一帧之间存在的对应关系,

从而计算出相邻帧之间的物体运动信息.

在计算机视觉中,Lucas–Kanade算法是一种两帧差分的光流估计算法,

它是由Bruce D. Lucas和Takeo Kanade提出的.

这个算法是目前最常见、最流行的.

它计算两帧在时间在t~t + δt每个像素位置的移动.

由于它基于图像信号的泰勒级数,这种方法称为差分,

也就是对空间和时间坐标使用偏导数.

Lucas-Kanade算法广泛用于图像对齐、光流法、目标追踪、图像拼接和人脸检测等课题中.

请添加图片描述
请添加图片描述

2. 角点检测

角点检测(corner detection)是计算机视觉系统中用来获得图像特征的一种方法,也称为特征点检测.

常用的角点检测算法有Harris和Shi-Tomasi,

本例中用的就是Shi-Tomasi角点检测算法.

角点通常被定义为两条边的交点.

例如,三角形有三个角,矩形有四个角,这些点就是角点,也叫作矩形、三角形的特征.

上面所说的是严格意义上的角点,

但是从广义来说,角点指的是拥有特定特征的图像点,

这些特征点在图像中有具体的坐标,

并具有某些数学特征(比如局部最大或最小的灰度).

请添加图片描述
请添加图片描述

二、实现代码

Python实现代码如下所示

(代码中的视频文件face.mp4提供下载):

import cv2
import numpy as np
 
feature_params = dict(maxCorners=100, qualityLevel=0.3,
                      minDistance=7, blockSize=7)
lk_params = dict(winSize=(15,15), maxLevel=2,
                 criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
 
cap = cv2.VideoCapture('face.mp4')
_, frame = cap.read()
scaling_factor = 0.5
frame = cv2.resize(frame, None, fx=scaling_factor,
                   fy=scaling_factor, interpolation=cv2.INTER_AREA)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(gray, mask=None, **feature_params)
 
mask = np.zeros_like(frame)
 
while True:
    _, frame = cap.read()
    frame = cv2.resize(frame, None, fx=scaling_factor,
                       fy=scaling_factor, interpolation=cv2.INTER_AREA)
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    p1, st, err = cv2.calcOpticalFlowPyrLK(gray, frame_gray, p0, None, **lk_params)
 
    good_new = p1[st == 1]
    good_old = p0[st == 1]
 
    for i,(new,old) in enumerate(zip(good_new,good_old)):
        a,b = new.ravel()
        c,d = old.ravel()
        cv2.line(mask, (a, b),(c, d),(0, 150, 0), 1)
        cv2.circle(frame, (a, b), 3, (0, 255, 0), -1)
 
    gray = frame_gray.copy()
    p0 = good_new.reshape(-1, 1, 2)
 
    img = cv2.add(frame, mask)
    cv2.imshow("Output", img)
 
    k = cv2.waitKey(30)
    if k == 27:
        break
 
cap.release()
cv2.destroyAllWindows()

请添加图片描述

三、运行结果

运行以上代码的输出结果如图所示.

请添加图片描述
请添加图片描述

四、代码分析

在本程序中,首先设置了角点(特征点)检测的参数,

如最大角点、质量等级、最小距离和区块大小,

这些用来计算良好的特征以便进行跟踪.

接着设置光流场的参数,如窗口大小、最大等级和终止标准,

其中最大等级为使用图像金字塔(图像金字塔是以多个分辨率表示图像的一种有效且简单的概念,它是分辨率逐层降低的、以金字塔形状排列的、图像集合)的层数.

其次加载视频,获取到视频的第一帧,调整第一帧的大小并转换为灰度图.goodFeaturesToTrack()函数是寻找好的角点.

接着创建一个掩膜mask,以便后面绘制角点的光流轨迹.

在循环中使用方法calcOpticalFlowPyrLK()计算光流,

该方法通过金字塔光流方法Lucas-Kanade计算特征集的光流,获取角点的新位置.

接着选取好的角点,筛选出旧的角点对应的新角点,并且绘制角点的轨迹.

最后,更新当前帧和当前角点的位置,并显示输出到屏幕.copy()函数创建当前帧的一个副本,cv2中的add()方法将两幅图片进行叠加.

在程序的输出中,可以在屏幕上看到显示的角点,并且随着画面的移动,角点也会随之移动.

想领取更多完整源码跟Python学习资料可点击这行字体

请添加图片描述

copyright notice
author[Red Panda Aicha Rice],Please bring the original link to reprint, thank you.
https://en.pythonmana.com/2022/252/202209090636298223.html

Random recommended