【问题标题】:Access pixel value of mask using opencv使用opencv访问掩码的像素值
【发布时间】:2022-01-19 21:36:10
【问题描述】:

我遇到了一个问题,我需要访问 opencv Mat 图像容器的像素。 我使用 opencv inRange 函数来创建掩码。在那个掩码中,我需要检查不同像素的值,但我不会收到我期望收到的值。

// convert image to hsv for better color-detection
cv::Mat img_hsv, maskR, maskY, mask1, mask2;
cv::cvtColor(image, img_hsv, cv::COLOR_BGR2HSV);
// Gen lower mask (0-5) and upper mask (175-180) of RED
cv::inRange(img_hsv, cv::Scalar(0, 50, 20), cv::Scalar(5, 255, 255), mask1);
cv::inRange(img_hsv, cv::Scalar(175, 50, 20), cv::Scalar(180, 255, 255), mask2);
// Merge the masks
cv::bitwise_or(mask1, mask2, maskR);

之后,我尝试读取获得极高值甚至 nans 的像素值,但其中大多数为零,这是预期的,因为蒙版只有黑白

if (maskR.at<double>(position.x, position.y) == 255) 

我有什么遗漏吗?我尝试了 double、uchar、int 和 float

当我打印掩码时,我可以清楚地看到 0 和 255 条目(没有 nans 或奇怪的数字),但是当我使用 at() 函数访问它们时,我不会得到相同的结果。

像素的坐标应该在 Mat 的范围内,因为遮罩的尺寸是 1080x1920,并且没有坐标超过这个范围。

我通过使用 cv::size 得到了维度

【问题讨论】:

  • 你说&lt;double&gt;maskR 真的是CV_64F 类型吗?它是什么类型的?
  • 由于掩码是按位运算的结果,因此 inage 将是灰度的。所以只有一个通道/深度。 CV_8U 是类型

标签: c++ opencv pixel mask mat


【解决方案1】:

我终于找到了自己问题的答案。 当我使用 uchar 时它可以工作:

maskR.at&lt;uchar&gt;(position.x, position.y) == 255

我认为这不起作用,因为使用 std::cout 打印它不会给我输出,但原因是我忘记转换 uchar 以便可以在控制台中打印它

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多