原项目:
https://github.com/inayatkh/tracking-python3
我的环境
python3.6.1
pycharm社区版
opencv-contrib-python3.4.1.15
trackoneobject.py文件看不懂的地方注释一下(几乎每一行o(╥﹏╥)o)。
# import the required packages
from imutils.video import WebcamVideoStream # 从imutils库中导入WebcamVideoStream模块
from imutils.video import VideoStream # 从imutils库中导入VideoStream模块
import numpy as np # 导入numpy库并简写为np
import argparse # 导入argparse库,用于解析命令行参数
import imutils # 导入imutils库
import time # 导入time库
import cv2 # 导入OpenCV库
import dlib # 导入dlib库
from utils.fps2 import FPS2 # 从自定义的utils文件夹中导入fps2模块的FPS2类
if __name__ == '__main__':
# 初始化参数解析器
ap = argparse.ArgumentParser()
# 添加参数 --type,表示选择跟踪器的类型,范围是[0..5],对应['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
ap.add_argument("-t", "--type", required=True, help="input from [0..5] for selection of type of tracker from ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN'] ")
# 解析参数
args = vars(ap.parse_args())
# 打印选择的跟踪器类型
print("[info] tracker selected is ", args["type"])
# 从OpenCV3.2中获取可用的跟踪器类型
trackerTypes = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'GOTURN']
# 获取选择的跟踪器类型
trackerType = trackerTypes[int(args["type"])]
# 用选择的跟踪器类型初始化OpenCV跟踪器,MIL可以修改
trackerOpenCV = cv2.Tracker("MIL")
# 用dlib检测器初始化跟踪器
# 初始化dlib人脸检测器
frontFaceDetector = dlib.get_frontal_face_detector()
# 初始化标记,以便只初始化跟踪器一次
initOnce = False
# 打印信息:开始读取网络摄像头
print("[info] starting to read a video ...")
# 开启网络摄像头
#capWebCam = WebcamVideoStream(0).start()
cap = VideoStream('my_video_file.mp4').start()#前后文用到capWebCam变量的地方也要相应改成
# 等待1秒钟,确保摄像头已启动
time.sleep(3.0)
# 启动FPS计数器
#fps = FPS2().start()
# 循环遍历从网络摄像头获取的每一帧
#这段代码是一个实时人脸追踪器,可以使用不同的追踪器(例如OpenCV的BOOSTING、MIL、KCF、TLD、MEDIANFLOW和CSRT)。
#代码通过从摄像头读取每一帧图像来实时检测人脸,并在检测到人脸时初始化一个追踪器,然后使用该追踪器跟踪人脸。
#如果跟踪成功,则在帧中绘制一个矩形框来标识人脸的位置;否则,显示追踪失败的信息。
#代码使用OpenCV库和dlib库来实现人脸检测和追踪。此外,代码还会显示每秒钟的帧率,并在窗口的标题中显示使用的追踪器类型。
#最后,当用户按下"ESC"键时,程序将停止,并显示运行时间和平均帧率。
while True:
# 从线程流中获取每一帧,将其缩放并转换为灰度图像(同时仍保留3个通道)。
frame1 = cap.read()#从视频流中读取一帧图像,将它存储在变量 frame1 中
frame = cv2.flip(frame1,1)#对读取的图像进行左右镜像翻转,这个操作可以用来调整图像的方向。
#frame = imutils.resize(frame, width=450)#对图像进行缩放,将它的宽度调整为450个像素。这个操作可以用来调整图像的大小。
#frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#缩放后的图像转换为灰度图像
#frame = np.dstack([frame, frame, frame])这个操作可以用来将灰度图像显示为彩色图像,方便观察和处理。np.dstack 函数可以将三个灰度图像数组按照通道的方式合并成一个三通道的彩色图像数组。在这里,由于灰度图像只有一个通道,所以使用三个相同的灰度图像来构造一个三通道的彩色图像。
# 在帧上显示队列的大小。
#cv2.putText(frame, "Queue Size: {}".format(fvs.Q.qsize()),
# (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
#
#这段代码中的 "if not initOnce" 句子意思是如果变量 "initOnce" 的值为 False 或者未被定义,那么条件成立。通常情况下,这个条件用于在程序的第一次运行时执行一些初始化的操作。在第一次执行后,变量 "initOnce" 的值会被设置为 True,以防止重复执行初始化操作。如果 "initOnce" 变量已经被定义并且它的值为 True,那么这个条件不成立,程序就会跳过这个代码块,执行其他的逻辑。
if not initOnce:# 如果初始化完成
faceRect = frontFaceDetector(frame, 0)# 使用人脸检测器检测人脸,并返回人脸位置
if(len(faceRect) == 0):# 如果没有检测到人脸,则跳过
continue
# start the frame per second (FPS) counter
fps = FPS2().start()# 开始计算帧率
bbox = faceRect[0]# 获取检测到的第一个人脸的位置信息
print(bbox)
# convert dlib rect to opencv rect# 将人脸位置信息转换为 OpenCV 格式
curFaceBbox = (int(bbox.left()), int(bbox.top()), int(bbox.right() - bbox.left()),
int(bbox.bottom() - bbox.top()) )
# intialize the Tracker
#curFaceBbox = cv2.selectROI("tracking", frame)
success = trackerOpenCV.init(frame, curFaceBbox)# 初始化跟踪器
initOnce = True# 初始化完成
#continue
#在最后一行添加 continue 语句将跳过当前帧,进入下一次循环,不会执行后面的代码。这会导致初始化跟踪器的代码块被跳过,直接进入下一个循环,继续检测下一帧的人脸。也就是说,跟踪器没有被正确初始化,无法进行跟踪任务。
#因此,如果在最后一行添加 continue 语句,程序可能无法正确初始化跟踪器,导致跟踪失败或不准确。而不添加 continue 语句,则会在当前帧中执行初始化跟踪器的代码块,确保跟踪器被正确初始化,从而实现更好的跟踪效果。
# Update tracker
success, curFaceBbox = trackerOpenCV.update(frame) # 使用跟踪器更新人脸位置信息
print(success, curFaceBbox)
if success:# 如果跟踪成功
# Tracking success
topLeft = (int(curFaceBbox[0]), int(curFaceBbox[1])) # 获取人脸矩形框左上角的坐标
bottomRight = (int(curFaceBbox[0] + curFaceBbox[2]), int(curFaceBbox[1] + curFaceBbox