HSV изображение в openCV для распознавания цвета

У меня есть следующее изображение BGR (передняя часть автомобиля), я хочу узнать его цвет

введите описание изображения здесь

Я преобразовал его в HSV (я знаю, что imshow () не понимает HSV и напечатает его как BGR)
введите описание изображения здесь

1:
Теперь я хочу получить значение оттенка и узнать, в каком диапазоне он находится, чтобы распознать цвет

  • как рассчитать количество или значение оттенка?
  • как указать диапазоны? использование скалярного метода дает мне BGR диапазонов

Код

int main()
{
Mat image;
image = imread("carcolor.png", CV_LOAD_IMAGE_COLOR);

if (!image.data)
{
cout << "Could not open or find the image" << std::endl;
return -1;
}

// Create a new matrix to hold the HSV image
Mat HSV;

// convert RGB image to HSV
cvtColor(image, HSV, CV_BGR2HSV);

namedWindow("Display window", CV_WINDOW_AUTOSIZE);
imshow("Display window", image);

namedWindow("Result window", CV_WINDOW_AUTOSIZE);
imshow("Result window", HSV);vector<Mat> hsv_planes;
split(HSV, hsv_planes);
Mat h = hsv_planes[0]; // H channel
Mat s = hsv_planes[1]; // S channel
Mat v = hsv_planes[2]; // V channel

namedWindow("hue", CV_WINDOW_AUTOSIZE);
imshow("hue", h);
namedWindow("saturation", CV_WINDOW_AUTOSIZE);
imshow("saturation", s);
namedWindow("value", CV_WINDOW_AUTOSIZE);
imshow("value", v);//// red color range
Scalar hsv_l(170, 150, 150);
Scalar hsv_h(180, 255, 255);
Mat bw;
inRange(HSV, hsv_l, hsv_h, bw);
imshow("Specific Colour", bw);
////

// hue value

//define ranges

waitKey(0);
return 0;
}

2

Решение

Оттенок — это круговой диапазон, и красный цвет находится точно в начале / конце этого круга, поэтому значение красного оттенка покрывается двумя различными диапазонами: [0 .. n] а также [360-n .. 360], Как вы использовали в своем коде, openCV вдвое увеличивает весь диапазон [0 .. 180] из-за байтового покрытия.

Так в дополнение к Scalar hsv_l(170, 150, 150); а также Scalar hsv_h(180, 255,255); вам понадобится второй диапазон.

Полный код для поиска диапазона может быть:

//// red color rangeS
int redRange = 10;

Scalar hsv_upper_l(180-n, 150, 150);
Scalar hsv_upper_h(180, 255, 255);
Mat red_hue_upper;
inRange(HSV, hsv_upper_l, hsv_upper_h, red_hue_upper);

Scalar hsv_lower_l(0, 150, 150);
Scalar hsv_lower_h(0+n, 255, 255);
Mat red_hue_lower;
inRange(HSV, hsv_lower_l, hsv_lower_h, red_hue_lower);

cv::Mat whole_red_hue = red_hue_lower | red_hue_upper;

imshow("Specific Colour", whole_red_hue);

Производя из этого ввода, что вывод:

введите описание изображения здесь
введите описание изображения здесь

Для разных цветов это проще (так как они не расположены вокруг начала / конца круга):

int hueCenter = ...; // any hue value of the color
int hueRange = 10; // or any other range
cv::Mat hueMask;
inRange(HSV, Scalar(hueCenter-hueRange, 150, 150), Scalar(hueCenter+hueRange, 255, 255), hueMask);

надеюсь это поможет.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]