OpenCV 강좌, KLT Tracker로 객체 추적하기

작성자: 조광형

날짜: 2024년 11월 26일

1. 서론

컴퓨터 비전의 발전과 함께 객체 추적은 많은 응용 분야에서 중요한 역할을 하고 있습니다.
본 강좌에서는 OpenCV를 이용하여 KLT(Kanade-Lucas-Tomasi) Tracker로 객체를 추적하는 방법에 대하여 다룰 것입니다.
KLT 트래커는 특징 점 패턴을 기반으로하여, 영상에서 움직이는 객체를 추적할 수 있도록 도와줍니다.

2. KLT Tracker 기본 개념

KLT Tracker는 이미지 내의 특징 점들을 사용하여, 프레임 간 객체의 이동을 추적합니다.
이 방법은 가장자리, 코너 등과 같은 고유한 패턴을 가진 특징 점을 찾아내고,
다음 프레임에 이들 점의 위치를 추정합니다. 이를 통해 객체의 위치를 효과적으로 추적할 수 있습니다.

KLT Tracker는 다음과 같은 기본 단계로 동작합니다:

  • 특징 점 검출: 이미지에서 특정한 특징 점을 검출합니다.
  • 특징 점 추적: 검출된 특징 점을 다음 프레임에서 추적합니다.
  • 위치 업데이트: 추적한 특징 점의 위치를 업데이트합니다.

3. KLT Tracker의 설치

OpenCV는 pip를 사용하여 설치할 수 있습니다. 아래의 명령어를 사용하여 OpenCV를 설치하세요.

pip install opencv-python opencv-python-headless

또한, NumPy와 matplotlib도 설치되어 있어야 합니다. 필요한 패키지들은 다음과 같이 설치할 수 있습니다:

pip install numpy matplotlib

4. KLT Tracker 사용하기

KLT Tracker를 사용하여 객체를 추적하는 예제 코드를 살펴보겠습니다.
이 코드는 웹캠에서 객체를 추적하는 간단한 예제입니다.


import cv2
import numpy as np

# 비디오 캡처 객체 생성
cap = cv2.VideoCapture(0)

# 첫 번째 프레임 읽기
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)

# ShiTomasi 코너 검출기 생성
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)
p0 = cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)

# KLT Tracker를 위한 Lucas-Kanade 매개변수 설정
lk_params = dict(winSize=(15, 15), maxLevel=2,
                 criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

# 변화 마스크 생성
mask = np.zeros_like(old_frame)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
        
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Lucas-Kanade 알고리즘을 사용하여 특징 점 추적
    p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)

    # 추적에 성공한 포인트만 선택
    good_new = p1[st == 1]
    good_old = p0[st == 1]

    # 결과 그리기
    for i, (new, old) in enumerate(zip(good_new, good_old)):
        a, b = new.ravel()
        c, d = old.ravel()
        mask = cv2.line(mask, (a, b), (c, d), (0, 255, 0), 2)
        frame = cv2.circle(frame, (a, b), 5, (0, 0, 255), -1)

    img = cv2.add(frame, mask)
    cv2.imshow('Frame', img)

    # ESC 키로 종료
    if cv2.waitKey(30) & 0xFF == 27:
        break

    # 이전 값 업데이트
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1, 1, 2)

cap.release()
cv2.destroyAllWindows()
            

위의 코드는 웹캠으로부터 실시간 비디오 스트림을 받아들이고, KLT Tracker를 사용하여 특징 점을 추적합니다.
코드의 주요 부분을 설명하겠습니다.

  • 비디오 캡처 시작: `cv2.VideoCapture(0)`을 통해 컴퓨터의 기본 웹캠에 접근합니다.
  • 특징 점 검출: `cv2.goodFeaturesToTrack()`을 이용하여 첫 번째 프레임에서 특징 점을 검출합니다.
  • 특징 점 추적: `cv2.calcOpticalFlowPyrLK()` 함수를 사용하여 이전 프레임에서 검출한 점들을 현재 프레임으로 추적합니다.
  • 결과 시각화: 이전 점과 현재 점을 선으로 연결하고, 현재 점을 원으로 표시하여 시각적으로 결과를 확인할 수 있습니다.

5. 다양한 매개변수를 조정해보기

위 예제에서는 많은 기본 매개변수들이 설정되어 있습니다. 이를 조정하여 결과를 개선할 수 있습니다.
`feature_params`와 `lk_params`의 변수를 직접 조정해보세요.
`maxCorners`, `qualityLevel`, `minDistance`, `blockSize` 값들을 조정하여 다양한 특징 점 검출을 시험해보시기 바랍니다.

6. KLT Tracker의 장점과 한계

KLT Tracker는 빠르게 실행되는 장점이 있지만, 몇 가지 한계가 존재합니다.
특히, 영상이 급격하게 변하거나 큰 움직임이 있을 때는 정확도가 떨어질 수 있습니다.
또한, 조명이 변하거나 배경이 복잡해질 경우에는 실패할 가능성이 높아집니다.

KLT Tracker는 다음과 같은 경우에 잘 작동합니다:

  • 조명이 일정하고, 배경이 단순한 경우
  • 물체의 움직임 속도가 상대적으로 느린 경우
  • 물체가 상대적으로 선명하게 보이는 경우

7. KLT Tracker와 다른 알고리즘 비교

KLT Tracker 외에도 OpenCV를 통해 사용할 수 있는 다양한 객체 추적 알고리즘들이 있습니다.
이 중 몇 가지를 비교해보겠습니다.

  • CSRT Tracker: 정확도가 높은 객체 추적 알고리즘으로, 객체의 크기 변화에 대하여 강인한 특성을 가지고 있습니다.
  • MedianFlow Tracker: 이전 프레임과의 위치 변화에 따른 중간 경로를 이용하여 객제를 추적하는 방식으로, 정적인 장면에서 효과적입니다.
  • MOSSE Tracker: 고속 처리와 견고성을 목표로 하여, 다수의 객체를 한 번에 추적할 때 유용합니다.

각 알고리즘은 특정한 상황에서 더 나은 성능을 발휘하므로, 여러분의 필요에 따라 적절한 알고리즘을 선택하는 것이 중요합니다.

8. 결론

본 강좌에서는 OpenCV를 이용한 KLT Tracker의 기본 사용 방법과 예제를 다루었습니다.
KLT Tracker는 빠르고 효과적인 방법으로 객체를 추적할 수 있지만, 상황에 따라서 한계를 나타낼 수 있습니다.
여러분이 이 정보를 바탕으로 실제 프로젝트에 적용하는 데 도움이 되길 바랍니다.

여러분의 의견이나 질문은 댓글로 남겨주세요!