Ошибка типа Python OpenCV: ожидаемый Ptr для аргумента ‘lowerb’ и проблемы с цветом

#python #opencv #colors #png

#python #opencv #Цвет #png

Вопрос:

Отказ от ответственности: Я новичок в OpenCV, поэтому существует вероятность существования очень простых ошибок, поэтому я подготовил код, который подсчитывает пиксели в заданных границах, а затем сохраняет количество sit в массиве, чтобы можно было вычислять 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:UsersuserDownloadsMash_The_CharacterCreatorvenvlibsite-packagesdiscordextcommandscore.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:UsersuserDownloadsMash_The_CharacterCreatorWaifuMeterPNG.py", line 53, in PCCprepare
    mask = cv2.inRange(img, lower, upper)
TypeError: Expected Ptr<cv::UMat> for argument 'lowerb'
 

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

 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)
 

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

Комментарии:

1. разве это не опечатка? «lowerb»? в вашем коде я вижу только переменную с именем «lower»

2. То, что вы пытаетесь сделать, называется квантованием цвета. Проверьте здесь .

3. @icecube ну, я тоже так думал, но когда я просмотрел этот код, оказалось, что это просто синий цвет из 'lower'

4. @Hihikomori это выглядит действительно полезным, спасибо за вашу помощь

Ответ №1:

В Python параметры lowerb функции и upperb cv2.inRange(src, lowerb, upperb, dst) не принимают списки, они поддерживают только кортежи. Поэтому вместо использования скобок просто измените их на круглые скобки:

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

Я протестировал ваш код с обновленными lower upper переменными и на своей машине, и он работает.