본문 바로가기
ੈ✩‧₊˚Computer Science/컴퓨터비전

[OpenCV] 배경 제거 (Background subtraction)

by 샨샨 2020. 11. 3.
반응형

1. 간단한 배경제거 알고리즘

가정 : 동일한 위치에서 촬영, 두 영상의 조명 상태에 차이가 없어야 한다.

두개의 이미지 프레임 : foreground(x,y,t) , background(x,y,t) (t=시간) 이 있다고 가정

 

알고리즘

만약 |foreground(x,y,t) - background(x,y,t)| > threshold (임계값) 이라면

destination(x,y,t) = 1 혹은 255

아니라면 destination(x,y,t) = 0

#include "cv.hpp"
#include <iostream>

using namespace cv;
using namespace std;
int main(){
   VideoCapture capture("background.mp4");
   Mat background ,image, gray, result, foregroundMask, foregroundImg;

//맨 처음 frame을 background 라고 가정
   capture >> background;
   cvtColor(background,background,CV_BGR2GRAY);

   while(true){
       if(capture.grab()==0)break;
       capture.retrieve(image);
       cvtColor(image,gray,CV_BGR2GRAY);

       absdiff(background,gray,foregroundMask); // foregroundMask=배경-현재frame
       threshold(foregroundMask,foregroundMask, 50, 255, CV_THRESH_BINARY); //임계값확인
       foregroundMask.copyTo(foregroundImg); // foregroundMask를 img에 복사
       gray.copyTo(foregroundImg, foregroundMask); //foregroundMask가 흰색인 부분만 copy

       imshow("foregroundImg",foregroundImg);
       imshow("foregroundMask",foregroundMask);
       imshow("background",background);

       waitKey(33);
   }
}

1) foregroundMask 2) foregroundImg 3) background

2. MOG2 이용

알고리즘

현재 프레임과 객체를 추출하기 위한 배경 (background)의 차영상(substraction)을 구하여 Thresholding을 하여 foreground mask를 구한다.

 

1) 변수, 객체 선언

Ptr<BackgroundSubtractor> bg_model = createBackgroundSubtractorMOG2();
Mat image, foregroundMask, backgroundImg, foregroundImg;
VideoCapture cap("background.mp4");

2) MOG2 함수 호출 및 영상 띄우기

while(true){
       cap >> image; //이미지 입력받기
       resize(image,image,Size(640,480)); //resizing

       if(foregroundMask.empty()){ //foregroundMask가 empty이면 초기화
           foregroundMask.create(image.size(),image.type());
       }

       bg_model -> apply(image,foregroundMask); //computre foreground image
       GaussianBlur(foregroundMask, foregroundMask, Size(11,11),3.5,3.5); //가우시안 블러
       threshold(foregroundMask, foregroundMask , 10, 255, THRESH_BINARY); //배경 임계값
       foregroundImg = Scalar::all(0); //0으로 초기화
       image.copyTo(foregroundImg,foregroundMask); //image를 배경이 0인 곳에 copy
       bg_model -> getBackgroundImage(backgroundImg); //Computes a background image
        imshow("foreground mask", foregroundMask);
        imshow("foreground image",foregroundImg);

        if(!backgroundImg.empty()){
            imshow("mean background image",backgroundImg);
        }
        waitKey(33);
   }

1) foregroundimage 2) foregroundMask 3)backgroundimage

 

반응형