OpenCV AttributeError module 'cv2.cv2' has no attribute 'Tracker_create'
Solution 1
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.
Solution 2
If you are using OpenCV 4 or above then the above code may not work.
if int(minor_ver) < 3:
line breaks for OpenCV 4You need to install just opencv contrib for this experiment
My Virtual Env contains
pip install -r 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.pyimport 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
Solution 3
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()
Solution 4
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
Solution 5
For at least for:
- opencv-contrib-python==4.5.2.52
you need to replace:
cv2.TrackerMOSSE_create()
with...
cv2.legacy.TrackerMOSSE_create()
Jatin Rao
Updated on November 15, 2021Comments
-
Jatin Rao over 2 years
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 tracker = cv2.cv2.Tracker_create(tracker_type) AttributeError: module 'cv2.cv2' has no attribute 'Tracker_create'
-
24dinitrophenylhydrazine about 3 yearsFor some reason, the latest opencv-contrib-python version (4.5.1.48) at the time of writing did not work for me. But the version (4.2.0.34) used here works, thanks.
-
Burak about 3 yearsI think you are using IDLE. At the end of the program, the window is closed automatically. IDLE is still interactive after reaching the end of the script.
-
mherzog about 3 yearsI was using Spyder. Is that similar to IDLE in this regard?
-
Burak about 3 yearsI tested with Jupyter Notebook. They all are the same in the sense that
python
still keeps running. Yours is a good advise, I just wanted to note the reason behind. -
user48956 almost 3 yearsSame here: opencv-python==4.5.2.52, opencv-python==4.5.2.52 ... --> cv2.TrackerMOSSE_create is missing
-
user48956 almost 3 yearsAt least for: opencv-python==4.5.2.52, opencv-python==4.5.2.52 ... --> cv2.TrackerMOSSE_create is missing
-
Prayson W. Daniel almost 3 yearsHave you tried
pip install opencv-contrib-python
? Thecontrib
has more features. I have not check4.5.X
yet. -
user48956 almost 3 yearsYes, and with the same version. It is moved to cv2.legacy for some reason I reason. I added a new answer.
-
Prayson W. Daniel almost 3 yearsShould we not update this answer to include that?
-
titusfx about 2 yearsIn openCV 4.5.5 doesn't exist, cv2.legacy, exist some Trackers but not others like CSRT doesn't show up but DaSiamRPN is available