Ultralytics YOLOv8视频跟踪遇source缺失及OpenCV断言错误求助
解决YOLOv8跟踪视频时的OpenCV光流断言错误
问题代码
from ultralytics import YOLO import cv2 model = YOLO('yolov8n.pt') video = './Vine_Golvo.mp4' capture = cv2.VideoCapture(video) condition = True # read frames while condition: condition, frame = capture.read() # condition is updated to true or false, depending on wether or not # a frame was succesfully retrieved (will be false after the last frame of the video) # frame saves the data of the current frame # track objects results = model.track(frame, persist=True) # plot results frame_ = results[0].plot() # visualize cv2.imshow('Paul', frame_) if cv2.waitKey(25) & 0xFF == ord('q'): # the second thing says that we close the program when you press 'q' break
错误信息
C:\Users\Costin\Desktop\Virtualenvs\yolov8\Scripts\python.exe "C:\Users\Costin\Desktop\Programare\Materiale limbaje de programare\Python\Image recognition\Icyu\main.py" WARNING ⚠️ 'source' is missing. Using 'source=C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\assets'. image 1/2 C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\assets\bus.jpg: 640x480 3 persons, 1 bus, 63.0ms Traceback (most recent call last): File "C:\Users\Costin\Desktop\Programare\Materiale limbaje de programare\Python\Image recognition\Icyu\main.py", line 18, in <module> results = model.track(frame, persist=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\engine\model.py", line 481, in track return self.predict(source=source, stream=stream, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\engine\model.py", line 441, in predict return self.predictor.predict_cli(source=source) if is_cli else self.predictor(source=source, stream=stream) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\engine\predictor.py", line 168, in __call__ return list(self.stream_inference(source, model, *args, **kwargs)) # merge list of Result into one ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\torch\utils_contextlib.py", line 56, in generator_context response = gen.send(request) ^^^^^^^^^^^^^^^^^ File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\engine\predictor.py", line 256, in stream_inference self.run_callbacks("on_predict_postprocess_end") File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\engine\predictor.py", line 393, in run_callbacks callback(self) File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\trackers\track.py", line 69, in on_predict_postprocess_end tracks = tracker.update(det, im0s[i]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\trackers\byte_tracker.py", line 293, in update warp = self.gmc.apply(img, dets) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\trackers\utils\gmc.py", line 102, in apply return self.applySparseOptFlow(raw_frame) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Costin\Desktop\Virtualenvs\yolov8\Lib\site-packages\ultralytics\trackers\utils\gmc.py", line 329, in applySparseOptFlow matchedKeypoints, status, _ = cv2.calcOpticalFlowPyrLK(self.prevFrame, frame, self.prevKeyPoints, None) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cv2.error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\video\src\lkpyramid.cpp:1394: error: (-215:Assertion failed) prevPyr[level * lvlStep1].size() == nextPyr[level * lvlStep2].size() in function 'cv::`anonymous-namespace'::SparsePyrLKOpticalFlowImpl::calc' Process finished with exit code 1
解决方案
1. 过滤空帧
视频读取到最后一帧时,condition会变为False,但此时frame已为空值,仍会进入循环处理导致光流计算出错。修改循环逻辑:
while condition: condition, frame = capture.read() # 新增:如果frame为空,直接跳出循环 if not condition or frame is None: break results = model.track(frame, persist=True) frame_ = results[0].plot() cv2.imshow('Paul', frame_) if cv2.waitKey(25) & 0xFF == ord('q'): break # 最后记得释放资源 capture.release() cv2.destroyAllWindows()
2. 禁用全局运动补偿(GMC)
错误来自YOLOv8跟踪器的GMC模块,禁用它可绕过光流计算的问题:
# 修改track调用,添加tracker_args参数 results = model.track(frame, persist=True, tracker_args={"gmc": False})
3. 降级OpenCV版本
OpenCV 4.9.0存在光流计算的兼容性bug,降级到4.8.x版本即可解决:
pip install opencv-python==4.8.1.78
内容的提问来源于stack exchange,提问作者Costi2m
相关产品推荐
相关产品推荐

