🔥 Programming/OpenCV
[OpenCV4] C# OpenCV4 두 이미지 합치기
스쳐가는비
2022. 8. 17. 11:56
C# OpenCV4
비트 연산(Bitwise)와 Add()를 이용한 두 이미지 합치기
배경 이미지
합칠 이미지
합친 후
Split한 B,G,R Test 이미지들
해당 이미지는 Code를 참고하시면 됩니다.
Code
using OpenCvSharp;
using OpenCvSharp.Extensions;
using System.Windows.Forms;
namespace OpenCV4_Processing
{
public partial class Form1 : Form
{
Mat _chuckImg, _stageImg;
Mat logo_mask;
Mat _stageImg_cut;
Mat Img1;
Mat Img2;
Mat temp;
Mat[] Split;
public Form1()
{
InitializeComponent();
CheckMerging();
}
private void CheckMerging()
{
using(_chuckImg = new Mat())
using(_stageImg = new Mat())
using(logo_mask = new Mat())
using(_stageImg_cut = new Mat())
using(Img1 = new Mat())
using(Img2 = new Mat())
using(temp = new Mat())
{
_chuckImg = BitmapConverter.ToMat(Properties.Resources.WAFER);
_stageImg = BitmapConverter.ToMat(Properties.Resources.STAGE);
// 채널 분류
Cv2.Split(_chuckImg, out Split);
Cv2.ImShow("src", _chuckImg);
Cv2.ImShow("Split[0]", Split[0]); // B
Cv2.ImShow("Split[1]", Split[1]); // G
Cv2.ImShow("Split[2]", Split[2]); // R
Cv2.ImShow("Split[3]", Split[3]); // A
// 합칠 이미지 배경 지우기위한 mask
Cv2.Threshold(Split[3], logo_mask, 240, 255, ThresholdTypes.Binary);
// 색반전
Cv2.BitwiseNot(logo_mask, logo_mask);
/*
* 배경 이미지에서 합칠 이미지 크기만큼 잘라낼 Rect
* 이후 Rect의 X,Y 위치부터 합칠 이미지 크기까지 설정
*/
Rect RectInfo = new Rect(new OpenCvSharp.Point(50, 50), new OpenCvSharp.Size(Split[3].Width, Split[3].Height));
// 사각형 크기만큼 잘라냄
_stageImg_cut = _stageImg[RectInfo];
// Image1에 합칠 이미지 연산 후 저장
Cv2.BitwiseAnd(_chuckImg, _chuckImg, Img1);
// Image2에 배경 이미지 연산 후 저장
Cv2.BitwiseAnd(_stageImg_cut, _stageImg_cut, Img2, mask: logo_mask);
// 이미지 두개를 Temp Mat에 저장 후에 배경이미지 잘라낸 부분에 저장
Cv2.Add(Img1, Img2, temp);
_stageImg[RectInfo] = temp;
// 합친 이미지 배경이미지에 저장
pBox_Test.Image = BitmapConverter.ToBitmap(_stageImg);
//// 이미지 메모리 해제
//logo_mask.Release();
//logo_mask.Dispose();
//logo_mask = null;
//
//_stageImg_cut.Release();
//_stageImg_cut.Dispose();
//_stageImg_cut = null;
//
//Img1.Release();
//Img1.Dispose();
//Img1 = null;
//
//Img2.Release();
//Img2.Dispose();
//Img2 = null;
//
//temp.Release();
//temp.Dispose();
//temp = null;
}
}
}
}