OpenCV图像从RGB转换为HSV

时间:2010-06-10 18:58:40

标签: c++ image visual-c++ opencv image-processing

当我在样本图像(RGB)上运行以下代码,然后处理它以显示转换的HSV图像时,两者看起来都不同......

有人可以解释为什么会这样吗? OR
你可以建议一个解决方案吗?不要发生......因为它毕竟是相同的图像

Mat img_hsv,img_rgb,red_blob,blue_blob;
img_rgb = imread("pic.png",1);
cvtColor(img_rgb,img_hsv,CV_RGB2HSV);
namedWindow("win1", CV_WINDOW_AUTOSIZE);
imshow("win1", img_hsv);

3 个答案:

答案 0 :(得分:27)

  1. 我还不太了解新的(2.x)OpenCV,但通常在OpenCV中加载的图像是CV_BGR通道顺序而不是RGB,所以你很可能想要CV_BGR2HSV

  2. OpenCV实际上并不“知道”HSV,它只会在第一个通道中编码Hue,在第二个通道中编码饱和度,在第三个通道中编码值。如果您在OpenCV中显示图像,则highgui假定它是BGR图像,从而将第一个通道(现在为Hue)解释为蓝色等。

答案 1 :(得分:3)

正如此处已经解释的那样,将图像转换为HSV后立即显示是没有意义的,但是这里是一个如何使用V通道的例子:

如果您只想提取V通道,可以使用cvtColor并使用HSV图像中的第3(V)通道设置此图像的灰度副本强度:

Mat grayImg, hsvImg;
cvtColor(img, grayImg, CV_BGR2GRAY);
cvtColor(img, hsvImg, CV_BGR2HSV);
uchar* grayDataPtr = grayImg.data;
uchar* hsvDataPtr = hsvImg.data;
for (int i = 0; i < img.rows; i++)
{
    for (int j = 0; j < img.cols; j++)
    {
        const int hi = i*img.cols*3 + j*3,
                  gi = i*img.cols + j;
        grayDataPtr[gi] = hsvDataPtr[hi + 2];
    }
}
imshow("V-channel", grayImg);

答案 2 :(得分:-1)

[0] = H
[1] = S
[2] = V

也可能

firebaseFirestore.collection("...").addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

            int Counter = documentSnapshots.size();

        }
    });