Не работает фильтр чёрного цвета в rgb для opencv поиска обьектов

Извините за нубские вопросы но это капец, у меня как на зло opencv не находит только чёрный цвет, а фильтр ведь должен быть установлен именно на чёрные обьекты. Вот главная часть кода:

  hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 30, 150)

czarny = cv2.inRange(hsv, (0, 0, 0), (40, 40, 40))

mask_gray = gray>0

mask_czarny = czarny>0

czarny = np.zeros_like(image, np.uint8)

czarny[mask_czarny] = image[mask_czarny]

gray = cv2.cvtColor(czarny, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(edged, 1, 255, cv2.THRESH_BINARY)

И пример его неудачной работы:

https://drive.google.com/file/d/1fYr9aCmxQHGV_bGvWojv88d_wTAjCEO3/view?usp=sharing


Ответы (2 шт):

Автор решения: A_Vaclav

Требуемая цветовая модель для функции inRange(src, lowerb, upperb, dst) в OpenCV-это HSV.

Параметры lowerb и upperb задают необходимые нижние и верхние границы цвета в формате HSV. В OpenCV для HSV диапазон оттенков составляет [0,179], диапазон насыщенности - [0,255], а диапазон значений - [0,255]. Источник.

Попробуйте:

czarny = cv2.inRange(hsv, (0, 0, 0), (0, 0, 16))

переводил схему тут.

→ Ссылка
Автор решения: GrAnd

У меня получилось более-менее выделить светофоры вот таким кодом:

import cv2 

image = cv2.imread('traffic_light.jpg')

blur = cv2.GaussianBlur(image, (7,7), 0)
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, (0,0,0), (179,50,55))

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=1)
close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel, iterations=2)

cnts,_ = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
    approx = cv2.approxPolyDP(c, 0.04 * cv2.arcLength(c, True), True)
    area = cv2.contourArea(c)
    if len(approx) > 3 and area > 200:
        cv2.drawContours(image, [c], -1, (0,255,0), -1)

cv2.imshow('image', image)

Только не просите объяснить, я с OpenCV особо не знаком, делал методом научного тыка.

-

→ Ссылка