【问题标题】:OpenCV: convert Scalar to different color spaceOpenCV:将标量转换为不同的颜色空间
【发布时间】:2017-08-30 06:53:44
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • stackoverflow.com/questions/35737032/… 这有帮助还是属于“转换整个图像”?
  • 是的,类似于下面 Rama 的解决方案——我仍然很惊讶它需要两个额外的结构来执行这个看似简单的任务,而 OpenCV 中的其他一切都非常流畅。

标签: c++ opencv color-space


【解决方案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);

【讨论】:

  • 这会引发异常:OpenCV Error: Assertion failed (scn == 3 && (dcn == 3 || dcn == 4) && (depth == CV_8U || depth == CV_32F)) in cvtColor, file /build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/imgproc/src/color.cpp, line 4040
  • 对不起,但这仍然给出了同样的例外......?
【解决方案2】:

虽然不是最佳选择,但您可以使用以下方法:

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

【讨论】:

  • 在最后一行给出error: could not convert ‘rgb.cv::Mat::at<cv::Vec<unsigned char, 3> >(0)’ from ‘cv::Vec<unsigned char, 3>’ to ‘cv::Scalar {aka cv::Scalar_<double>}’
  • @fuenfundachtzig 也许从 Vec3b 到 Scalar 的直接转换只是 OpenCV3 的事情,我会更新代码以兼容。
【解决方案3】:

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

【讨论】:

    【解决方案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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2014-06-17
      • 2013-08-15
      相关资源
      最近更新 更多