【问题标题】:Python OpenCV TypeError: Expected Ptr<cv::UMat> for argument 'lowerb', and color problemsPython OpenCV TypeError: Expected Ptr<cv::UMat> for argument 'lowerb', and color questions
【发布时间】:2021-04-15 16:14:21
【问题描述】:

免责声明:我是 OpenCv 的初学者,所以可能存在非常简单的错误 所以我准备了一个代码来计算给定边界中的像素,然后将坐的计数保存在一个数组中,以便可以使用它们计算 pcc。

def PCCprepare():
    print("[LOG] reporting!")
    tot_pixel = 0
    pixels = []
    old_b = 0
    old_g = 0

    dir = os.listdir("res")
    for filename in dir:
        i = 0
        img = cv2.imread("res/" + filename)

        output = cv2.bitwise_and(img, img)
        tot_pixel += output.size
        for b in range(4):
            for g in range(4):
                for r in range(4):
                    lower = [b * 63.75, g * 63.75, r * 63.75]
                    print(lower)
                    if b > old_b:
                        upper = ([(b + 1) * 63.75, g * 63.75, r * 63.75])
                    elif g > old_g:
                        upper = ([b * 63.75, (g + 1) * 63.75, r * 63.75])
                    else:
                        upper = ([b * 63.75, g * 63.75, (r + 1) * 63.75])
                    print(upper)
                    old_g = g
                    old_b = b

                    mask = cv2.inRange(img, lower, upper)
                    output = cv2.bitwise_and(img, img, mask=mask)

                    try:
                        pixels[i] += np.count_nonzero(output)
                    except:
                        pixels.append(np.count_nonzero(output))
                    i += 1

它曾经适用于固定边界,但现在它总是返回以下异常:

Ignoring exception in command imgSetup:
Traceback (most recent call last):
  File "C:\Users\user\Downloads\Mash_The_CharacterCreator\venv\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "C:/Users/user/Downloads/Mash_The_CharacterCreator/bot.py", line 727, in waifuSet
    await ctx.send("<@!" + str(ctx.message.author.id) + "> " + imgWorks.PCCprepare())
  File "C:\Users\user\Downloads\Mash_The_CharacterCreator\WaifuMeterPNG.py", line 53, in PCCprepare
    mask = cv2.inRange(img, lower, upper)
TypeError: Expected Ptr<cv::UMat> for argument 'lowerb'

另外,如果有人可以帮助我解决边界问题,因为我想计算每一种可能的颜色,以前我是这样用的

lower = [b * 63.75, g * 63.75, r * 63.75]
print(lower)
upper = [(b + 1) * 63.75, (g + 1) * 63.75, (r + 1) * 63.75]
print(upper)

但它会导致重叠和不准确的界限,所以如果有更熟悉这个主题的人能为他们提出一些更好的解决方案,我会很高兴

【问题讨论】:

  • 不是错字吗? “低贱”?在您的代码中,我只能看到一个名为“lower”的变量
  • 您尝试做的事情称为颜色量化。检查here
  • @icecube 我也这么认为,但是当我查看这段代码时,它看起来只是来自'lower'的蓝色
  • @Hihikomori 这看起来真的很有用,谢谢你的帮助

标签: python opencv colors png


【解决方案1】:

在 Python 中,函数 cv2.inRange(src, lowerb, upperb, dst)lowerbupperb 参数不接受列表,它只支持元组。所以不要使用括号,只需将它们更改为括号:

lower = (b * 63.75, g * 63.75, r * 63.75)

我已经在我的机器上使用更新后的lowerupper 变量测试了你的代码,它可以工作。

【讨论】:

    猜你喜欢
    • 2021-01-29
    • 2020-10-03
    • 2019-08-03
    • 1970-01-01
    • 2019-12-13
    • 2019-06-12
    • 2021-05-29
    • 2021-12-09
    相关资源
    最近更新 更多