배경제거

Developer/OpenCV 2013. 1. 18. 02:24

배경과 전경의 구분은 애매모호한점이 있다. 주차장을 카메라로 촬영하고 있을때 자동차가 주차장안으로 들어온다면 그 차는 새로운 전경객체이다. 하지만 이차가 오랫동안 주차되있는 상태로 놓여있다면 이 차를 계속해서 전경객체로 인식을 해야할지 배경으로 인식을 해야할지 구분을 해주어야 한다. 또한 새로운 전경객체가 얼마나 오랫동안 전경으로 유지되어야 하는지도 고려를 해야한다.


이러한 문제를 해결하기 위해서 전경과 배경사이에 여러개의 계층을 정의한 고차적인 장면 모델링을 구성하거나 오랜 시간동안 움직이지 않는 객체를 배경으로 분류할 수 있는 타이밍-기반 방법을 사용해야한다.


장면 모델링

장면 모델은 여러개의 여러 개의 계층을 가지고있다.

최상위층 : 새로운 전경을 담당

중간계층 : 오래된 전경계층

최하위층 : 배경

여기에 추가적인 움직임 정보를 사용하고, 객체가 움직일때, 움직인 객체와 객체가 이전에 위치하고 있던 배경을 구분하는 용도로 사용될수 있다.

이러한 방식으로 새로운 전경객체는 최상위층에 놓이게 되고, 실제 객체가 있는 곳 또는 이전의 곳으로 표시한다. 전경 객체가 없는 위치에서는 배경 모델을 계속 학습한다.

※ 방에 불이 켜진것과 같은 전체장면이 변화를 검출하기 위해서는 프레임 전체차이를 이용하는데, 많은 픽셀이 한꺼번에 바뀌었다면 지역적변화로 보기보다는 전체적인 변화로 분류하고 새로운 상황에 맞는 모델을 사용해야한다.


차 프레임

차프레임은 가장 간단한 배경 제거 방법으로 한 프레임에서 이전 프레임을 뺀후 충분히 큰 변화가 있는 부분을 전경으로 추출하는 것이다. 

두 프레임간의 차이의 절대값은 cvAdbsDiff()함수를 이용하면 전경차이의 절대값을 구할수있다.


 void cvAbsDiff(

        const CvArr* src1,

        const CvArr* src2,

        CvArr* dst

);

src1으로부터 src2행렬을 뺀다음 그 절대값을 dst행렬에 저장한다.

※ 영상은 항상 잡음의 영향을 받기 때문에, 픽셀값의 차이가 15보다 작은 경우는 무시하고, 값의 차이가 큰 픽셀들만 두드러지게 표시한다.

    차이가 작으면0, 차이가 크면 255로 설정 => (임계값을 이용한다, http://lueseypid.tistory.com/76

    잡음영역의 경우 침식(cvErode())함수 또는 연결된 구성요소 방법을 이용한다.


평균 배경 방법

평균배경 모델생성을 위해 픽셀의 평균과 표준편차를 이용한다. 표준편차 대신 계산속도가 빠른 평균차이를 이용하기도 한다.


순서

1. cvAcc()함수를 이용하여 각 프레임 영상을 일정 시간동안 누적

2. cvAbsDiff() 함수를 이용하여 한 프레임과 다른 프레임간 차이의 절대값을 구하여 이를 누적

3. 1~2과정을 통해 배경모델이 학습되면 cvInRange() 함수를 이용하여 영상을 전경과 배경영역으로 분할

4. 각 컬러채널의 분할 결과로부터 최종 마스크 영상 하나를 생성하기위해 cvOr()함수를 사용


'Developer > OpenCV' 카테고리의 다른 글

옵티컬 플로우 - 피라미드 루카스-카나데(객체추적)  (0) 2013.01.22
코너검출  (2) 2013.01.21
모멘트 - 외곽선의 유사도 비교  (1) 2013.01.15
프리만 체인  (1) 2013.01.14
외곽선 검출하기  (2) 2013.01.13
Posted by No names
,