Проверьте, содержит ли изображение синие пиксели

Нет, значения параметра ключевого слова функции определяются, когда функция определена , а не когда функция выполнена.

Установите значение по умолчанию на None и определите, что:

def perms(elements, setLength=None):
    if setLength is None:
        setLength = elements

Если вам нужно указать None в качестве аргумента, используйте другое значение часового:

_sentinel = object()

def perms(elements, setLength=_sentinel):
    if setLength is _sentinel:
        setLength = elements

Теперь вызывающие абоненты могут установить setLength на None, и это не будет рассматриваться как значение по умолчанию.

2
задан Vicente Olivert Riera 13 July 2018 в 11:34
поделиться

2 ответа

Проблема в том, что вы не читаете документацию inRange : D

, которая сообщает следующее:

То есть, dst (I) устанавливается в 255 (все 1-биты), если src (I) находится в пределах указанных 1D, 2D, 3D, ... и 0. В противном случае

, и вы проверяете для 1

# cv2.inRange will create a mask (binary array) where the 1 values
# are blue pixels and 0 values are any other colour out of the blue
# range defined by hsv_l and hsv_h
return 1 in cv2.inRange(hsv, hsv_l, hsv_h)

Итак, решение состоит в том, чтобы изменить его на:

return 255 in cv2.inRange(hsv, hsv_l, hsv_h)

Я проверил его с вашим изображением и вернул true, также с черно-белым изображением (BGR хотя) и возвращает false.

На мой взгляд, выбранные вами синие диапазоны немного далеки от фиолетовой стороны ... Вы можете использовать hsv colorpicker, подобный этому http: // colorizer .org / и выберите диапазоны, которые вам понравятся. Просто помните, что OpenCV использует H -> Hue / 2, а S и V - как проценты (0-100), и вы просто делите их на 100 (0-1.) И умножьте их на 255.

1
ответ дан api55 17 August 2018 в 13:03
поделиться

Вместо этого вы могли бы использовать np.any() . Он вернет True, если какой-либо один пиксель имеет значение 255.

Итак, вместо

return 1 in cv2.inRange(hsv, hsv_l, hsv_h),

вы можете просто добавить следующее :

return np.any(cv2.inRange(hsv, hsv_l, hsv_h))

Обновление:

Как упоминалось в комментариях @AKX, вы могли бы попробовать следующее:

return cv2.inRange(hsv, hsv_l, hsv_h).any()

2
ответ дан Jeru Luke 17 August 2018 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: