2016-06-01 3 views
0

У меня есть следующий, изображаемый препроцессор с некоторыми функциями OpenCV:Получить правильный HSV цвета InRange в OpenCV (Java)

Different colored lego bricks

Теперь я пытаюсь получить количество кирпичей каждого цвета (в этом случай 1 для каждого цвета). Это все цвета, которые у меня есть.

Мой план состоял в том, чтобы пересекать все цвета, использовать функцию OpenCV «inRange» и получить размер области. Моя проблема заключается в распознавании разных цветов. Я попробовал красный цвет и изо всех сил пытался найти хороший диапазон. После того, как я спросил Google, я понял, что мне нужно использовать цвета HSV, чтобы получить хороший диапазон с оттенком.

Так что я написал этот код (в Java по некоторым причинам):

Mat img; //img is given from previos code 
Mat hsv = img.clone(); 
Imgproc.cvtColor(img, hsv, Imgproc.COLOR_BGR2HSV); 

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

Weird HSV image

В этом изображении цвета почти разрушенное ... красный и светло-зеленый выглядят те же и другие цвета совершенно разные тоже.

Теперь мой вопрос: Что-то не так? Можно ли отличить кирпичные цвета Lego? Что я могу сделать для этого? Я использую OpenCV 3.1.0 для Java.

Большое спасибо, Dennis

+1

Взгляните [здесь] (http://stackoverflow.com/a/31465462/5008845) – Miki

+0

@Miki Спасибо, но это не работает для меня. Например: я пытаюсь получить синий цвет. В ответах говорится, что «синий - это 120 + 15 чувствительность». Но в изображении HSV нет синего (в RGB-изображении есть 2 синих кирпича). Моя проблема ist, что преобразование HSV уничтожает все цвета, и я не могу получить правильные цвета ... синий, например, находится в фиолетовой доске и правой (черной) области. – Dentastic

ответ

1

Я нашел ошибку, и я не горжусь этим. Это была простая опечатка. С фиксацией этого и помощью @Miki я могу найти свои цвета.

Моя ошибка:

Mat img; //img is given from previos code 
Mat hsv = img.clone(); 
Imgproc.cvtColor(img, hsv, Imgproc.COLOR_BGR2HSV);  
Core.inRange(img, lowerBlue, upperBlue, hsv); //img 

вместо

Mat img; //img is given from previos code 
Mat hsv = img.clone(); 
Imgproc.cvtColor(img, hsv, Imgproc.COLOR_BGR2HSV);  
Core.inRange(hsv, lowerBlue, upperBlue, hsv); //hsv 

На самом деле ... Я перевел изображение в HSV и сфотографировали RGB для InRange().

Благодаря