在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