from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import os
import time
import argparse
import cv2
import numpy as np
from glob import glob
import sys
sys.path.append(os.getcwd())
from core.config import cfg
from models.rknnlite_rk3588_tracker import NnoTracker_RKNNLite
drawing = False
ix, iy = -1, -1
roi = None
tracking = False
paused = False
frame = None
tracker = None
def draw_rectangle(event, x, y, flags, param):
global ix, iy, drawing, roi, tracking, paused, frame
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
roi = None
paused = True
elif event == cv2.EVENT_MOUSEMOVE:
if drawing and paused and frame is not None:
temp_frame = frame.copy()
cv2.rectangle(temp_frame, (ix, iy), (x, y), (0, 255, 0), 2)
cv2.imshow('Tracking', temp_frame)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if abs(x - ix) > 10 and abs(y - iy) > 10 and frame is not None:
roi = [min(ix, x), min(iy, y), abs(x - ix), abs(y - iy)]
global tracker
Tback_weight = './weights/track_backbone_T.rknn'
Xback_weight = './weights/track_backbone_X.rknn'
Head_weight = './weights/head.rknn'
tracker = NnoTracker_RKNNLite(Tback_weight, Xback_weight, Head_weight)
tracker.init(frame, roi)
tracking = True
print(f"初始化跟踪,ROI: {roi}")
paused = False
elif event == cv2.EVENT_RBUTTONDOWN:
tracking = False
roi = None
print("已取消跟踪")
def main():
global drawing, ix, iy, roi, tracking, paused, frame, tracker
parser = argparse.ArgumentParser(description='tracking demo')
parser.add_argument('--config', default='./models/config/config.yaml', type=str, help='config file')
parser.add_argument('--save', action='store_true', help='whether visualzie result')
args = parser.parse_args()
cfg.merge_from_file(args.config)
video_path = '/home/orangepi/Desktop/track1.mp4'
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print(f"无法打开视频文件: {video_path}")
return
cv2.namedWindow('Tracking')
cv2.setMouseCallback('Tracking', draw_rectangle)
ret, img_src = cap.read()
if ret:
frame = cv2.resize(img_src, (1280, 720))
else:
print("无法读取视频帧")
return
while cap.isOpened():
if not paused and ret:
ret, img_src = cap.read()
if ret:
frame = cv2.resize(img_src, (1280, 720))
if not ret:
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
ret, img_src = cap.read()
display_frame = frame.copy()
if tracking:
t1 = time.time()
outputs = tracker.track(frame)
fps = 1. / (time.time() - t1)
cv2.putText(display_frame, f"FPS: {fps:.2f}", (10, 150),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
if 'bbox' in outputs:
bbox = list(map(int, outputs['bbox']))
cv2.rectangle(display_frame, (bbox[0], bbox[1]),
(bbox[0] + bbox[2], bbox[1] + bbox[3]),
(0, 255, 0), 3)
else:
cv2.putText(display_frame, "Tracking Failed!", (10, 90),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
tracking = False
else:
cv2.putText(display_frame, "No Tracking", (10, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow('Tracking', display_frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord(' '):
paused = not paused
print("暂停" if paused else "继续")
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()