我有以下BGR图像(汽车的正面),我想识别它的颜色
我将它转换为HSV(我知道imshow()不了解HSV并将其打印为BGR)
1: 现在,我想得到色调值并知道识别颜色所在的范围
代码
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;
}
答案 0 :(得分:2)
Hue是一个圆形范围,红色恰好位于该圆的开始/结束处,因此红色色调值由两个不同的范围覆盖:[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);
希望这会有所帮助。