Цветовая идентификация OpenCV - PullRequest
2 голосов
/ 31 октября 2011

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


enter image description here enter image description here


IplImage *imgRead= cvLoadImage("yellow.jpeg",CV_LOAD_IMAGE_COLOR);
if(!imgRead) {
fprintf(stderr, "Error in reading image\n");
exit(1);
}
IplImage *imgHsv = cvCreateImage(cvGetSize(imgRead),8, 3);
cvCvtColor(imgRead, imgHsv,CV_BGR2HSV);

IplImage *imgThreshold = cvCreateImage(cvGetSize(imgRead),8, 1);
cvInRangeS(imgHsv, cvScalar(25, 80, 80,80), cvScalar(34, 255, 255,255), imgThreshold);
cvShowImage("image",imgThreshold);
cvWaitKey(0);

.для желтого как 30. (у gimp hsv значение для желтого цвета - 60).В cvInRangeS, кроме значения оттенка, я не уверен, как указать другие значения для cvScalar.

Какие значения мне нужно поставить?Я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 31 октября 2011

Я думаю, что у вас проблема из-за масштабирования данных HSV до 8 бит.Обычно, как я уверен, вы заметили, что при использовании GIMP масштаб HSV выглядит следующим образом:

H -> [0, 360]
S -> [0, 100]
V -> [0, 100]

Но OpenCV переназначает эти значения следующим образом:

(H / 2) -> [0, 180] (so that the H values can be stored in 8-bits)
S       -> [0, 255]
V       -> [0, 255]

Вот почему рассчитанное значение оттенка составляет 30 вместо 60. Таким образом, чтобы отфильтровать все цвета, кроме желтого, ваш вызов cvInRangeS будет выглядеть примерно так:

cvInRangeS(imgHsv, cvScalar(25, 245, 245, 0), cvScalar(35, 255, 255, 255), imgThreshold);

Четвертый канал не используется для HSV.Этот вызов даст вам 10 значений шума в пороге вашего детектора цвета для каждого измерения.

Как уже упоминалось, SSteve ваш порог должен работать, но вам может потребоваться расширить границы вашего порога, чтобы захватить желтый цветцвет в вашем изображении.

Надеюсь, это поможет!

2 голосов
/ 31 октября 2011

Я запустил твой код, и он работал нормально.Возможно, желтый цвет на вашем изображении не такой желтый, как вы думаете.

enter image description here

Редактировать: Другая разница в потенциале заключается в том, что я использую OpenCV 2.3,Какую версию вы используете?

Хорошо, еще одно редактирование: Вы пытались посмотреть на желтые значения?Это даст вам окончательный ответ относительно того, какие значения вы должны использовать в cvInRangeS.Добавьте эти две строки после вызова cvCvtColor:

uchar* ptr = (uchar*)(imgHsv->imageData);
printf("H: %d, S:%d, V:%d\n", ptr[0], ptr[1], ptr[2]);

Для моего изображения я получил:

H: 30, S:109, V:255

Вот почему ваш код работал для меня.

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