Самый эффективный метод определения цвета с использованием OpenCV? - PullRequest
2 голосов
/ 21 февраля 2012

Я устанавливаю область интереса где-то рядом с центром моего изображения, используя:

Mat frame;
//frame has been initialized as a frame from a camera input
Rect roi= cvRect(frame.cols*.45, frame.rows*.45, 10, 8);
image_roi= frame(roi);
//I stoped here not knowing what to do next

Я использую камеру, и в любое время, когда я беру кадр, ROI будет где-то между 30% до 100% заполнено желаемым цветом, в данном случае красным.Какой самый эффективный способ узнать, присутствует ли красный цвет в моем текущем кадре?

Решение:

image_roi= frame(roi);// a frame from my camera as a cv::Mat
cvtColor(image_roi, image_roi, CV_BGR2HSV);
thrs= new Mat(image_roi.rows, image_roi.cols, CV_8UC1);//allocate space for new img
inRange(image_roi, Scalar(0,100,100), Scalar(12,255,255), *thrs);//do hsv thresholding for red
for(int i= 0; i < thrs->rows; i++)//sum up
{
    for(int j=0; j < thrs->cols; j++)
    {
        sum= sum+ thrs->data[(thrs->rows)* i + j];
    }
}
if(sum> 100)//my application only cares about red
    cout<<"Red"<<endl;
else
    cout<<"White"<<endl;
sum=0;

Ответы [ 2 ]

4 голосов
/ 23 февраля 2012

Это решение должно касаться не только красного, но и любого цветового распределения :

  1. Получите цветную гистограмму для вашей рентабельности инвестиций, двумерную гистограмму оттенка и насыщенности (см. Пример здесь ).
  2. Используйте calcBackProject для проецирования гистограммы обратно на полное изображение . Вы получите больше значений в пикселях, представляющих цвет около режимов гистограммы (в данном случае, красных).
  3. Порог результата для получения пикселей, которые лучше соответствуют распределению (в данном случае, «лучшие красные»).

Это решение можно использовать, например, для получения простого, но очень функционального детектора кожи .

3 голосов
/ 22 февраля 2012

Полагаю, вы просто хотите узнать процентное содержание красного в ROI. Если это не правильно, уточните.

Я бы сканировал область интереса и конвертировал каждый пиксель в лучшее цветовое пространство для сравнения цветов, такое как YCbCr или HSV. Затем я посчитал бы количество пикселей, где оттенок находится в некоторой дельте оттенка красного (обычно 0 градусов на цветовом круге). Возможно, вам придется столкнуться с некоторыми крайними случаями, когда яркость или насыщенность слишком низки, чтобы человек мог считать их красными, хотя технически они и есть, в зависимости от того, чего вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...