运行YOLOv5车辆计数代码时遇OpenCV resize断言失败错误求助
解决OpenCV resize函数inv_scale_x > 0断言失败错误
错误原因分析
这个错误的核心触发点有两个:
- 未处理视频帧读取失败的情况:当视频播放到末尾、文件路径错误或文件损坏时,
cap.read()返回的ret为False,此时frame是空值,传入cv2.resize后无法计算有效缩放比例,触发断言失败。 cv2.resize参数格式错误:你使用的cv2.resize(frame, None,(1020,500))不符合函数规范。当第二个参数传None时,需要通过fx和fy参数指定缩放因子,而非直接传入目标尺寸。
修复方案
1. 增加视频读取失败的判断逻辑
获取帧后立即检查ret的值,若为False则终止循环,避免处理空帧。
2. 修正cv2.resize的参数用法
直接将目标尺寸(1020, 500)作为第二个参数传入,这是cv2.resize指定目标尺寸的标准写法。
修改后的完整代码
import cv2 import torch from tracker import * import numpy as np model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) cap = cv2.VideoCapture('C:\\Users\\MSI\\Desktop\\yolov5vehiclecount\\test.mp4') def POINTS(event, x, y, flags, param): if event == cv2.EVENT_MOUSEMOVE : colorsBGR = [x, y] print(colorsBGR) cv2.namedWindow('FRAME') cv2.setMouseCallback('FRAME', POINTS) tracker = Tracker() while True: ret, frame = cap.read() # 处理视频读取完毕或出错的情况 if not ret: break # 修正resize参数,直接传入目标尺寸 frame = cv2.resize(frame, (1020, 500)) results = model(frame) frame = np.squeeze(results.render()) cv2.imshow('FRAME', frame) if cv2.waitKey(1) & 0xFF == 27: break cap.release() cv2.destroyAllWindows() # 确保程序结束时正确关闭窗口
额外说明
- 新增
cv2.destroyAllWindows()是为了在程序结束时释放OpenCV创建的窗口资源,避免残留窗口。 - 若修改后仍出现读取失败的情况,需检查视频文件路径是否正确、文件是否未损坏。
内容的提问来源于stack exchange,提问作者molk95
相关产品推荐
相关产品推荐

