C# OpenCV 강좌 : 제 43강 - Background Remove (Mat)

   

배경 삭제 (Background Remove, Background Subtractor)


0 BackgroundSubtractor 함수를 이용하여 영상에서의 배경을 지울 수 있습니다. 프레임들을 비교하여 움직이는 물체(object)만 표시합니다.

이미지에는 적용할 수 없으며 카메라 영상을 이용하여 프레임을 비교하여 배경을 삭제합니다.


Main Code


using OpenCvSharp;
using OpenCvSharp.CPlusPlus;


public void BackgroundSubtractor()
{
    using (VideoCapture video = new VideoCapture(0))
    using (BackgroundSubtractorGMG GMG = new BackgroundSubtractorGMG())
    using (BackgroundSubtractorMOG MOG = new BackgroundSubtractorMOG())
    using (BackgroundSubtractorMOG2 MOG2 = new BackgroundSubtractorMOG2())
    using (Mat frame = new Mat())
    using (Mat remove = new Mat())
    using (Window win_GMG = new Window("GMG"))
    using (Window win_MOG = new Window("MOG"))
    using (Window win_MOG2 = new Window("MOG2"))
    {
        video.FrameWidth = 640;
        video.FrameHeight = 480;

        while (Cv.WaitKey(1) < 0)
        {
            video.Read(frame);

            GMG.Run(frame, remove);
            win_GMG.ShowImage(remove);

            MOG.Run(frame, remove);
            win_MOG.ShowImage(remove);

            MOG2.Run(frame, remove);
            win_MOG2.ShowImage(remove);
        }
    }
}


Class Code


using OpenCvSharp;
using OpenCvSharp.CPlusPlus;

BackgroundSubtractor 함수를 사용하기 위해서는 네임스페이스using OpenCvSharp.CPlusPlus;를 선언해야 사용할 수 있습니다.


using (VideoCapture video = new VideoCapture(0))

Mat 형식의 영상을 생성합니다.


using (BackgroundSubtractorGMG GMG = new BackgroundSubtractorGMG())
using (BackgroundSubtractorMOG MOG = new BackgroundSubtractorMOG())
using (BackgroundSubtractorMOG2 MOG2 = new BackgroundSubtractorMOG2())

3가지의 함수를 이용하여 배경을 삭제할 수 있습니다.

BackgroundSubtractorGMG, BackgroundSubtractorMOG, BackgroundSubtractorMOG2 함수를 사용합니다.


using (Mat frame = new Mat())
using (Mat remove = new Mat())

video의 프레임을 저장할 frame 변수와 배경이 삭제된 후 출력할 remove를 생성합니다.


using (Window win_GMG = new Window("GMG"))
using (Window win_MOG = new Window("MOG"))
using (Window win_MOG2 = new Window("MOG2"))

Window창을 선언하여 결과를 표시할 윈도우 창을 생성합니다.


video.FrameWidth = 640;
video.FrameHeight = 480;

프레임의 너비높이를 설정합니다.


while (Cv.WaitKey(1) < 0)
{
    ...
}

키 입력이 있을 때 까지 반복합니다.


video.Read(frame);

frame비디오 장치에서 읽어온 영상을 저장합니다.


GMG.Run(frame, remove);
win_GMG.ShowImage(remove);

MOG.Run(frame, remove);
win_MOG.ShowImage(remove);

MOG2.Run(frame, remove);
win_MOG2.ShowImage(remove);

GMG, MOG, MOG2에 배경 삭제 함수를 적용합니다. *.Run(원본, 결과)입니다.

그 후, ShowImage(출력 이미지)를 사용하여 결과를 표시합니다.


  • Tip : Window 창을 사용하지 않고 Form에 띄울 경우 pictureBoxIpl1.ImageIpl = remove.ToIplImage();를 사용합니다.


색상 적용

GMG.Run(frame, remove);
Cv2.BitwiseAnd(frame, remove.CvtColor(ColorConversion.GrayToBgr), remove);
win_GMG.ShowImage(remove);

MOG.Run(frame, remove);
Cv2.BitwiseAnd(frame, remove.CvtColor(ColorConversion.GrayToBgr), remove);
win_MOG.ShowImage(remove);

MOG2.Run(frame, remove);
Cv2.BitwiseAnd(frame, remove.CvtColor(ColorConversion.GrayToBgr), remove);
win_MOG2.ShowImage(remove);

Bitwise 연산을 통하여 frameremove 영상을 And 연산 후, remove에 다시 저장하여 출력합니다.


함수 적용

BackgroundSubtractor();

실행될 구문에 함수를 적용합니다. Form 로드 이벤트 또는 Button Click 이벤트 등에 적용합니다.


Result


1 2



도움이 되셨다면 광고 클릭 부탁드립니다.

⤧  Next post C# OpenCV 강좌 : 제 44강 - 거리 변환 ⤧  Previous post C# OpenCV 강좌 : 제 42강 - Bitwise (Mat)