Как получить доступ к интенсивности всех пикселей изображения в openCV C ++ - PullRequest
0 голосов
/ 03 ноября 2018

Для доступа к одной точке, я использую эту строку кода, и она работает

int intensity = gray_image.at<uchar>(Point(100, 100));

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

for (int i = 0; i < gray_image.rows;i++)
{
    for (int j = 0; j < gray_image.cols; j++) {
        intensity += gray_image.at<uchar>(Point(i, j));
    }
}

Когда я запускаю приведенный выше код, он не выдает ошибку времени компиляции, но дает исключение памяти. Куда я иду не так?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вы можете просто пропустить использование Point и сделать следующее.

for (int i = 0; i < gray_image.rows;i++)
{
    for (int j = 0; j < gray_image.cols; j++) {
        intensity += gray_image.at<uchar>(i, j);
    }
}
0 голосов
/ 03 ноября 2018

Вы запрашиваете пиксель (j, i), который не существует. Это не было бы ошибкой в ​​квадратном изображении (где число строк = количество столбцов), но вы используете прямоугольное изображение.

Функция Mat :: at имеет несколько прототипов, два из которых вас интересуют:

C++: template<typename T> T& Mat::at(int i, int j)
C++: template<typename T> T& Mat::at(Point pt)

Документация для Mat :: at гласит, что точка pt определена как позиция элемента, указанная как точка (j, i), поэтому вы эффективно поменялись местами в строках и столбцах.

Причина, по которой это происходит, состоит в том, что изображение хранится в одномерном массиве пикселей, и для получения пикселя точка (r, c) переводится в p = r * image.cols + c;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...