Рисование контуров на маске

У меня есть изображение с маской; Я нашел контур объекта на изображении. Почему-то, когда я вызываю cv2.drawContours(), контур объекта рисуется серым цветом. Есть ли способ рисовать цветные линии на изображении?

Ниже приведен код:

img = cv2.imread("Assets/Setup2.jpg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
masked_img = cv2.inRange(hsv_img, (50, 40, 40), (70, 255, 255))
contours = cv2.findContours(masked_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(masked_img, contours, -1, (60, 200, 200), 5)
cv2.imshow("Frame", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Это потому, что ваше изображение представляет собой изображение в градациях серого, поэтому, когда вы применяете цвет BGR, оно отображается как серый. Вам нужно сделать маску трехканальным изображением. Делай masked_img = cv2.merge([masked_img, masked_img, masked_img]) до cv2.drawContours

nathancy 06.05.2022 05:13

@nathancy Превращает ли вызов функции inRange изображение в изображение с одним каналом?

Stack Overflow 06.05.2022 05:15

Да, вы выполняете пороговое значение цвета HSV, которое генерирует двоичную маску одного канала, поэтому для применения цвета вам нужно вернуть каналы

nathancy 06.05.2022 05:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Контур рисуется серым цветом, потому что входное изображение masked_img является одноканальным изображением. Выходные данные из cv2.threshold или cv2.inRange возвращают одноканальное изображение независимо от его входных данных.

Вот как вы должны исправить свой код, чтобы получить желаемый эффект:

img = cv2.imread("Assets/Setup2.jpg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
masked_img = cv2.inRange(hsv_img, (50, 40, 40), (70, 255, 255))
masked_img = cv2.cvtColor(masked_img, cv2.COLOR_GRAY2BGR)  // changes gray to BGR
contours = cv2.findContours(masked_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(masked_img, contours, -1, (60, 200, 200), 5) 
cv2.imshow("Frame", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

или вы можете нарисовать контур прямо на входном изображении. В этом случае вам нужно всего лишь изменить cv2.drawContour на следующий код

cv2.drawContours(img, contours, -1, (60, 200, 200), 5) 

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