Python OpenCV: почему fillPoly() рисует только серые многоугольники, независимо от аргумента цвета?

Я пытаюсь написать белую маску на черном двумерном массиве NumPy — изображение с одним каналом — в OpenCV с использованием Python:

mask = np.zeros(shape=(100, 100), dtype=np.int8)
cv2.fillPoly(mask, np.array([[[0,0], [89, 0], [99,50], [33,96], [0,47]]], dtype=np.int32), color=255)
print(mask)

Однако при печати маски полигон имеет серый цвет:

[[127 127 127 ...   0   0   0]
 [127 127 127 ...   0   0   0]
 [127 127 127 ...   0   0   0]
 ...
 [  0   0   0 ...   0   0   0]
 [  0   0   0 ...   0   0   0]
 [  0   0   0 ...   0   0   0]]

Я пробовал 3D-массив NumPy с color=(255,255,255), пробовал разные цвета, все безрезультатно. Почему игнорируется аргумент color?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
0
2 634
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Проблема возникает из-за инициализации вашего mask:

mask = np.zeros(shape=(100, 100), dtype=np.int8)

Диапазон значений int8 тип данных равен -128 ... 127, поэтому любое значение выше 127 будет «усечено» до 127.

Попробуйте свой код с помощью color=100, вы получите ожидаемый результат:

[[100 100 100 ...   0   0   0]
 [100 100 100 ...   0   0   0]
 [100 100 100 ...   0   0   0]
 ...
 [  0   0   0 ...   0   0   0]
 [  0   0   0 ...   0   0   0]
 [  0   0   0 ...   0   0   0]]

Я думаю, вы хотели использовать uint8 вместо int8, так что, может быть, это просто опечатка!?

Измените свой код в соответствии с

mask = np.zeros(shape=(100, 100), dtype=np.uint8)

затем дает ожидаемый результат, также для color=255:

[[255 255 255 ...   0   0   0]
 [255 255 255 ...   0   0   0]
 [255 255 255 ...   0   0   0]
 ...
 [  0   0   0 ...   0   0   0]
 [  0   0   0 ...   0   0   0]
 [  0   0   0 ...   0   0   0]]

Проблема заключается в выборе типа данных при инициализации массива numpy. В вашем примере кода вы используете np.int8 , который имеет диапазон от -128 до 127.. Вместо np.int8 вы должны рассмотреть возможность использования np.uint8, который имеет диапазон от 0 до 255, который вы ищете.

mask = np.zeros(shape=(100, 100), dtype=np.int8)

должно быть

mask = np.zeros(shape=(100, 100), dtype=np.uint8)

[[255 255 255 ... 0 0 0] [255 255 255 ... 0 0 0] [255 255 255 ... 0 0 0] ... [ 0 0 0 ... 0 0 0] [ 0 0 0 ... 0 0 0] [ 0 0 0 ... 0 0 0]]

Для меня проблема заключалась не в инициализации маски глубиной.

mask = np.zeros(shape = (MASK_WIDTH, MASK_HEIGHT), dtype=np.uint8)

Решено с помощью этого кода

mask = np.zeros(shape = (MASK_WIDTH, MASK_HEIGHT, 3), dtype=np.uint8)
rcolor = list(np.random.random(size=3) * 256)
cv2.fillPoly(mask, [arr], color=rcolor) 
cv2.imwrite(os.path.join(mask_folder, itr + ".jpg") , cv2.cvtColor(mask, cv2.COLOR_RGB2BGR))

Другие вопросы по теме