首页 > 解决方案 > opencv中的色相值范围

问题描述

请注意,OpenCV 的色调值范围为 [0 179](使用 OpenCV 检测图像中的红色圆圈)(如果陈述不正确,请纠正我)。下面是我获取 Mat 图像色调值的函数:

Mat MainWindow::getHue(const Mat &src)
{
    Mat bgr32; //CV_32FC3
    src.convertTo(bgr32,CV_32FC3,1/255.0);

    Mat hsv(bgr32.size(), CV_32FC3);
    cvtColor(bgr32,hsv, COLOR_BGR2HSV);

    Mat hue(hsv.size(), CV_32FC1);
    Mat sat(hsv.size(), CV_32FC1);
    Mat val(hsv.size(), CV_32FC1);
    Mat out[] = {hue,sat,val};
    split(hsv,out);

    return hue;
}

这样生成的色调值实际上在 [0, 360] 的范围内。问题是什么?我用opencv3.4.5.

标签: opencv

解决方案


是 RGB 到 HSV 转换的文档。

由于 的范围uchar是 [0,255],因此您无法存储整个色调范围。因此,opencv 决定使用一个技巧。对于这种类型的矩阵,将色调除以 2。但是,此技巧仅用于uchar矩阵。可以存储整个色调范围的浮点矩阵不必求助于此。

要查看实际操作中的技巧,只需使用uchar矩阵:

Mat MainWindow::getHue(const Mat &src)
{

    Mat hsv(src.size(), CV_8UC3);
    cvtColor(src,hsv, COLOR_BGR2HSV);

    Mat hue(hsv.size(), CV_8UC1);
    Mat sat(hsv.size(), CV_8UC1);
    Mat val(hsv.size(), CV_8UC1);
    Mat out[] = {hue,sat,val};
    split(hsv,out);

    return hue;
}

现在hue在 [0, 180] 范围内。


推荐阅读