У меня есть изображение с маской; Я нашел контур объекта на изображении. Почему-то, когда я вызываю 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()
@nathancy Превращает ли вызов функции inRange изображение в изображение с одним каналом?
Да, вы выполняете пороговое значение цвета HSV, которое генерирует двоичную маску одного канала, поэтому для применения цвета вам нужно вернуть каналы
Контур рисуется серым цветом, потому что входное изображение 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)
Это потому, что ваше изображение представляет собой изображение в градациях серого, поэтому, когда вы применяете цвет BGR, оно отображается как серый. Вам нужно сделать маску трехканальным изображением. Делай
masked_img = cv2.merge([masked_img, masked_img, masked_img])
доcv2.drawContours