shikoan’s memo

プログラミング初心者のチラ裏

ぷろぐらみんぐ帳

OpenCvSharp3で画像合成

メモがてらに。OpenCV独特のMat形式の扱いに慣れるのが大変だった。

hotspring.jpgはWikipediaより。これとレナをアルファブレンディングで合成してみる。

var bigImg = new Mat("hotspring.jpg");

using (var smallImg = new Mat("lenna.png"))
{
    //貼り付ける画像を50%縮小
    var contract = new Mat();
    Cv2.Resize(smallImg, contract, new OpenCvSharp.Size(0.5 * smallImg.Width, 0.5 * smallImg.Height), 0, 0, InterpolationFlags.Lanczos4);

    //貼り付ける範囲を指定して貼り付け
    var rect = new Rect((bigImg.Width - contract.Width) / 2, 0, contract.Width, contract.Height);
    var pastedMat = new Mat();
    Cv2.AddWeighted(new Mat(bigImg, rect), 0.2, contract, 0.8, 0, pastedMat);
    //※AddWeightedを使わずにAddを使うとアルファブレンディングしない<s>ただの貼り付け</s>

    //貼り付けた部分を置き換え
    bigImg[rect] = pastedMat;

    //保存
    Cv2.ImWrite("lenna_hotspring.png", bigImg);

    contract.Dispose();
    pastedMat.Dispose();
    bigImg.Dispose();
}

ちなみにAddWeightedを使わずにAddを使うとただの貼り付け合成になる→訂正:加算になったので、ただの貼り付けをしたい場合はbigImg[rect]=smallImgのように素直に置き換えましょう。サイズが異なる画像を貼り付けるときは貼り付ける範囲のMatを新しく作るのがポイント。