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

Я пытаюсь написать белую маску на черном двумерном массиве 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?

Ответы [ 2 ]

2 голосов
/ 22 мая 2019

Проблема возникает из-за инициализации вашего 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]]
1 голос
/ 22 мая 2019

Проблема заключается в выборе типа данных при инициализации массива 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]]

...