Ошибка индексации массива Python и OpenCV: индекс назначения списка вне диапазона

#python #arrays #opencv #opencv-python #indexoutofrangeexception

#python #массивы #opencv #opencv-python #исключение indexoutofrangeexception

Вопрос:

Кто-нибудь знает, почему я получаю IndexError: индекс назначения списка вне диапазона, когда я пытаюсь поместить целое число x в темный массив?

Я только начал изучать python и OpenCV (около двух часов назад (-; ), и мне нужна программа, которая просматривает каждый кадр в видео, в каждом столбце подсчитывает пиксели, которые не находятся в пороговом значении (int x), и помещает его в темный массив. Но я получаю ошибку IndexError: индекс назначения списка вне диапазона.

Мой код на python:

 import cv2

vid = cv2.VideoCapture("136.mp4")

width = int(vid.get(3) / 2)
height = int(vid.get(4) / 2)

#frameCount = int(vid.get(1))

left = 300
right = 400
top = 210
bottom = 140

for i in range(0, 1599): #frame count
    vid.set(1, i)
    x, frameIn = vid.read()
    frameOut = cv2.resize(frameIn, (width, height))

    dark = [width - right - left]

    for y in range(left, width - right):
        x = 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:
                x  = 1


        dark[y - 1 - left] = x

    #cv2.imshow("video", frameOut)
    print(max(dark))
    cv2.waitKey(0)
  

Комментарии:

1. Можете ли вы указать строку, в которой вы получаете эту ошибку?

2. строка 35 (темная [y — 1 — слева] = x)

Ответ №1:

Вы ошибаетесь в том, как создать массив. Следующая строка:

 dark = [width - right - left]
  

создает Python list с одним элементом, этот один элемент является значением width - right - left . Однако вы, вероятно, хотели создать массив нулей размера width - right - left , который вы можете создать, выполнив это:

 import numpy as np

dark = np.zeros(width - right - left)
  

или это, если вы не хотите использовать numpy :

 dark = [0] * (width - right - left)