используя cvScalar в javacv?

Я хочу определить уникальные цвета на изображении. Я использую CvScalar loc = cvGet2D(img, i, j);, а чтобы проверить, является ли местоположение красным или зеленым, я использую CvScalar red = CvScalar.RED;. Однако логическое вычисление никогда не возвращает значение true, поскольку мое изображение содержит оттенки красного. Есть ли способ изменить CvScalar, чтобы он игнорировал оттенок, или, может быть, возиться с переменной loc?


person Steve    schedule 11.02.2013    source источник


Ответы (2)


поскольку малейшие биты в красном канале испортят ваш (двоичный) вопрос: «это зеленый»? вы можете получить лучшие результаты, используя здесь какое-то «расстояние».

взяв норму l2 каждого «найденного» и «желаемого» цвета, например:

sqrt(r*r + b*b + g*g);

и пороговое значение diff (чтобы решить, достаточно ли оно близко) может работать намного лучше

person berak    schedule 11.02.2013

OpenCV хранит изображения в формате BGR, поэтому для получения значения зеленого канала вы можете использовать loc.val(1) (второй канал), а для получения красного канала вы можете использовать loc.val(2). Они будут возвращать числа в диапазоне [0, 255]. Затем вы можете сравнить значения пикселей красного и зеленого каналов, чтобы увидеть, является ли пиксель более красным или зеленым.

Однако лучший (и более быстрый) подход, чем перебор каждого пикселя, будет заключаться в следующем:

  1. Разделите изображение на отдельные красный и зеленый каналы с помощью cvSplit.
  2. Используйте cvCmp для сравнения красного и зеленого каналов, создавая бинарное изображение, в котором красный канал больше, чем зеленый канал.
person ajshort    schedule 11.02.2013