Vision – 객체 추적 (Tracking)

객체 추적은 비디오 영상에서 객체를 계속 추적하는 기술입니다.
쉽게 말하면 프레임마다 객체 찾는 것을 반복하는 것을 말합니다.

이번 포스팅은 객체 추적과 관련된 비디오 처리 기법을 소개합니다!

1. 차영상을 이용한 분할

아래는 여러 사람들이 움직이는 영상입니다.
이렇게 각 프레임마다 픽셀 위치 변화가 있는 경우 평균 영상을 구할 시 배경을 얻게 됩니다.

acc_bgr=np.zeros(shape=(height,width,3),dtype=np.float32) # 제로 영상 
t=0
while True:
    # 비디오 처리 소스 생략
    t+=1
    cv2.accumulate(frame,acc_bgr)
    avg_bgr=acc_bgr/t

위 소스에서 frame은 비디오의 한 프레임에 해당합니다.
cv2.accumulate함수를 이용해서 이전 프레임과 현재 프레임을 합치고 현재 프레임 수로 나누면 평균 영상을 구할 수 있습니다.

이 평균 영상이 바로 배경이라는 의미입니다.

그렇다면 원본 영상의 프레임에서 평균 영상(배경)을 빼면 어떻게 될까요?
그렇게 구한 차영상이 객체가 될 것입니다.

물론 영상의 차이가 유의미할 때 진행해야 되니
차이가 임계치 이상인 경우에만 진행합니다. (Thresholding 진행)

결과는 아래와 같습니다.


2. BackgroundSubtractor

GMM 혹은 K-NN 등 통계적 방법을 이용해서 배경을 제거하고 객체만 남기는 방법입니다.

사용하기 위해서 createBackgroundSubtractor 함수를 호출하는데, 파라미터를 수정함으로써 더 정확한 결과를 도출할 수도 있습니다.

bgMog1=cv2.createBackgroundSubtractorMOG2()
bgMog2=cv2.createBackgroundSubtractorMOG2(varThreshold=25,detectShadows=False) # 임계치값 낮추면 foreground 많이 생성 
bgKnn1=cv2.createBackgroundSubtractorKNN()
bgKnn2=cv2.createBackgroundSubtractorKNN(dist2Threshold=1000,detectShadows=False) # 임계치값 낮추면 foreground 많이 생성

while True:
    # 비디오 처리 소스 생략
    bImage1=bgMog1.apply(blur)
    bImage2=bgMog2.apply(blur)
    bImage3=bgKnn1.apply(blur)
    bImage4=bgKnn2.apply(blur)

차영상을 이용해서 객체를 구하는 것보다 더 정확한 결과를 보인다고 합니다.


3. Optical Flow

객체에 해당하는 픽셀의 움직임을 벡터로 계산하는 방법입니다.

이 방법은 Lucas-Kanade 방법과 Farneback 방법으로 나뉘어 집니다.

Lucas-Kanade는 피라미드를 이용한 다양한 스케일 영상 탐색을 합니다.
레벨이 높은 피라미드 영상에서 조금 움직인 것이 실제로는 많이 움직이는 결과를 내보이기 때문에
큰 움직임을 검출하기에 유리한 방법입니다.

단점으로는 키 포인트를 일부만 이용하므로 정확도가 떨어 집니다.

Farneback은 모든 픽셀에 대한 키 포인트로 계산하는 방법입니다.
그래서 정확도는 높지만 계산 시간이 오래 걸리는 특징이 있습니다.


4. MeanShift / CamShift

Meanshift방법은 segmentation에서도 나오는데 ,Tracking입장에서는 ‘히스토그램 역투영’이라는 것을 알아야 합니다.

먼저 object model의 히스토그램을 구하고
(입력 영상-특정 영역)의 히스토그램도 모두 구합니다.

이후 bhattachayya coeffiecient라는 히스토그램 유사도를 측정해서
object와 유사한 히스토그램을 찾는 개념입니다.

유사한 히스토그램을 찾았으면 Detection을 한 것이고,
이러한 Detection을 여러 번 하면 Tracking을 하게 될 것입니다.

역투영이라고 하는 이유는 object model의 히스토그램을 역으로 입력 영상에 투영해서 유사한 히스토그램을 찾는다고 해서 붙여진 이름입니다.

만약 이 방법을 segmentation에 적용하면,
오브젝트에 해당하는 영역 중 가장 분포가 큰 값(히스토그램이 큰 값)에 대해 밝은 영상을 출력한다고 합니다.

Camshift 같은 경우, Meanshift과 비슷하게 backprojection(역투영)을 진행하지만 좀 더 빨리 진행해서
Tracking에 이점을 주는 방법입니다.


GitHub에 파이썬 코드를 제공하겠습니다.
자의 GitHub는 메인 화면 배너에 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *