Каков наилучший способ определения белого цвета?
Я пытаюсь обнаружить белые объекты в видео. Первый шаг - отфильтровать изображение так, чтобы оно оставляло только пиксели белого цвета. В моем первом подходе использовалось цветовое пространство HSV, а затем проверка на высокий уровень канала VAL. Вот код:
//convert image to hsv
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );
for(int x=0;x<srcSize.width;x++){
for(int y=0;y<srcSize.height;y++){
uchar * hue=&((uchar*) (h_plane->imageData+h_plane->widthStep*y))[x];
uchar * sat=&((uchar*) (s_plane->imageData+s_plane->widthStep*y))[x];
uchar * val=&((uchar*) (v_plane->imageData+v_plane->widthStep*y))[x];
if((*val>170))
*hue=255;
else
*hue=0;
}
}
оставляя результат в канале оттенка. К сожалению, этот подход очень чувствителен к освещению. Я уверен, что есть лучший способ. Любые предложения?
Ответы
Ответ 1
Это будет чувствительно к освещению - что произойдет, если вы просмотрите его под красным светом!
Я не знаю, можно ли использовать пространство YUV намного проще, чем искать аналогичные значения RGB.
edit - обычно вы вызываете что-то без цвета серого (может помочь вам в поиске).
Если у вас есть выбор, это самый худший цвет для поиска, потому что он будет отражать любое другое освещение в сцене. Таким образом, вам придется определять общий цвет освещения и настраивать его.
Итак, вы ищете пиксели с значениями RGB simlar или значения RGB в соотношении среднего значения для объектов в сцене.
Ответ 2
Почему вы используете HSV? Было бы более целесообразно преобразовать в HSL и использовать канал яркости. Конечно, вы не получите только белый цвет, но каждый цвет с высокой яркостью над порогом. В конце концов, вы не можете полагаться на чистый белый цвет, если ваше исходное изображение не было переэкспонировано.
Ответ 3
Другой способ - превратить ваше изображение в оттенки серого. У белых будут очень высокие значения (почти > 225).
Еще один способ - это И-плоскости R, G и B. В итоговом изображении останется только белый цвет. Таким образом, вы не тратите время на вычисление преобразования в цветовое пространство HSV. Вы просто выполняете простую операцию И на каждом пикселе.