OpenCV:将Scalar转换为不同的色彩空间

11

我正在使用Scalar来定义使用OpenCV绘制的矩形的颜色:

rectangle(imgOriginal, Point(0, 0), Point(25, 50), Scalar(H, S, V), CV_FILLED);

然而,颜色是在HSV颜色空间中定义的,而不是RGB(imgOriginal是RGB)。

我如何将 Scalar (或其输入,整数变量 H S V )转换为RGB?

(到目前为止,我只找到了告诉我如何使用cvtColor转换整个图像的答案,这不是我想要的。)


这能帮助你吗?还是属于“转换整个图像”? - Tony J
是的,类似于Rama在下面提供的解决方案——我仍然感到惊讶,居然需要额外的两个结构才能执行这个看似简单的任务,而OpenCV中的其他部分都如此简洁。 - fuenfundachtzig
4个回答

8
尽管不够优化,但您可以使用以下内容:
Scalar ScalarHSV2BGR(uchar H, uchar S, uchar V) {
    Mat rgb;
    Mat hsv(1,1, CV_8UC3, Scalar(H,S,V));
    cvtColor(hsv, rgb, CV_HSV2BGR);
    return Scalar(rgb.data[0], rgb.data[1], rgb.data[2]);
}

1
在最后一行出现了“错误:无法将‘rgb.cv :: Mat :: at <cv :: Vec <unsigned char,3>>(0)’从‘cv :: Vec <unsigned char,3>’转换为‘cv :: Scalar {aka cv :: Scalar_ <double>}’” 的错误。 - fuenfundachtzig
@fuenfundachtzig 或许从Vec3b到Scalar的直接转换只是OpenCV3的特性,我会更新代码以保持兼容性。 - Morris Franken

4
这对我有用,
Mat rgb;
Mat hsv(1, 1, CV_8UC3, Scalar(224, 224, 160));

cvtColor(hsv, rgb, CV_HSV2BGR);
Scalar rgb = Scalar((int)rgb.at<cv::Vec3b>(0, 0)[0],(int)rgb.at<cv::Vec3b>(0, 0)[0],(int)rgb.at<cv::Vec3b>(0, 0)[0])

1

OpenCV 3.2.0。注意:h的范围在[0,360]之间,而l和s的范围在[0,1]之间。

        Mat hls(1, 1, CV_32FC3, Scalar(h, l, s));
        Mat rgb;
        cvtColor(hls, rgb, COLOR_HLS2RGB);
        Scalar c = Scalar(255*rgb.at<float>(0,0), 255*rgb.at<float>(0,1), 255*rgb.at<float>(0,2));

-1

使用此方法将单个值进行转换:

cv::Vec3f rgb;
cv::Vec3f hsv;
hsv[0] = H;
hsv[1] = S;
hsv[2] = V;
cvtColor(hsv, rgb, CV_HSV2BGR);

然后你可以使用它:

rectangle(imgOriginal, Point(0, 0), Point(25, 50), 
    Scalar(rgb[0], rgb[1], rgb[2]), CV_FILLED);

1
这会抛出一个异常:OpenCV错误:在cvtColor中的文件/build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/imgproc/src/color.cpp的第4040行中断言失败(scn == 3 && (dcn == 3 || dcn == 4) && (depth == CV_8U || depth == CV_32F)) - fuenfundachtzig
2
抱歉,但仍然会出现相同的异常...? - fuenfundachtzig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接