Как добавить 2 пиксельных значения Mat, перебирая пиксели с помощью OpenCV? - PullRequest
0 голосов
/ 27 мая 2019

У меня 2 мата, оба имеют одинаковый размер. Затем я разделяю эти 2 мата, чтобы обработать значение BGR каждого мата (в моем случае это фактически BGRA). Затем я хочу добавить каждое из значений BGR из этих 2 Mat и сохранить его в переменной blue, green, red.

Я успешно добавил 2 Mat без использования пиксельной итерации, например:

//below operation works
blue = img1_split1[0] + img2_split[0];
green = img1_split[1] + img2_split[1];
red = img1_split[2] + img2_split[2];

Но я сталкиваюсь с исключением необработанным, если я использую пиксельную итерацию и добавляю 2 пиксельных значения из каждого мата, например:

Необработанное исключение в 0x00007FF89AA69129 в VideoStitcher.exe: Microsoft C ++ исключение: cv :: Исключение в ячейке памяти 0x000000ADA5CFD020.

Вот мой код:

Mat img1, img2;
img1 = imread("some_image.jpg");  //this is just for example
img2 = imread("some_image.jpg");

vector<Mat> img1_split, img2_split;

split(img1, img1_split);
split(img2, img2_split);

Mat blue, green, red;

    for (int i = 0; i < img1.rows; i++)
    {
        for (int j = 0; j < img1.cols; j++)
        { //below operation doesn't work
            blue.at<uchar>(i, j) = img1_split1[0].at<uchar>(i, j) + img2_split[0].at<uchar>(i, j);
            green.at<uchar>(i, j) = img1_split[1].at<uchar>(i, j) + img2_split[1].at<uchar>(i, j);
            red.at<uchar>(i, j) = img1_split[2].at<uchar>(i, j) + img2_split[2].at<uchar>(i, j);
        }
    }

Может кто-нибудь указать на ошибку, которую я совершил? Спасибо

1 Ответ

1 голос
/ 27 мая 2019

cv :: Mat работает как общий интеллектуальный указатель, поэтому, когда он создается с помощью конструктора по умолчанию (т. Е. cv::Mat x;), у него нет данных или типа, и его .data нигде не указываются.

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

Mat blue(img1.rows, img1.cols, CV_8UC1), green(img1.rows, img1.cols, CV_8UC1), red(img1.rows, img1.cols, CV_8UC1);

Я использовал CV_8UC1, поскольку они представляют собой одноканальные изображения после их разделения.

Когда вы устанавливаете пиксели подобным образом, вы должны быть осторожны с недостаточным и переполненным ... есть хорошая функция для этого, это вызов saturate_cast .

...