У меня возникли проблемы при попытке узнать, как получить доступ к пикселю 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;
}
Как вы можете заметить в следующем примере, модифицируется только треть изображения.
Спасибо за помощь
Я проверил ваш код и обнаружил ошибку. Вы умножили индекс столбца на 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 пешеходный набор данных):
Результат с использованием кода OP:
Результат с использованием пересмотренного кода (с j * img.cols * 3
):
Внутри вашего цикла вы можете сделать:
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
Это то, что вы хотели или я неправильно понял?