5

2つの画像をオーバーレイするにはどうすればよいですか?基本的に、私はアルファチャネルのない背景を持っており、アルファチャネルのある1つ以上の画像を重ね合わせる必要があります。

次のコードを試しましたが、オーバーレイの結果はひどいものです。

// 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);

私もマージを使用してみましたが、アルファチャネルをサポートしていないことをどこかで読みましたか?

4

2 に答える 2

6

これを行う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はこれをサポートしていないので、アルファチャネルを含むファイルを読み取ることができなかったことに注意してください。そのため、ある種のグラデーションを取得するために、座標からアルファ値を計算しました。

于 2012-05-21T06:38:54.853 に答える
0

おそらく、マージされたチャネル番号は入力とは異なります。交換できます

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

これとともに:

Mat merged; 

このようにして、addWeightedメソッドに正しいパラメーターを使用して宛先マトリックスを作成させます。

于 2012-05-20T21:54:58.203 に答える