循环程序导致索引#超出轴#的范围

时间:2019-07-02 19:22:32

标签: python-3.x numpy opencv random

我是python和Opencv的新手,但是我有一些来自cv2的文章,并且出于一个简单的测试程序考虑了随机性,以确保我了解这些库的工作原理。

我正在尝试创建一个程序,该程序可以有效生成彩色的“雪”,类似于老式电视在没有信号时显示的内容。

基本上,我生成一个带有random.randint(-1,256)的随机颜色,以获得0到255之间的值。我进行了3次并分别存储在不同的变量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的width和height变量定义的指定“框”内无限地为像素随机着色。

它似乎开始这样做,但是如果程序运行超过一秒钟,它将崩溃并吐出此错误

  

“ IndexError:索引702超出了尺寸为702的轴1的范围”

1 个答案:

答案 0 :(得分:0)

您的图片的宽度为宽度高度像素-但相应的索引从0..width-10..height-1

开始运行

randint function返回包含的限制-因此

random.randint(0,width)

可能会给您宽度 ... ...太大1:

  

random.randint(a,b)
  返回一个随机整数N,使得a <= N <= b。 randrange(a,b + 1)的别名。

使用

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

相反。

或将其更改为使用random.randrange(0, width)random.choice(range(width))-两者均忽略上限值。