Обнаружение зеленого цвета OpenCV Android

в настоящее время я создаю приложение, в котором пользователь будет определять зеленые цвета. Я использую это фото для тестирования:  введите описание изображения здесь

Моя проблема в том, что я не могу обнаружить зеленый пиксель. Раньше я работал с синим цветом и все работало нормально. Сейчас я ничего не могу обнаружить, хотя пробовал разные комбинации RGB. Я хотел знать, проблема ли это в зеленом или в моем диапазоне обнаружения, поэтому я сделал изображение краской с помощью (0, 255, 0), и это сработало. Почему тогда он не видит этого круга? Я использую этот код для обнаружения:

Core.inRange(hsv_image, new Scalar([I change this value]), new Scalar(60, 255, 255), ultimate_blue);

Возможно, я установил неправильный диапазон, но я использую Photoshop, чтобы получить цвет одного из зеленых пикселей и преобразовать его значение RGB в HSV. Но это не работает. Он не обнаруживает даже пиксель, который я отобрал. Что случилось? Заранее спасибо.

Используя ответ Мики:

введите описание изображения здесь


person Oleksandr Firsov    schedule 23.07.2015    source источник
comment
посмотрите здесь   -  person Miki    schedule 23.07.2015
comment
Думаю, я правильно использую HSV. Я использую colorizer.org, чтобы найти соответствующий HSV для RGB, а затем преобразовать его, чтобы его можно было использовать в OpenCV.   -  person Oleksandr Firsov    schedule 23.07.2015
comment
Я обновил ответ, вам нужно использовать нижнюю границу для V, так как ваше исходное изображение довольно темное (то есть с низким V). Посмотреть результат   -  person Miki    schedule 23.07.2015


Ответы (1)


Зеленый цвет - пространство HSV имеет H = 120 и находится в диапазоне [0, 360].

OpenCV делит значения H вдвое, чтобы соответствовать диапазону [0,255], поэтому значение H вместо диапазона [0, 360] находится в диапазоне [0, 180]. S и V все еще находятся в диапазоне [0, 255].

Как следствие, значение H для зеленого составляет 60 = 120/2.

Ваша верхняя и нижняя границы должны быть:

// sensitivity is a int, typically set to 15 - 20 
[60 - sensitivity, 100, 100]
[60 + sensitivity, 255, 255]

ОБНОВЛЕНИЕ

Поскольку ваше изображение довольно темное, вам нужно использовать нижнюю границу для V. Со следующими значениями:

sensitivity = 15;
[60 - sensitivity, 100, 50]  // lower bound
[60 + sensitivity, 255, 255] // upper bound

итоговая маска будет иметь вид:

введите описание изображения здесь

Дополнительные сведения можно найти в этом ответе.

person Miki    schedule 23.07.2015
comment
Я использовал ваши значения и установил чувствительность до 60. Я загрузил изображение того, что получаю. Я обнаруживаю более светлые пиксели. - person Oleksandr Firsov; 23.07.2015
comment
МОЙ БОГ! Спасибо. Вы даже не представляете, насколько полезен этот ответ. Когда я изо всех сил пытался обнаружить синие круги, я использовал до 10 inRange, чтобы отфильтровать достаточное количество пикселей для определения цвета. И здесь вы делаете это с помощью одной функции. Я чувствую себя такой глупой. - person Oleksandr Firsov; 23.07.2015