OpenCV程序报错:index 1920超出axis 0边界(size为1080)
解决OpenCV索引越界错误:"index 1920 is out of bounds for axis 0 with size 1080"
运行OpenCV视频处理程序时触发索引越界错误,错误信息为index 1920 is out of bounds for axis 0 with size 1080。手动将变量w的值从1920改为1079后程序可临时运行,但需要从根源修正逻辑问题。
错误原因
OpenCV中图像以NumPy数组存储,数组索引遵循**(行, 列)的顺序,对应图像的(高度h, 宽度w)**:
- 行的索引范围是
0 ~ h-1(h为图像高度,即shape[0]) - 列的索引范围是
0 ~ w-1(w为图像宽度,即shape[1])
代码中存在两处核心索引逻辑错误:
thresh[0,(h-i)]:错误将行索引固定为0,列索引设为h-i。若图像高度h大于宽度w,h-i会超出列索引范围thresh[w,(h-i)]:直接将宽度值w作为行索引,而行数仅为h=1080,最大行索引为1079,1920远大于该值,直接触发越界错误
你的需求是获取第h-i行的最左侧(第0列)和最右侧(第w-1列)像素,因此索引顺序完全搞反了。
修正后的代码
import cv2 # OpenCV,计算机视觉库 import time # 导入time模块 pTime = 0 # 初始化时间变量 cap = cv2.VideoCapture("segment4_pumping_and_foiling.mp4") # 打开视频文件 cv2.namedWindow("video", cv2.WND_PROP_FULLSCREEN) # 创建全屏窗口 cv2.setWindowProperty("video", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) # 设置窗口为全屏 while True: # 循环播放视频 success, img = cap.read() # 读取视频帧 if not success: # 处理视频读取完毕的情况 break h, w, c = img.shape # 获取图像的高、宽、通道数 cTime = time.time() # 获取当前时间 fps = 1 / (cTime - pTime) # 计算帧率 pTime = cTime # 更新时间变量 cv2.putText(img, str(int(fps)), (70, 50), cv2.FONT_HERSHEY_PLAIN, 3,(255, 0, 0), 3) # 在图像上绘制帧率 ret,thresh = cv2.threshold(img,206,210,cv2.THRESH_BINARY) point0=(0,h) pointw=(w,h) for i in range(200): row_idx = h - i if row_idx < 0: # 防止行索引小于0 break # 修正索引顺序:(行, 列) (b0, g0, r0)=thresh[row_idx, 0] (bw, gw, rw)=thresh[row_idx, w-1] if (b0>200 and g0>200 and r0>200): point0=(0, row_idx) if (bw>200 and gw>200 and rw>200): pointw=(w, row_idx) image = cv2.line(thresh, (0, 830), (w, 830), (0, 255, 0), 4) image = cv2.line(thresh, point0, pointw, (0, 255, 255), 4) cv2.imshow("video", thresh) if cv2.waitKey(1) & 0xFF == ord('q'): # 按下q键退出 break # 关闭视频窗口 cv2.destroyAllWindows() # 销毁所有窗口 cap.release() # 释放视频捕获资源
额外优化点
- 新增视频读取失败的判断,避免视频播放完毕后
img为None导致后续报错 - 新增行索引下限判断,防止循环中
h-i变为负数,触发新的索引越界错误
内容的提问来源于stack exchange,提问作者Luis Delbergue Chico
相关产品推荐
相关产品推荐

