OpenCV中的色相值范围

时间:2019-04-28 21:18:41

标签: opencv

请注意,OpenCV的色相值范围为[0 179](Detect red circles in an image using 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

1 个答案:

答案 0 :(得分:1)

Here是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]。