I have the following BGR image (a car's front), I want to recognize its color
I converted it to HSV (I know imshow() doesn't understand the HSV and will print it as BGR)
1: Now, I want to get the hue value and know in which range it lies to recognize the color
- how to calculate the number or value of hue?
- how to specify ranges? using scalar method gives me bgr ranges
Code
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;
}
Hue is a circular range and red is exactly at the start/end of that circle, so red hue value is covered by two different ranges:
[0 .. n]
and[360-n .. 360]
. As you used in your code, openCV additionally halfs the whole range to[0 .. 180]
because of byte coverage.So in addition to
Scalar hsv_l(170, 150, 150);
andScalar hsv_h(180, 255,255);
you'll need a second range.Full code to find the range could be:
Producing from this input that output:
For different colors it is easier (since they aren't placed around circle's start/end):
hope this helps.