在opencv中,具备多种目标跟踪算法,这次选用CSRT跟踪,效果还行吧
环境:
Python 3.11.6
numpy 1.26.2 opencv-contrib-python 4.8.1.78 opencv-python 4.8.1.78
opencv新版要使用kcf,csrt等算法,必须安装opencv-contrib-python。而且api也改了,创建tracker需要使用cv2.legacy.TrackerCSRT.create(),否则init报错。
import cv2
obj_detector = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=80)
tracker = cv2.legacy.TrackerCSRT.create()
tracker_init = False
def main():
global tracker_init
cap = cv2.VideoCapture('1.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print("[-]Stream end...")
break
mask = obj_detector.apply(frame)
# #tracker
if tracker_init:
track_stat,bbox = tracker.update(frame)
if track_stat == True:
p1 = (int(bbox[0]), int(bbox[1]))
p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3]))
cv2.rectangle(frame, p1, p2, (0,255,255), 1, 1)
else:
cv2.putText(frame, 'Target lost', (120, 150), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,255,255), 2)
if cv2.waitKey(1) == ord('q'):
break
if cv2.waitKey(1) == ord('s'):
try:
bbox = cv2.selectROI('Select target', frame,fromCenter=False,showCrosshair=True)
tracker.init(frame,bbox)
tracker_init = True
print(bbox)
except BaseException as e:
print(e)
cv2.imshow('Mask', mask)
cv2.imshow('Video', frame)
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
新增:
cv2.TrackerNano ,用神经网络,效果好
bbox = cv2.selectROI('Select target', frame,fromCenter=False,showCrosshair=True)
param = cv2.TrackerNano.Params()
param.backbone = "nanotrack_backbone_sim.onnx"
param.neckhead = "nanotrack_head_sim.onnx"
tracker = cv2.TrackerNano.create(param)
tracker.init(frame,bbox)
tracker_init = True