You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:06:13