【问题标题】:OpenCV - cvtColor does not change colorspace, it changes colorsOpenCV - cvtColor 不会改变颜色空间,它会改变颜色
【发布时间】:2016-09-11 13:07:10
【问题描述】:

我正在尝试按照以下 Python 示例使用 OpenCV 3.1.0 和 C++ 制作对象跟踪器:http://docs.opencv.org/3.1.0/df/d9d/tutorial_py_colorspaces.html#gsc.tab=0

我对 cvtColor() 函数有一些问题,因为它改变了我的图像的颜色,而不是它的色彩空间。我有这个代码:

Mat original_image;
original_image = imread(argv[1], CV_LOAD_IMAGE_COLOR); // The image is passed as arg
if (!original_image.data)
{
    printf("Problem!\n");
    return -1;
}

// From BGR to HSV
Mat hsv_image(original_image.rows, original_image.cols, original_image.type());
cvtColor(original_image, hsv_image, CV_BGR2HSV);
imwrite("hsv_image.png", hsv_image);

original_image 是一个 CV_8UC3,与 cvtColor() 兼容,应该在 BGR 颜色空间中。

我用 GIMP 制作了下面的测试图像:

我得到了这张图片:

我决定尝试从 BGR 到 RGB 的转换,将 BGR2HSV 更改为 BGR2RGB,并且使用相同的测试图像,我得到了这个结果

这里,直接改变图片的通道就更清楚了……

有人知道这里发生了什么吗?

【问题讨论】:

  • 在第二张图片中,您将HSV image(即色相、饱和度、值)的通道分别解释为蓝色、绿色和红色。您期望得到什么结果(imwrite 期望 BGR)?
  • 基本上你没有注意到imwrite() 的文档中的这个重要信息:“只有 8-bit... 3-channel (with 'BGR' channel order) 图像可以使用这个保存函数。”
  • 非常感谢丹!我真的没有检查,我认为问题出在转换中,我没有检查 imwrite() 函数。再次感谢您!

标签: c++ opencv hsv bgr


【解决方案1】:

函数imwrite 不关心颜色空间垫有什么,并且不存储此信息。根据文档,它是 BGR 订单。

所以在保存图像之前你应该确定它是 BGR。

如果您真的想将图像保存为 HSV,请使用 file storages

【讨论】:

    【解决方案2】:

    试试这个:

    // From BGR to HSV
    Mat hsv_image;
    cvtColor(original_image, hsv_image, COLOR_BGR2HSV);
    imwrite("hsv_image.png", hsv_image);
    

    【讨论】:

    • 这将与 OP 示例中的最后 3 行具有相同的效果。它也没有回答他的问题,这不明白为什么用imwrite 保存 HSV 图像会返回废话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2021-11-10
    相关资源
    最近更新 更多