与OpenCV图像表示混淆

时间:2018-10-09 13:33:44

标签: c++ opencv opencv3.0 opencv3.1 opencv-mat

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

enter image description here

2 个答案:

答案 0 :(得分:1)

您当前的计算,

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

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

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

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

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

237 28 36

答案 1 :(得分:1)

enter image description here

所附图片说明了Mat通过3个通道访问像素的情况。