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を新しく作るのがポイント。