对 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 的像素。
我正在将图像加载到 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 的像素。