首页 > 解决方案 > 使用 OpenCV 和 C++ 从图像中提取每个 HSV 值

问题描述

我使用下面的代码从任何图像中提取每个 HSV 值并在屏幕上打印每个值。

Mat image_HSV;
cvtColor(ori_image, image_HSV, CV_BGR2HSV);

Mat mask;
inRange(image_HSV, Scalar(100, 0, 0), Scalar(100, 255, 255), mask);

image_HSV.setTo(Scalar(0, 0, 0), mask);

int h = 0;
int s = 0;
int v = 0;

int col = image_HSV.cols; 
int row = image_HSV.rows;

int corow = col * row;  // image's full pixel number

for (int i = 0; i < image_HSV.cols; i++) {      // image row pixel
    for (int j = 0; j < image_HSV.rows; j++) {  // image col pixel
        Vec3b hsv = image_HSV.at<Vec3b>(i,j);

        h += hsv.val[0];
        s += hsv.val[1];
        v += hsv.val[2];

        if (hsv[0] != 100) {
            hsv[0] = 0;
            hsv[1] = 0;
            hsv[2] = 0;
        }
    }
}

cout << "H: " << h / corow << "% \n";
cout << "S: " << s / corow << "% \n";
cout << "V: " << v / corow << "% \n";

waitKey(0);
return 0;

这次我使用了全红色图像,其 RGB 值为 255、0、0。

但是,我从这段代码中得到了一些奇怪的结果。

据我所知,每个 H、S、V 值范围分别由 0-360、0-100 和 0-100 覆盖。

此外,我还关注了下面链接的帖子,但我仍然无法获得正确的值。

OpenCV (C++) - 设置像素的 HSV 值

但是,我仍然不知道如何解决它。

任何帮助将不胜感激!谢谢!

标签: c++opencvhsv

解决方案


推荐阅读