OpenCV (Open Source Computer Vision Library) 是一个跨平台的计算机视觉库,由 Intel 公司发起并参与卡法,以 BSD 许可证授权发行,可以在商业和研究领域中免费使用。OpenCV 可用于开发实时的图像处理、计算机视觉以及模式识别程序。本篇介绍如何使用 OpenCV 实现视觉单目标跟踪。使用的版本信息为:opencv-contrib-python 采用 4.5.4.60, python 采用 3.9.5.

编写代码

创建 python 文件:main.py,添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : Jinzhong Xu
# @Contact : jinzhongxu@csu.ac.cn
# @Time : 2022/3/11 10:33
# @File : main.py
# @Software: PyCharm
import argparse

import cv2 as cv
from imutils.video import FPS

OPENCV_OBJECT_TRACKERS = {
"csrt": cv.TrackerCSRT_create,
"kcf": cv.TrackerKCF_create,
# "dasiamrpn": cv.TrackerDaSiamRPN_create,
"mil": cv.TrackerMIL_create,
}


def tracking(video_path=None, tracker_name="kcf"):
if video_path is None: # 如果没有输入视频,则使用本地摄像头
video_path = 0
tracker = OPENCV_OBJECT_TRACKERS[tracker_name]() # 获取OpenCV跟踪算法
initBB = None
fps = None
window_name = "real-time"
cap = cv.VideoCapture(video_path)
is_open = cap.isOpened()
# print("正确打开摄像头:", is_open)
# print("宽:", cap.get(cv.CAP_PROP_FRAME_WIDTH))
# print("高:", cap.get(cv.CAP_PROP_FRAME_HEIGHT))
# print("通道:", cap.get(cv.CAP_PROP_CHANNEL))
# print("帧率:", cap.get(cv.CAP_PROP_FPS))
# 设置摄像头分辨率
# cap.set(3, 2560) # 宽
# cap.set(4, 1440) # 高
while is_open: # 当视频正确打开
# read返回:return_value 表示是否正确获取当前帧,frame 表示获取的当前帧图像
return_value, frame = cap.read()
H, W = frame.shape[:2]
if initBB is not None:
success, box = tracker.update(frame)
# if not success:
# tracker = cv.TrackerCSRT_create()
# tracker.init(frame, initBB)
if success:
x, y, w, h = [int(v) for v in box]
cv.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
fps.update()
fps.stop()
info = [('Tracker', tracker_name), ('Success', "Yes" if success else 'No'),
("FPS", "{:.2f}".format(fps.fps()))]

for i, (k, v) in enumerate(info):
text = "{}: {}".format(k, v)
cv.putText(frame, text, (10, H - ((i * 20) + 20)), cv.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)

if return_value:
# 设置自动使用窗口大小
cv.namedWindow(window_name, cv.WINDOW_NORMAL)
cv.imshow(window_name, frame)

k = cv.waitKey(1) & 0xff
if k == ord('s'): # 按键盘的 s 键,在视频上选择目标矩形框
initBB = cv.selectROI(window_name, frame, fromCenter=False, showCrosshair=True)
tracker.init(frame, initBB)
fps = FPS().start()
elif k == ord('q'): # 按键盘的 q 键,退出视频
# print(frame.shape)
break

cap.release()
cv.destroyAllWindows()


if __name__ == '__main__':
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", type=str, default=None, help="path to input video file")
ap.add_argument("-t", "--tracker", type=str, default='kcf', help="OpenCV object tracker name")
args = vars(ap.parse_args())
# print(args)

tracking(args["video"], args["tracker"])

运行跟踪程序

启动跟踪程序方法如下:

1
2
3
4
5
# 使用本地摄像头
python main.py -t "kcf"

# 使用本地视频文件 a.mp4
python main.py -v a.mp4 -t "kcf"

注意,当视频打开后,按一下键盘的 s 键,可以在视频页码上选择矩形框,包围想要跟踪的目标对象,然后按下 Space 键进行跟踪。当想要退出视频时,按一下键盘的 q 键即可。

参考文献

  1. OpenCV-Research-Benchmarking