OpenCV 4.5.1中使用legacy_MultiTracker实现多目标追踪时出现TypeError错误的求助
解决OpenCV 4.5.1中legacy_MultiTracker添加追踪器的TypeError问题
这个错误的核心原因很明确:你使用的是legacy模块的MultiTracker,但添加的却是普通版本的追踪器,两者的类型不兼容。
在OpenCV 4.x版本中,很多旧版的追踪器API被迁移到了legacy子模块下,cv2.legacy_MultiTracker.create()创建的多追踪器,要求传入的追踪器必须是cv::legacy::Tracker类型的实例,而你用的cv2.TrackerKCF()属于非legacy版本的追踪器,自然会触发类型不匹配的错误。
解决方案
把普通版本的追踪器替换为legacy模块下对应的追踪器即可。对于KCF追踪器,你需要使用cv2.legacy.TrackerKCF_create()来创建实例(不同追踪器的命名规则类似,比如CSRT就是cv2.legacy.TrackerCSRT_create())。
修正后的完整代码
import imutils import time import cv2 import numpy as np trackers = cv2.legacy_MultiTracker.create() vs = cv2.VideoCapture('4.mp4') while True: frame = vs.read() if frame is None: break frame = frame[1] (success, boxes) = trackers.update(frame) for box in boxes: (x, y, w, h) = [int(v) for v in box] cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow("Frame", frame) key = cv2.waitKey(1) & 0xFF if key == ord("s"): box = cv2.selectROI("Frame", frame, fromCenter=False, showCrosshair=True) print(box) # 替换为legacy版本的KCF追踪器 tracker = cv2.legacy.TrackerKCF_create() trackers.add(tracker, frame, box) elif key == ord("q"): break vs.release() cv2.destroyAllWindows()
额外注意事项
- OpenCV 4.x中,
MultiTracker_create()被标记为过时,官方推荐使用cv2.legacy_MultiTracker.create()替代,但必须配套使用legacy模块下的追踪器。 - 如果你不确定某个追踪器的legacy版本命名,可以通过
dir(cv2.legacy)查看所有legacy模块下的可用类和方法,找到对应的追踪器创建函数。
内容的提问来源于stack exchange,提问作者Karthiyayini Naga
相关产品推荐
相关产品推荐

