0

我正在将图像加载到cv::Mat. 出于某种原因,当我打印每个像素数据时,颜色与实际图像像素不匹配。显然,图像上没有(28, 36, 255), (127, 127, 255)颜色。有人可以指出我的错误吗?这是代码和测试图像。

cv::Mat img = imread("image.png", CV_LOAD_IMAGE_COLOR);
auto *input = (unsigned char*)(img.data);
int r, g, b;
for (int i = 0; i < img.rows; i++) {
    for (int j = 0; j < img.cols; j++) {
        b = input[img.step * j + i];
        g = input[img.step * j + i + 1];
        r = input[img.step * j + i + 2];
        std::cout << r << " " << g << " " << b << std::endl;
    }
}

在此处输入图像描述

4

2 回答 2

1

您当前的计算,

b = input[img.step * j + i];

给你每行的宽度乘以你所在的列,再加上当前的行号。将某物的宽度乘以您在该宽度上的位置不会给您任何有意义的东西。

你真正想要的是行的宽度乘以你所在的行号。这为您提供了该行第一个字节的偏移量。然后,您需要将偏移量添加到该行中 BGR 三元组的第一个字节,即3(通道数)乘以您所在的列。从那里您可以获得 BGR 值的偏移量:

b = input[img.step * i + img.channels() * j];

使用这种方法,图像中第一个红色像素的值是:

237 28 36
于 2018-10-09T15:42:07.427 回答
1

在此处输入图像描述

附图解释了 Mat 使用 3 个通道的像素访问。

于 2018-11-20T05:31:31.143 回答