Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 객체 추적 - OpenCV 트래커 - cv2.TrackerXXX_create, cv2.Tracker.init

AI 꿈나무 2020. 10. 21. 17:20
반응형

OpenCV 트래커(Tracker)

 옵티컬플로우, 배경 차분, 평균 이동 등 전에 공부했었던 방법들은 이전 프레임에 있는 객체가 현재 프레임에 어떻게 이동했는지에 대한 정보를 추출하는 방법이었습니다.

 

 OpenCV에서 좀 더 고차원적인 알고리즘 집합체를 클래스 형태로 구현해서 제공하고 있는 것들이 있습니다.

 extra 모듈에 있으며 추가 모듈이 포함되어 있는 OpenCV를 설치해야 합니다.

 

OpenCV에서 제공하는 트래커 클래스

 

Tracker 클래스 사용 방법

(1) 클래스 객체 생성

 cv2.TrackerXXX_create() -> <TrackerXXX object>

 

 XXX = Boosting, CSRT, GOTURN, KCF, MedianFlow, MIL, MOSSE, TLD

 

 KCF : 빠르게 작동

 MOSSE : 빠르게 작동

 CSRT : 연산은 느리지만 강인하게 추적

 GOTURN : 딥러닝 기반, 가중치 파일을 다운받아 저장해야지 작동 가능

 

(2) 객체 초기화

 cv2.Tracker.init(image, boundingBox) -> retval

 

 boundingBox : 초기 사각형 ROI (실수형 (x,y,w,h) 튜플)

 

(3) 정보 업데이트

 cv2.Tracker.update(image) -> retval, boundingBox

 

 retval : 추적에 성공하면 True, 실패하면 False

 

트래킹 예제 코드

 예제 코드 출처 :  황선규 박사님 github홈페이지 sunkyoo.github.io/opencv4cvml/

 

# 동영상 열기
cap = cv2.VideoCapture('tracking1.mp4')

if not cap.isOpened():
    print('Video open failed!')
    sys.exit()

# 트래커 객체 생성

# Kernelized Correlation Filters
# KCF가 그나마 빠른 알고리즘
#tracker = cv2.TrackerKCF_create()

# Minimum Output Sum of Squared Error
# 빠르게 동작하는 편
#tracker = cv2.TrackerMOSSE_create()

# Discriminative Correlation Filter with Channel and Spatial Reliability
# 앞의 두 가지 방법보다 강인하게 추적을 함. 그대신 느림
tracker = cv2.TrackerCSRT_create()

# GOTURN은 딥러닝 기반. 실행하려면 딥러닝 관련 파일을 다운받아서 가중치 파일을 저장해야지 동작 가능

# 첫 번째 프레임에서 추적 ROI 설정
ret, frame = cap.read()

if not ret:
    print('Frame read failed!')
    sys.exit()

# frame 이라는 이름으로 부분영상 추출
rc = cv2.selectROI('frame', frame)
# 초깃값 설정
tracker.init(frame, rc)

# 매 프레임 처리
while True:
    ret, frame = cap.read()

    if not ret:
        print('Frame read failed!')
        sys.exit()

    # 추척 $ ROI 사각형 업데이트
    # 매 프래임마다 update하고 rc값 받아옴
    ret, rc = tracker.update(frame)
    
    # floate 형태로 rc값을 받으므로 int로 변환해서 list로 감싸고 tuple로 변환
    rc = tuple([int(_) for _ in rc])
    cv2.rectangle(frame, rc, (0, 0, 255), 2)
    
    cv2.imshow('frame', frame)
    if cv2.waitKey(20) == 27:
        break

cv2.destroyAllWindows()

 

 

 

 대부분 가려지면 동작을 안하게 됩니다.

 이를 occlusion, 가려짐 이라고 합니다.

 가려지면 객체를 놓치게 됩니다.

 그런 경우에 다른 방법을 이용하여 내가 추적하고 있는 객체의 모양을 찾아서 다시 추적하도록 해야합니다.

 


OpenCV 홈페이지와 황선규 박사님의 'OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝' 을 공부하면서 정리해 보았습니다.

docs.opencv.org/4.3.0/d0/d0a/classcv_1_1Tracker.html

 

OpenCV: cv::Tracker Class Reference

Base abstract class for the long-term tracker:

docs.opencv.org

 

반응형