Смущает представление изображений OpenCV
Я загружаю изображение в 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;
}
}
2 ответа
Ваш текущий расчет,
b = input[img.step * j + i];
дает вам ширину каждой строки, умноженную на столбец, на котором вы находитесь, плюс номер текущей строки. Умножение ширины чего-либо на то, где вы находитесь на этой ширине, не даст вам ничего значимого.
То, что вы действительно хотите, это ширина строки, умноженная на номер строки, на которой вы находитесь. Это дает вам смещение первого байта этой строки. Затем вам нужно добавить смещение к первому байту триплета BGR в этой строке, которое 3
(количество каналов), умноженное на столбец, на котором вы находитесь. Оттуда вы можете получить смещения для значений BGR:
b = input[img.step * i + img.channels() * j];
Используя этот метод, значение первого красного пикселя в вашем изображении:
237 28 36