Я хочу определить уникальные цвета на изображении. Я использую CvScalar loc = cvGet2D(img, i, j);
, а чтобы проверить, является ли местоположение красным или зеленым, я использую CvScalar red = CvScalar.RED;
. Однако логическое вычисление никогда не возвращает значение true, поскольку мое изображение содержит оттенки красного. Есть ли способ изменить CvScalar
, чтобы он игнорировал оттенок, или, может быть, возиться с переменной loc
?
используя cvScalar в javacv?
Ответы (2)
поскольку малейшие биты в красном канале испортят ваш (двоичный) вопрос: «это зеленый»? вы можете получить лучшие результаты, используя здесь какое-то «расстояние».
взяв норму l2 каждого «найденного» и «желаемого» цвета, например:
sqrt(r*r + b*b + g*g);
и пороговое значение diff (чтобы решить, достаточно ли оно близко) может работать намного лучше
OpenCV хранит изображения в формате BGR, поэтому для получения значения зеленого канала вы можете использовать loc.val(1)
(второй канал), а для получения красного канала вы можете использовать loc.val(2)
. Они будут возвращать числа в диапазоне [0, 255]. Затем вы можете сравнить значения пикселей красного и зеленого каналов, чтобы увидеть, является ли пиксель более красным или зеленым.
Однако лучший (и более быстрый) подход, чем перебор каждого пикселя, будет заключаться в следующем:
- Разделите изображение на отдельные красный и зеленый каналы с помощью
cvSplit
. - Используйте
cvCmp
для сравнения красного и зеленого каналов, создавая бинарное изображение, в котором красный канал больше, чем зеленый канал.