Как наложить изображения с помощью OpenCv?

Как я могу наложить два изображения? По сути, у меня есть фон без альфа-канала и одного или нескольких изображений с альфа-каналом, которые нужно накладывать друг на друга.

Я пробовал следующий код, но результат наложения ужасен:

// create our out image
Mat merged (info.width, info.height, CV_8UC4);

// get layers
Mat layer1Image = imread(layer1Path);
Mat layer2Image = imread(layer2Path);

addWeighted(layer1Image, 0.5, layer2Image, 0.5, 0.0, merged);

Я также пытался использовать слияние, но я где-то читал, что он не поддерживает альфа-канал?

2 ответа

Решение

Я не знаю о функции OpenCV, которая делает это. Но вы могли бы просто реализовать это самостоятельно. Это похоже на addWeighted функция. Но вместо фиксированного веса 0.5 веса вычисляются из альфа-канала наложенного изображения.

    Mat img = imread("bg.bmp");
    Mat dst(img);
    Mat ov = imread("ov.tiff", -1);


    for(int y=0;y<img.rows;y++)
    for(int x=0;x<img.cols;x++)
    {
            //int alpha = ov.at<Vec4b>(y,x)[3];
            int alpha = 256 * (x+y)/(img.rows+img.cols);
            dst.at<Vec3b>(y,x)[0] = (1-alpha/256.0) * img.at<Vec3b>(y,x)[0] + (alpha * ov.at<Vec3b>(y,x)[0] / 256);
            dst.at<Vec3b>(y,x)[1] = (1-alpha/256.0) * img.at<Vec3b>(y,x)[1] + (alpha * ov.at<Vec3b>(y,x)[1] / 256);
            dst.at<Vec3b>(y,x)[2] = (1-alpha/256.0) * img.at<Vec3b>(y,x)[2] + (alpha * ov.at<Vec3b>(y,x)[2] / 256);
    }

    imwrite("bg_ov.bmp",dst);

Обратите внимание, что я не смог прочитать файл с альфа-каналом, потому что, очевидно, OpenCV не поддерживает это. Вот почему я вычислил альфа-значение из координат, чтобы получить какой-то градиент.

Скорее всего, номер канала слияния отличается от входов. Вы можете заменить

Mat merged (info.width, info.height, CV_8UC4);

с этим:

Mat merged; 

Таким образом, вы позволите addWeighted Метод создания матрицы назначения с правильными параметрами.

Другие вопросы по тегам