请注意,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
。
答案 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]。