Ошибка с пиксельным доступом в OpenCV 2.x

У меня возникли проблемы при попытке узнать, как получить доступ к пикселю RGB в новой версии (2.x) OpenCV. Я пытался использовать сочетание старого и нового метода, но безуспешно.

Вот мой код

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace cv;
using namespace std;

int main (int argc, char* argv[])
{
Mat img;string winMain = "Main";

img = imread(argv[1]);

for (int j = 0; j < img.rows; j++)
{
for (int i = 0; i < img.cols; i++)
{
img.data[j * img.cols + i * 3 + 0] = (uchar)0; //B
//img.data[j * img.cols + i + 1] = (uchar)0; //G
//img.data[j * img.cols + i + 2] = (uchar)0; //R
}
}

namedWindow(winMain);

imshow(winMain, img);

waitKey();

return 1;
}

Как вы можете заметить в следующем примере, модифицируется только треть изображения.

Ссылка на пример

Спасибо за помощь

2

Решение

Я проверил ваш код и обнаружил ошибку. Вы умножили индекс столбца на 3 (i * 3), но также необходимо умножить индекс строки на 3 (j * img.cols * 3).

Я заменил j * img.cols с j * img.cols * 3:

for (int j = 0; j < img.rows; j++)
{
for (int i = 0; i < img.cols; i++)
{
img.data[j * img.cols * 3 + i*3 + 0] = (uchar)0; //B
//img.data[j * img.cols * 3 + i*3 + 1] = (uchar)0; //G
//img.data[j * img.cols * 3 + i*3 + 2] = (uchar)0; //R
}
}

Давайте попробуем пример.

Пример изображения (от MIT пешеходный набор данных):

оригинал img

Результат с использованием кода OP:

OP's code

Результат с использованием пересмотренного кода (с j * img.cols * 3):

Новый код

4

Другие решения

Внутри вашего цикла вы можете сделать:

img.at<Vec3b>(j,i)[0] = 0;    // Blue Channel
img.at<Vec3b>(j,i)[1] = 0;    // Green Channel
img.at<Vec3b>(j,i)[2] = 0;    // Red Channel

Это то, что вы хотели или я неправильно понял?

1