gpt4 book ai didi

c++ - openCV 中用于颜色识别的 HSV 图像

转载 作者:太空狗 更新时间:2023-10-29 21:38:26 29 4
gpt4 key购买 nike

我有以下 BGR 图像(汽车的前部),我想识别它的颜色

enter image description here

我将其转换为 HSV(我知道 imshow() 不理解 HSV 并将其打印为 BGR) enter image description here

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;
}

最佳答案

色调是一个圆形范围,红色恰好位于该圆形的开始/结束处,因此红色色调值包含在两个不同的范围内:[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);

从这个输入产生输出:

enter image description here enter image description here

对于不同的颜色更容易(因为它们没有放置在圆圈的开始/结束周围):

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);

希望这对您有所帮助。

关于c++ - openCV 中用于颜色识别的 HSV 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522599/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com