1

I have a ready code in my hand, but it doesn't work because it was written in an old version of OpenCV. I looked at the OpenCV documentation and searched the internet, but I couldn't find it. I need all object tracking techniques to make a comparison. Error I received: AttributeError: module 'cv2' has no attribute 'TrackerCSRT_create'

import cv2
import numpy as np
import matplotlib.pyplot as plt
import time
import pandas as pd

# "The error is originating from here."
OPENCV_OBJECT_TRACKERS = {"csrt"      : cv2.TrackerCSRT_create,
                          "kcf"       : cv2.TrackerKCF_create,
                          "boosting"  : cv2.TrackerBoosting_create,
                          "mil"       : cv2.TrackerMIL_create,
                          "tld"       : cv2.TrackerTLD_create,
                          "medianflow": cv2.TrackerMedianFlow_create,
                          "mosse"     : cv2.TrackerMOSSE_create}

tracker_name = "mil"
tracker = OPENCV_OBJECT_TRACKERS[tracker_name]()
print("Tracker:", tracker_name)

gt = pd.read_csv("gt_new.txt")

video_path = "MOT17-13-SDP.mp4"
cap = cv2.VideoCapture(video_path)

# genel parametreler
initBB = None
fps = 25
frame_number = []
f = 0
success_track_frame_success = 0
track_list = []
start_time = time.time() 

while True:
    
    time.sleep(0.01)
    
    ret, frame = cap.read()
    
    if ret:
        
        frame = cv2.resize(frame, dsize = (960,540))
        (H, W) = frame.shape[:2]
        
        # gt
        car_gt = gt[gt.frame_no == f]
        if len(car_gt) != 0:
            x = car_gt.x.values[0]
            y = car_gt.y.values[0]
            w = car_gt.w.values[0]
            h = car_gt.h.values[0]
            
            center_x = car_gt.center_x.values[0]
            center_y = car_gt.center_y.values[0]
            
            cv2.rectangle(frame, (x,y), (x+w, y+h),(0,255,0),2)
            cv2.circle(frame, (center_x, center_y), 2,(0,0,255),-1)
            
        # box
        if initBB is not None:
            
            (success, box) = tracker.update(frame)
            
            if f<=np.max(gt.frame_no):
                (x,y,w,h) = [int(i) for i in box]
                
                cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2)
                success_track_frame_success = success_track_frame_success + 1
                track_center_x = int(x+w/2)
                track_center_y = int(y+h/2)
                track_list.append([f,track_center_x,track_center_y])
            
            info = [("Tracker",tracker_name),
                    ("Success", "Yes" if success else "No")]
            
            for (i,(o,p)) in enumerate(info):
                text = "{}: {} ".format(o,p)
                cv2.putText(frame, text, (10, H -(i*20)-10), cv2.FONT_HERSHEY_SIMPLEX,0.6, (0,0,255),2)
            
        cv2.putText(frame,"Frame Num: "+str(f), (10,30),cv2.FONT_HERSHEY_SIMPLEX,1, (0,0,255),2)
        cv2.imshow("frame",frame)    
        # key
        key = cv2.waitKey(1) & 0xFF
           
        if key == ord("t"):
            initBB = cv2.selectROI("Frame", frame, fromCenter = False)
            
            tracker.init(frame, initBB)
            
        elif key == ord("q"):break
        
        
        # frame
        frame_number.append(f)
        f = f + 1 
        
    else: break
    
cap.release()
cv2.destroyAllWindows()            
            
stop_time = time.time()
time_diff = stop_time - start_time          
# degerlendirme

track_df = pd.DataFrame(track_list, columns =["frame_no","center_x","center_y"])

if len(track_df) != 0:
    print("Tracking method: ",tracker)
    print("Time: ",time_diff)
    print("Number of frame to track (gt): ",len(gt))
    print("Number of frame to track (track success): ",success_track_frame_success)
    
    track_df_frame = track_df.frame_no
    
    gt_center_x = gt.center_x[track_df_frame].values
    gt_center_y = gt.center_y[track_df_frame].values
    
    track_df_center_x = track_df.center_x.values
    track_df_center_y = track_df.center_y.values
    
    plt.plot(np.sqrt((gt_center_x-track_df_center_x)**2 + (gt_center_y-track_df_center_y)**2 ))
    plt.xlabel("frame")
    plt.ylabel("Öklid mesafesi btw gt ve track")
    error = np.sum(np.sqrt((gt_center_x-track_df_center_x)**2 + (gt_center_y-track_df_center_y)**2 ))
    print("Toplam hata: ",error)
Eren Yanic
  • 23
  • 3
  • The trackers have been [moved to the legacy module](https://docs.opencv.org/4.7.0/dc/d6b/group__tracking__legacy.html), use the `cv2.legacy_TRACKERNAME` namespace to get access to them. – stateMachine Mar 10 '23 at 23:14
  • I am getting this error this time: AttributeError: module 'cv2' has no attribute 'legacy'. I have checked my Opencv version both from Anaconda prompt and console, and I am sure that the version is 4.7.0 I tried the following code: OPENCV_OBJECT_TRACKERS = {"csrt" : cv2.legacy.TrackerCSRT_create, "kcf" : cv2.legacy.TrackerKCF_create, – Eren Yanic Mar 11 '23 at 15:32
  • Did you figure this out? I am using the same code from pyimagesearch.com and I am missing the object trackers. – Logan Price Jul 24 '23 at 15:04

0 Answers0