我是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的范围”
答案 0 :(得分:0)
您的图片的宽度为宽度和高度像素-但相应的索引从0..width-1
和0..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))
-两者均忽略上限值。