【问题标题】:OpenCV (C++) - Set HSV values of a pixelOpenCV (C++) - 设置像素的 HSV 值
【发布时间】:2016-03-07 14:44:13
【问题描述】:

我有一个转换为 HSV 的 RGB 图像,我的目标是将每个不符合特定色调值 (100) 的像素设置为黑色。所以 H = S = V = 0。

我有这段代码:(frame3 是 HSV Mat 图像,hue = 100)

    for (int i = 0; i<frame3.rows; i++)   
    {
        for (int j = 0; j<frame3.cols; j++)
        {
            Vec3b hsv = frame3.at<Vec3b>(i, j);
            int H = hsv.val[0]; //hue
            int S = hsv.val[1]; //saturation
            int V = hsv.val[2]; //value
            if (H != hue) {
                H = 0;
                S = 0;
                V = 0;
            }

        }
    }
    imshow("Processed Hue", frame3);
}

但是当我运行它时没有任何反应..图像保持不变。 当我尝试将 hsv.val[0] 值打印到控制台时,我得到的是字母而不是数字..所以我认为这表明问题出在哪里,但我仍然不知道如何解决它。

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

【问题讨论】:

  • 您只是将 HSV 值的 复制 值分配为 0,而不是原始值。
  • true,但即使我将其更改为将实际值设置为 0,它也不起作用:(
  • 那是因为val 返回一个副本并且不允许修改基础值。要手动执行此操作,您可能希望将 operator[] 用于 Vec3b,因为它会返回一个引用并且可以修改。
  • 但是@Miki 下面的回答是一个更好的解决方案。

标签: opencv hsv


【解决方案1】:

你可以:

  • 构建一个mask,其中 H 通道等于 100,无论 S、V 通道的值如何(使用 inRange
  • 根据掩码将frame3设置为零(使用setTo

类似:

Mat frame3; // CV_8UC3, HSV image

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

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

要保持代码结构,您需要修改实际值,而不是值的副本。你可以这样做保持对值的引用:

 Vec3b& hsv = frame3.at<Vec3b>(i, j);
 if (hsv[0] != hue) {
    hsv[0] = 0;
    hsv[1] = 0;
    hsv[2] = 0;
 }  

【讨论】:

  • 完美!我希望保留我的代码结构,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2019-03-27
  • 2017-07-01
  • 1970-01-01
  • 2016-02-03
  • 2011-12-13
相关资源
最近更新 更多