OpenCV копирование части изображения - PullRequest
3 голосов
/ 29 мая 2020

Что я пытаюсь сделать

Я пытаюсь вставить подраздел одного изображения на другое для части проекта, над которым я работаю на. Когда я попытался просмотреть то, что у меня было до сих пор, я увидел, что вызов imshow() на обоих изображениях для проверки на самом деле не показывает, что оба они имеют одинаковые значения BRG в точках, которые должны.

Что не так

Значения почти всегда неверны, и часто половина экрана отображается черным.

IE: пиксель [0,1] из firstIMG будет иметь [91,21,30], а secondIMG будет иметь другие значения при наведении курсора на пиксель на экране imshow()

Код

// Randomly create an image of 10x10 pixels
Mat firstIMG = Mat(10, 10, CV_8UC3);
randu(firstIMG, Scalar::all(0), Scalar::all(255));
imshow("First", firstIMG);
waitKey();

// Create a second image of same type as the first
Mat secondIMG = Mat::zeros(firstIMG.rows-5, firstIMG.cols-5, firstIMG.type());

// Iterate through all rows of secondIMG
for(int i = 0; i < secondIMG.rows; i++) {

    // Iterate through all columns of secondIMG
    for(int j = 0; j < secondIMG.cols; j++) {
        secondIMG.at<unsigned char>(i, j) = firstIMG.at<unsigned char>(i, j);
    }   
}

imshow("Second", secondIMG);
waitKey();


То, что я пробовал до сих пор

Он распечатает одни и те же точные данные для обоих изображений, если я буду повторять каждый пиксель каждого изображения, но когда я используйте imshow() на secondIMG многие, если не все пиксели неправильные.

Несмотря на это, я также пробовал получить доступ и изменить значения BRG для secondIMG разными способами, [как в этом посте] [1]. Это по-прежнему приводит к тому же результату совершенно разных ценностей в тех точках, которые они разделяют.

Наконец, я также попробовал просто clone() firstIMG с тем же размером и всем остальным, что также привело к той же ошибке, что и выше.

1 Ответ

1 голос
/ 30 мая 2020

Это должно быть cv::Vec3b вместо uchar для цветного изображения.

Вместо зацикливания пикселей вы можете использовать оптимизированные встроенные функции.

cv::Mat secondIMG(firstIMG.rows, firstIMG.cols, firstIMG.type());
cv::Rect rect(0, 0, secondIMG.cols, secondIMG.rows);  // x, y, width, height

firstIMG(rect).copyTo(secondIMG);
// or
cv::Mat thirdIMG = firstIMG(rect).clone();
...