2015-07-23 6 views
4

В настоящее время я создаю приложение, в котором пользователь обнаружит зеленые цвета. Я использую эту фотографию для тестирования: enter image description hereOpenCV Android Green Color Detection

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

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

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

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

enter image description here

+0

смотрите [здесь] (http://stackoverflow.com/a/31465462/5008845) – Miki

+0

Я думаю, что я использую HSV справа. Я использую http://colorizer.org/, чтобы узнать соответствующий HSV для RGB, а затем преобразовать его, поэтому его можно использовать в OpenCV. –

+0

Я обновил ответ, вам нужно использовать нижнюю границу для V, так как ваше исходное изображение довольно темное (т. Е. Низкое значение V). См. Результат – Miki

ответ

11

Зеленый цвет ВПГ пространство Н = 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 

результирующая маска будет, как:

enter image description here

Вы можете обратиться к this answer для деталей.

+0

Я использовал ваши значения и сделал чувствительность к 60. Я загрузил изображение того, что получаю. Более легкие пиксели - это те, которые я обнаружил. –

+0

@OleksandrFirsov проверить обновленный ответ – Miki

+0

OMG! Благодарю. Вы даже не понимаете, насколько полезен этот ответ. Когда я изо всех сил пытался обнаружить синие круги, я использовал до 10 inRange для фильтрации достаточного количества пикселей для определения цвета. И здесь вы делаете это с помощью одной функции. Мне так глупо. –