OpenCV AttributeError module 'cv2.cv2' has no attribute 'Tracker_create'

I have tried to run this code but get an Attribute Error. Any help would be greatly appreciated.

 import cv2 import sys (major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.') if __name__ == '__main__': # Set up tracker. # Instead of MIL, you can also use tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'CSRT', 'MOSSE'] tracker_type = tracker_types[5] if int(minor_ver) < 3: tracker = cv2.cv2.Tracker_create(tracker_type) else: if tracker_type == 'BOOSTING': tracker = cv2.TrackerBoosting_create() if tracker_type == 'MIL': tracker = cv2.TrackerMIL_create() if tracker_type == 'KCF': tracker = cv2.TrackerKCF_create() if tracker_type == 'TLD': tracker = cv2.TrackerTLD_create() if tracker_type == 'MEDIANFLOW': tracker = cv2.TrackerMedianFlow_create() if tracker_type == 'CSRT': tracker = cv2.TrackerCSRT_create() if tracker_type == 'MOSSE': tracker = cv2.TrackerMOSSE_create() # Read video video = cv2.VideoCapture("./videos/chaplin.mp4") # Exit if video not opened. if not video.isOpened(): print("Could not open video") sys.exit() # Read first frame. ok, frame = video.read() if not ok: print('Cannot read video file') sys.exit() # Define an initial bounding box bbox = (287, 23, 86, 320) # Uncomment the line below to select a different bounding box bbox = cv2.selectROI(frame, False) # Initialize tracker with first frame and bounding box ok = tracker.init(frame, bbox) while True: # Read a new frame ok, frame = video.read() if not ok: break # Start timer timer = cv2.getTickCount() # Update tracker ok, bbox = tracker.update(frame) # Calculate Frames per second (FPS) fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer); # Draw bounding box if ok: # Tracking success p1 = (int(bbox[0]), int(bbox[1])) p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3])) cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1) else : # Tracking failure cv2.putText(frame, "Tracking failure detected", (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2) # Display tracker type on frame cv2.putText(frame, tracker_type + " Tracker", (100,20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50),2); # Display FPS on frame cv2.putText(frame, "FPS : " + str(int(fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2); # Display result cv2.imshow("Tracking", frame) # Exit if ESC pressed k = cv2.waitKey(1) & 0xff if k == 27 : break

Output:

Traceback (most recent call last): File "C:\Users\Jatin\OpenCV-Object-Tracking\index.py", line 15, in <module> tracker = cv2.cv2.Tracker_create(tracker_type)
AttributeError: module 'cv2.cv2' has no attribute 'Tracker_create'
3

6 Answers

It depends on which packages of OpenCV and the version you have installed.

I believe you need OpenCV 3.4+ to run those models. Some tracker models are available in 3.2, and 3.3. All trackers in your script are available in 3.4

OpenCV packages:opencv-python: This repository contains the main modules of the OpenCV library.

opencv-contrib-python: The opencv-contrib-python repository contains both the main modules along with the contrib modules

python -m pip install opencv-contrib-python, check to see if you have 3.4+, with pip show opencv .

See how to install opencv for more details

Updates

As @user48956 pointed out opencv v 4.5.x has moved some of these algorithms to cv2.legacy. For example, to access TrackerMOSSE_create function. You would have to get it fromcv2.legacy.TrackerMOSSE_create.

I would recommend keeping up with opencv GitHub as some functions/algorithms will likely move around or be deleted.

5

If you are using OpenCV 4 or above then the above code may not work.

if int(minor_ver) < 3: line breaks for OpenCV 4

You need to install just opencv contrib for this experiment

My Virtual Env contains

pip install -r requirements.txt

requirements.txt
dlib==19.19.0
imutils==0.5.3
numpy==1.18.4
opencv-contrib-python==4.2.0.34
scipy==1.4.1

modified code, compatible with OpenCV 4 version

tracker.py
import cv2
import sys
(major_ver, minor_ver, subminor_ver) = (cv2.__version__).split('.')
print(cv2.__version__)
if __name__ == '__main__': # Set up tracker. # Instead of MIL, you can also use tracker_types = ['BOOSTING', 'MIL','KCF', 'TLD', 'MEDIANFLOW', 'CSRT', 'MOSSE'] tracker_type = tracker_types[6] if int(major_ver) < 4 and int(minor_ver) < 3: tracker = cv2.cv2.Tracker_create(tracker_type) else: if tracker_type == 'BOOSTING': tracker = cv2.TrackerBoosting_create() if tracker_type == 'MIL': tracker = cv2.TrackerMIL_create() if tracker_type == 'KCF': tracker = cv2.TrackerKCF_create() if tracker_type == 'TLD': tracker = cv2.TrackerTLD_create() if tracker_type == 'MEDIANFLOW': tracker = cv2.TrackerMedianFlow_create() if tracker_type == 'CSRT': tracker = cv2.TrackerCSRT_create() if tracker_type == 'MOSSE': tracker = cv2.TrackerMOSSE_create() # Read video video = cv2.VideoCapture(0) # Exit if video not opened. if not video.isOpened(): print("Could not open video") sys.exit() # Read first frame. ok, frame = video.read() if not ok: print('Cannot read video file') sys.exit() # Define an initial bounding box bbox = (287, 23, 86, 320) # Uncomment the line below to select a different bounding box bbox = cv2.selectROI(frame, False) # Initialize tracker with first frame and bounding box ok = tracker.init(frame, bbox) while True: # Read a new frame ok, frame = video.read() if not ok: break # Start timer timer = cv2.getTickCount() # Update tracker ok, bbox = tracker.update(frame) # Calculate Frames per second (FPS) fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer); # Draw bounding box if ok: # Tracking success p1 = (int(bbox[0]), int(bbox[1])) p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3])) cv2.rectangle(frame, p1, p2, (255,0,0), 2, 1) else : # Tracking failure cv2.putText(frame, "Tracking failure detected", (100,80), cv2.FONT_HERSHEY_SIMPLEX, 0.75,(0,0,255),2) # Display tracker type on frame cv2.putText(frame, tracker_type + " Tracker", (100,20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50),2); # Display FPS on frame cv2.putText(frame, "FPS : " + str(int(fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2); # Display result cv2.imshow("Tracking", frame) # Exit if ESC pressed k = cv2.waitKey(1) & 0xff if k == 27 : break
2

For at least for:

  • opencv-contrib-python==4.5.2.52

you need to replace:

cv2.TrackerMOSSE_create()

with...

cv2.legacy.TrackerMOSSE_create()

I was getting an error with:tracker = cv2.TrackerMOSSE.create()

even thought I had already installed: opencv-contrib-python

I was able to fix the error by using this instead:tracker = cv2.legacy_TrackerMOSSE.create()

My version of Python is 3.7, which doesn't seem to ignore the code below.

if int(minor_ver) < 3: tracker = cv2.cv2.Tracker_create(tracker_type)

I simply deleted it and the module runs.


An unrelated but hopefully helpful suggestion. At the end of the code above, I added a `destroyAllWindows() command, which cleans up the viewer:

 if k == 27: cv2.destroyAllWindows() break
3

Just install the following.

pip install opencv-contrib-python

here by using csrt tracker.

import cv2
cap = cv2.VideoCapture("video_path")
tracker = cv2.TrackerCSRT_create()
ret, frame = cap.read()
bbox = cv2.selectROI(frame, False)
tracker.init(frame, bbox)
while True: frame_id = 0 ret, frame = cap.read() success, bbox = tracker.update(frame) if success: x, y, w, h = [int(i) for i in bbox] cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) cv2.imshow("Tracking", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break
cap.release()
cv2.destroyAllWindows()

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like