Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c+中使用RGBtoHSV转换器功能后显示HSV图像+;?_C++_Opencv_Hsv - Fatal编程技术网

C++ 如何在c+中使用RGBtoHSV转换器功能后显示HSV图像+;?

C++ 如何在c+中使用RGBtoHSV转换器功能后显示HSV图像+;?,c++,opencv,hsv,C++,Opencv,Hsv,晚上好,在互联网上我们可以找到很多将RGB像素值转换为HSV的算法,但我找不到显示它的函数。我正在使用MS Visual Studio 2013和openCV库。我知道有获取HSV图像的内置函数:cvtColor(obrazeczek1、obrazeczek1、CV_BGR2HSV)但我尝试在没有此函数的情况下执行此操作。例如,要使用函数获取灰度图像,请执行以下操作: #define NORMALIZE_RGB(x) \ (x > 255 ? 255 : (x < 0 ? 0

晚上好,在互联网上我们可以找到很多将RGB像素值转换为HSV的算法,但我找不到显示它的函数。我正在使用MS Visual Studio 2013和openCV库。我知道有获取HSV图像的内置函数:cvtColor(obrazeczek1、obrazeczek1、CV_BGR2HSV)但我尝试在没有此函数的情况下执行此操作。例如,要使用函数获取灰度图像,请执行以下操作:

#define NORMALIZE_RGB(x) \
    (x > 255 ? 255 : (x < 0 ? 0 : x))

cv::Mat rgb2grey(cv::Mat& I)
{
CV_Assert(I.depth() != sizeof(uchar));
cv::Mat  res(I.rows, I.cols, CV_8UC3);
switch (I.channels())  {
case 3:
    cv::Mat_<cv::Vec3b> _I = I;
    cv::Mat_<cv::Vec3b> _R = res;

    for (int i = 0; i < I.rows; ++i)
        for (int j = 0; j < I.cols; ++j){

        int grey = ((_I(i, j)[0]) + (_I(i, j)[1]) + (_I(i, j)[2])) / 3;

            _I(i, j)[0] = NORMALIZE_RGB(grey);
            _I(i, j)[1] = NORMALIZE_RGB(grey);
            _I(i, j)[2] = NORMALIZE_RGB(grey);
        }

    res = _I;
    break;
}
return res;
}
void rgb2hsv(double r, double g, double b, double &h, double &s, double &v)
{
v = max(max(r, g), b);
double t = min(min(r, g), b);
double delta = v - t;
if (v != 0.0)
    s = delta / v;
else
    s = 0.0;
if (s == 0.0)
    h = 0.0;
else
{
    if (r == v)
        h = (g - b) / delta;
    else
        if (g == v)
            h = 2.0 + (b - r) / delta;
        else
            if (b == v)
                h = 4.0 + (r - g) / delta;
    h = h * 60.0;
    if (h < 0.0)
        h += 360;
}
}
我在这里找到了一些建议。我知道如何将RGB像素转换为HSV,但如何使用imshow显示此矩阵?我也找到了功能rgb2hsv,但我不知道要改变什么,显示它。这是一个函数:

#define NORMALIZE_RGB(x) \
    (x > 255 ? 255 : (x < 0 ? 0 : x))

