Python OpenCV: Цветовая сегментация
Продолжаем изучать Python библиотеку OpenCV. Сегодня поговорим о цветовой сегментации.
Цветовая сегментация фото или видео дает возможность выделить объект с конкретным оттенком, а уже затем обработать его, например распознать движется он или нет. В Python данную возможность можно реализовать библиотекой OpenCV. Для начала необходимо иметь базовые знания о цветовом представлении. По умолчанию в OpenCV цвет изображения представлен в формате BGR: Blue, Green, Red. Нам потребуется перевести наш формат в представление hsv, методом cv2.cvtColor(frame, cv2.COLOR_BGR2HSV). Полученный массив будет содержать представление изображения в виде оттенка цвета, его насыщенности и яркости или hsv. Цветовые параметры будут установлены в массиве lower_border = np.array([111, 23, 56]).
import cv2
import numpy as np
def nothing(x): # Пустая функция
pass
# захват видеопотока с вебкамеры
cap = cv2.VideoCapture(0)
# создаем окно с ползунками
cv2.namedWindow("Tracking")
cv2.createTrackbar("l_h", "Tracking", 0, 255, nothing) # создание элемента Trackbar
cv2.createTrackbar("l_s", "Tracking", 0, 255, nothing)
cv2.createTrackbar("l_v", "Tracking", 0, 255, nothing)
cv2.createTrackbar("u_h", "Tracking", 255, 255, nothing)
cv2.createTrackbar("u_s", "Tracking", 255, 255, nothing)
cv2.createTrackbar("u_v", "Tracking", 255, 255, nothing)
while True:
# image = cv2.imread("D:/apple-1112047_1280.jpg") # метод считывает переданную ему строку
_, frame = cap.read()
# перевод изображения формата BGR в HSV, формат hsv: hue, saturation, value
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# продолжение ниже...
Наряду с форматом BGR есть цветовое пространство hsv. Параметр, hue (h), соответствует цветовому компоненту: красному, синему и так далее, saturation (s) - соответствует насыщенности цвета: красный, темно-красный, светло-красный, и так далее. Значение value (v) передает соответственно яркость выбранного цветового компонента или пикселя.
# ...продолжение предыдущего кода
# получение значения элемента Trackbar
LH = cv2.getTrackbarPos("l_h", "Tracking")
LS = cv2.getTrackbarPos("l_s", "Tracking")
LV = cv2.getTrackbarPos("l_v", "Tracking")
UH = cv2.getTrackbarPos("u_h", "Tracking")
US = cv2.getTrackbarPos("u_s", "Tracking")
UV = cv2.getTrackbarPos("u_v", "Tracking")
# первое значение в массиве - hue - цвет, второе - saturation - насыщенность, третье value - яркость
lower_border = np.array([LH, LS, LV])
upper_border = np.array([UH, US, UV]) # верхняя граница цветового массива hsv
mask = cv2.inRange(hsv, lower_red, upper_red) # маска для нахождения объекта указанного цветового массива на изображении
res = cv2.bitwise_and(frame, frame, mask=mask) # окончательный вариант
cv2.imshow("color", frame) # оригинальное фото
cv2.imshow("mask", mask) # фото после фильтрации по цвету
cv2.imshow("hsv", hsv) # фото в формате hsv
cv2.imshow("res", res)
key = cv2.waitKey(1)
if key == 27:
break
cap.release() # запуск видео цикла
cv2.destroyAllWindows() # метод закрытия всех окон при остановке программы
Манипулируя значениями элементов Trackbar, можно устанавливать маску для нахождения объекта с интересующим нас цветом.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.