Циклическая программа приводит к тому, что индекс № выходит за пределы оси № - PullRequest
1 голос
/ 02 июля 2019

Я довольно новичок в python и Opencv, но у меня есть несколько примеров из cv2 и случайных мыслей для простой тестовой программы, чтобы убедиться, что я понимаю, как работают эти библиотеки.

Я пытаюсь создать программу, которая эффективно генерирует цветной «снег», аналогичный тому, что показывает старомодный телевизор, когда на нем нет сигнала.

В основном я генерирую случайный цвет с помощью random.randint (-1,256), чтобы получить значение от 0 до 255. Я делаю это три раза и сохраняю каждый в своей переменной randB / G / R. Затем я делаю это в два раза больше для координат randX / Y, используя img.shape, чтобы получить переменные для ширины и высоты для максимального числа.

Я не думаю, что мои переменные интерпретируются как строки. Если я быстро разорву цикл и выведу переменные, ошибок не будет. Если я удалю переменные randX и randY и укажу фиксированные координаты или диапазон [X1: Y1, X2: Y2], это не приведет к сбою.

import cv2
import numpy as np
import random

img = cv2.imread('jake_twitch.png', cv2.IMREAD_COLOR)
height, width, channels = img.shape

while True:
    randB = (random.randint(-1,256))
    randG = (random.randint(-1,256))
    randR = (random.randint(0,256))
    randX = (random.randint(0,width))
    randY = (random.randint(0,height))

    img[randX,randY] = [randB,randG,randR]
    cv2.imshow('Snow', img)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.imwrite('Snow.png', img)
cv2.destroyAllWindows

Я ожидал бы, что мой код будет выполнять неопределенную окраску пикселей случайными цветами в пределах указанного "блока", определенного переменными ширины и высоты из img.shape.

похоже, он начинает это делать, но если программа работает дольше секунды, она вылетает и выдает эту ошибку

"Ошибка IndexE: индекс 702 выходит за границы оси 1 с размером 702"

1 Ответ

0 голосов
/ 02 июля 2019

Ваше изображение ширина и высота пикселей в ширину, но соответствующие индексы начинаются с 0..width-1 и 0..height-1

randintфункция возвращает ограничивающие ограничения - поэтому

random.randint(0,width)

может дать вам width ... что на 1 слишком большое:

random.randint (a, b)
Возвращает случайное целое число N такое, что a <= N <= b.Псевдоним для randrange (a, b + 1). </p>

Вместо этого используйте

randX = (random.randint(0,width-1))
randY = (random.randint(0,height-1)) 

.

Или измените его на random.randrange(0, width) или random.choice(range(width))- оба опускают верхнее предельное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...