cv::Mat rgb2grey(cv::Mat& I)
{
CV_Assert(I.depth() != sizeof(uchar));
cv::Mat  res(I.rows, I.cols, CV_8UC3);
switch (I.channels())  {
case 3:
    cv::Mat_<cv::Vec3b> _I = I;
    cv::Mat_<cv::Vec3b> _R = res;

    for (int i = 0; i < I.rows; ++i)
        for (int j = 0; j < I.cols; ++j){

        int grey = ((_I(i, j)[0]) + (_I(i, j)[1]) + (_I(i, j)[2])) / 3;

            _I(i, j)[0] = NORMALIZE_RGB(grey);
            _I(i, j)[1] = NORMALIZE_RGB(grey);
            _I(i, j)[2] = NORMALIZE_RGB(grey);
        }

    res = _I;
    break;
}
return res;
}
void rgb2hsv(double r, double g, double b, double &h, double &s, double &v)
{
v = max(max(r, g), b);
double t = min(min(r, g), b);
double delta = v - t;
if (v != 0.0)
    s = delta / v;
else
    s = 0.0;
if (s == 0.0)
    h = 0.0;
else
{
    if (r == v)
        h = (g - b) / delta;
    else
        if (g == v)
            h = 2.0 + (b - r) / delta;
        else
            if (b == v)
                h = 4.0 + (r - g) / delta;
    h = h * 60.0;
    if (h < 0.0)
        h += 360;
}
}
void rgb2hsv(双r、双g、双b、双h、双s、双v)
{
v=最大值(最大(r,g),b);
双t=min(min(r,g),b);
双三角=v-t;
如果(v!=0.0)
s=δ/v;
其他的
s=0.0;
如果(s==0.0)
h=0.0;
其他的
{
如果(r==v)
h=(g-b)/delta;
其他的
如果(g==v)
h=2.0+(b-r)/delta;
其他的
如果(b==v)
h=4.0+(r-g)/delta;
h=h*60.0;
if(h<0.0)
h+=360;
}
}

这里没有类似的问题,请提供帮助。

使用imshow()显示已转换为HSV的图像没有意义

imshow()
认为,矩阵是按BGR顺序排列的。将图像转换为HSV只是将RGB值转换为HSV通道值

它是在3通道之前,转换后也是3通道,但其他值除外
imshow()
仍希望将图像显示为RGB图像,但随后使用HSV值,这会导致图像无效

只需将其转换回RGB即可使
imshow()
正确显示图像

编辑

Mat hsv, bgr; // hsv is the hsv image you want to display
cvtColor(hsv, bgr, CV_HSV2BGR);
imshow("lolz", bgr);

您对颜色空间转换有误解。在进行颜色空间转换时,您可能希望图像在视觉上看起来会有所不同,但事实并非如此

图像仍将包含相同的信息,只是格式不同。就像以
.jpg
.png
等形式存储图像文件一样,它们在语义上仍然是相同的图像。您不需要从
jpg
转换为
png
并再次查看它,因为您知道它看起来是一样的。二进制内容将不同,但语义内容完全相同

HSV、BGR、RGB、LAB只是同一图像的不同表示。无论使用什么颜色空间,图像看起来都是一样的。 OpenCV希望
imshow()
将提供
BGR
颜色空间,因此您需要在显示之前将任何图像转换为
BGR

您已经有了
BGR
图像,因此不需要将其转换为
HSV
来显示它

只有当您将图像转换为灰度时,图像才会真正改变。当你丢失一些信息时,图像会看起来不一样

如果您使用
imshow()
显示HSV图像,它将向您显示一个无效图像,您可能会将其解释为有用或酷的东西。但事实并非如此。它就像一个美丽的虫子,你认为它是一个功能


因此,只需显示BGR图像,它与HSV具有相同的语义内容。

您的媒体或图形控制器是什么?许多图形控制器没有直接支持HSV的API。您正在发送到彩色打印机吗?我在主板上只内置了图形卡(Intel HD3000),但如果我使用此内置函数CV_BGR2HSV,我会看到彩色RGB和HSV之间的差异。您可能需要在显示之前将HSV更改转换回RGB。计算机显示器,以及驱动它们的视频电路和驱动程序,只在RGB工作。有一些视频格式是用YUV表示的,但即使是这些格式也必须转换成RGB。我的问题是:我有RGB图像,可以访问r、g、b通道,我使用公式将r、g、b通道更改为h、s、v,我的矩阵值为“190、0.92、0.87”如果我在这个矩阵中使用imshow函数,它会在HSV模型中显示图像吗?