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

Python+OpenCV列表赋值索引越界(IndexError)问题求助

解决OpenCV遍历视频帧时的IndexError问题

嘿,刚学Python和OpenCV两小时就上手写程序,这行动力拉满!不过你遇到的IndexError: list assignment index out of range问题,我帮你拆解一下原因,再给你修正后的代码~

错误根源分析

你代码里的dark数组初始化有核心问题:

dark = [width - right - left]

这行代码创建的是只有一个元素的列表,元素值是width - right - left,但后面你要遍历left到width-right的列,每一列都要给dark对应位置赋值,这个长度完全不够,自然会触发索引越界错误。

另外还有个小坑:你在内部循环里用x当循环变量,又在else分支里x +=1,这会打乱循环的正常执行逻辑,计数肯定不准。

修复步骤

  • 正确初始化dark数组:创建一个长度为width - right - left的列表,每个元素初始化为0,这样每一列都有对应的位置可以赋值:
    dark = [0] * (width - right - left)
    
  • 单独用计数器统计像素:别用循环变量x来计数,新建一个count变量专门统计不符合阈值的像素数,避免干扰循环。
  • 修正索引计算:y从left开始,对应的dark索引应该是y - left,而不是y -1 -left,后者会导致第一个索引为-1,同样触发错误。

修正后的完整代码

import cv2

vid = cv2.VideoCapture("136.mp4")
width = int(vid.get(3) / 2)
height = int(vid.get(4) / 2)
left = 300
right = 400
top = 210
bottom = 140

# 初始化dark数组,长度为要统计的列数,默认值0
dark = [0] * (width - right - left)

for i in range(0, 1599):  # frame count
    vid.set(1, i)
    ret, frameIn = vid.read()
    # 加个判断,确保帧读取成功
    if not ret:
        print(f"无法读取第{i}帧")
        continue
    frameOut = cv2.resize(frameIn, (width, height))
    
    for y in range(left, width - right):
        count = 0  # 每列单独初始化计数器
        for x in range(top, height - bottom):
            colR = frameOut[x, y, 2]
            colG = frameOut[x, y, 1]
            colB = frameOut[x, y, 0]
            if colR < 50 and colG > 60 and colB > 80:
                frameOut[x, y] = [255, 255, 255]
            else:
                count += 1  # 不符合条件就计数+1
        # 给dark数组对应位置赋值
        dark[y - left] = count
    
    # 输出当前帧dark数组的最大值
    print(max(dark))

# 释放资源
vid.release()
cv2.destroyAllWindows()

额外小优化

我还加了帧读取成功的判断if not ret,避免因为视频帧读取失败导致后续代码报错;最后也加上了vid.release()和cv2.destroyAllWindows(),规范释放资源,避免内存泄漏。

内容的提问来源于stack exchange,提问作者123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:07:52