|
|
|
|
import argparse
|
|
|
|
|
import cv2
|
|
|
|
|
import numpy as np
|
|
|
|
|
import cv2.legacy
|
|
|
|
|
|
|
|
|
|
ap = argparse.ArgumentParser()
|
|
|
|
|
ap.add_argument("-v", "--video", type=str,
|
|
|
|
|
help="path to input video file")
|
|
|
|
|
ap.add_argument("-t", "--tracker", type=str, default="kcf",
|
|
|
|
|
help="OpenCV object tracker type")
|
|
|
|
|
args = vars(ap.parse_args())
|
|
|
|
|
|
|
|
|
|
OPENCV_OBJECT_TRACKERS = {
|
|
|
|
|
"csrt": cv2.legacy.TrackerCSRT_create,
|
|
|
|
|
"kcf": cv2.TrackerKCF_create,
|
|
|
|
|
"boosting": cv2.legacy.TrackerBoosting_create,
|
|
|
|
|
"mil": cv2.TrackerMIL_create,
|
|
|
|
|
"tld": cv2.legacy.TrackerTLD_create,
|
|
|
|
|
"medianflow": cv2.legacy.TrackerMedianFlow_create,
|
|
|
|
|
"mosse": cv2.legacy.TrackerMOSSE_create
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 实例化OpenCV's multi-object tracker
|
|
|
|
|
trackers = cv2.legacy.MultiTracker_create()
|
|
|
|
|
vs = cv2.VideoCapture(args["video"])
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
frame = vs.read()
|
|
|
|
|
frame = frame[1]
|
|
|
|
|
if frame is None:
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
# resize每一帧
|
|
|
|
|
(h, w) = frame.shape[:2]
|
|
|
|
|
width=600
|
|
|
|
|
r = width / float(w)
|
|
|
|
|
dim = (width, int(h * r))
|
|
|
|
|
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
|
|
|
|
|
|
|
|
|
|
# 追踪结果
|
|
|
|
|
(success, boxes) = trackers.update(frame)
|
|
|
|
|
|
|
|
|
|
# 绘制区域
|
|
|
|
|
for box in boxes:
|
|
|
|
|
(x, y, w, h) = [int(v) for v in box]
|
|
|
|
|
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
|
|
|
|
|
|
|
|
|
|
# 显示
|
|
|
|
|
cv2.imshow("Frame", frame)
|
|
|
|
|
key = cv2.waitKey(100) & 0xFF
|
|
|
|
|
|
|
|
|
|
if key == ord("s"):
|
|
|
|
|
# 选择一个区域,按s
|
|
|
|
|
box = cv2.selectROI("Frame", frame, fromCenter=False,
|
|
|
|
|
showCrosshair=True)
|
|
|
|
|
|
|
|
|
|
# 创建一个新的追踪器
|
|
|
|
|
tracker = OPENCV_OBJECT_TRACKERS[args["tracker"]]()
|
|
|
|
|
trackers.add(tracker, frame, box)
|
|
|
|
|
|
|
|
|
|
# 退出
|
|
|
|
|
elif key == 27:
|
|
|
|
|
break
|
|
|
|
|
vs.release()
|
|
|
|
|
cv2.destroyAllWindows()
|