#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
переменными и на своей машине, и он работает.