对 OpenCV 图像表示感到困惑

Confused by OpenCV image representation

我正在将图像加载到 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;
    }
}

您当前的计算,

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

为您提供每行的宽度乘以您所在的列,加上当前行号。将某物的宽度乘以你在该宽度上的位置并没有任何意义。

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

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

使用此方法,图像中第一个红色像素的值为:

237 28 36

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