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
相关产品推荐
相关产品推荐

