【问题标题】:Looping program causes index # is out of bounds for axis #循环程序导致索引 # 超出轴 # 的范围
【发布时间】:2019-07-02 19:22:32
【问题描述】:

我对 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 中的宽度和高度变量定义的指定“框”内无限期地为像素随机颜色着色。

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

“IndexError:索引 702 超出轴 1 的范围,大小为 702”

【问题讨论】:

    标签: python-3.x numpy opencv random


    【解决方案1】:

    您的图像是 widthheight 像素宽 - 但相应的索引从 0..width-10..height-1 运行

    randint function 返回包容性限制 - 所以

    random.randint(0,width)
    

    可能会给你 width ... 1 太大了:

    random.randint(a, b)
    返回一个随机整数 N,使得 a

    使用

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

    改为。

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

    【讨论】:

    • 感觉好傻,看了rand文档,没想到居然包罗万象!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 2021-12-15
    • 2019-04-17
    • 2017-08-09
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2013-11-25
    相关资源
    最近更新 更多