Смущает представление изображений OpenCV - PullRequest
0 голосов
/ 09 октября 2018

Я загружаю изображение в 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 голосов
/ 20 ноября 2018

enter image description here

Прикрепленное изображение объясняет пиксельный доступ Mat с использованием 3 каналов.

0 голосов
/ 09 октября 2018

Ваш текущий расчет,

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

дает вам ширину каждой строки, умноженную на столбец, на котором вы находитесь, плюс номер текущей строки.Умножение ширины чего-либо на то, где вы находитесь на этой ширине, не даст вам ничего значимого.

Что вам действительно нужно, так это ширина строки, умноженная на номер строки, на которой вы находитесь.Это дает вам смещение первого байта этой строки.Затем вам нужно добавить смещение к первому байту триплета BGR в этой строке, которое в 3 (количество каналов) умножается на столбец, в котором вы находитесь.Оттуда вы можете получить смещения для значений BGR:

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

Используя этот метод, значение первого красного пикселя в вашем изображении будет:

237 28 36
...