반응형
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);
}
}
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);
}
반응형
'ੈ✩‧₊˚Computer Science > 컴퓨터비전' 카테고리의 다른 글
[OpenCV] 추적(tracking) (0) | 2020.11.23 |
---|---|
[OpenCV] Pedestrian detection (보행자 검출) (0) | 2020.11.18 |
[OpenCV] Face detection (얼굴 검출) (0) | 2020.11.18 |
[OpenCV] Threshold(임계값 설정), Inrange (0) | 2020.10.29 |