사용한 버전
- OpenCV = 3.4.2
Opencv 에서는 object tracking 을 위하여 제공하는 Tracking API 가 존재합니다
https://docs.opencv.org/3.4/d9/df8/group__tracking.html
OpenCV: Tracking API
Long-term optical tracking API Long-term optical tracking is an important issue for many computer vision applications in real world scenario. The development in this area is very fragmented and this API is an unique interface useful for plug several algori
docs.opencv.org
먼저 원하는 trakcer 를 지정합니다
(OpenCV 버전에 따라 가능한 tracker가 달라질 수 있습니다)
- tracker = cv2.TrackerBoosting_create()
- tracker = cv2.TrackerMIL_create()
- tracker = cv2.TrackerKCF_create()
- tracker = cv2.TrackerTLD_create()
- tracker = cv2.TrackerMedianFlow_create()
- tracker = cv2.TrackerGOTURN_create()
- tracker = cv2.TrackerCSRT_create()
- tracker = cv2.TrackerMOSSE_create()
GOTURN 은 딥러닝 기반의 tracker 로 'goturn.caffemodel' 와 ''goturn.protxt' 파일이 필요합니다
traker 를 초기화 시켜줍니다
- traker.init(img, bbox)
img : 이미지
bbox : tracking할 객체의 바운딩 박스로 (x, y, w, h) 의 형태로 입력합니다
그리고 다음 프레임에서 부터 update 를 통해 bbox를 갱신시켜줍니다
- status, bbox = cv2.traker.update(img)
img : 이미지
status : tracking 성공여부
bbox : tracking한 바운딩 박스 (tracking에 실패해도 반환은 함)
우선 동영상 하나와 간단한 코드를 가지고 tracking을 시도해 보겠습니다
import cv2
video_src = "tracking.mp4"
#webcam = cv2.VideoCapture(1)
webcam = cv2.VideoCapture(video_src)
tracker = cv2.TrackerMIL_create()
_, img = webcam.read()
# 추적 할 객체 지정
bbox = cv2.selectROI('Tracking', img, False)
tracker.init(img, bbox)
while True:
timer = cv2.getTickCount()
_, img = webcam.read()
status, bbox = tracker.update(img)
# 추적 성공
if status:
x, y, w, h = int(bbox[0]), int(bbox[1]), int(bbox[2]), int(bbox[3])
cv2.rectangle(img, (x, y), ((x + w), (y + h)), (0, 255, 0), 3, 1)
cv2.putText(img, 'tracking', (70, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)
# 추적 실패
else:
cv2.putText(img, 'lost', (70, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
fps = cv2.getTickFrequency()/(cv2.getTickCount()-timer)
cv2.putText(img, 'fps : '+str(int(fps)), (70,50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,255), 2)
cv2.imshow('Tracking', img)
if cv2.waitKey(1) & 0xff == ord('q'):
break
tracker 는 MIL를 사용하였고
이번엔 모든 tracker를 적용해 보고 확인해 봅시다.
이 때 한번이라도 추적에 실패한 tracker들은 다음 프레임부터는 추적하지 않도록 하였습니다
import cv2
import numpy as np
video_src = "tracking.mp4"
#webcam = cv2.VideoCapture(1)
webcam = cv2.VideoCapture(video_src)
# trackers 지정
trackerName = ['Boosting', 'MIL', 'KCF', 'TLD', 'MedianFlow', 'GOTURN', 'CSRT', 'MOSSE']
trackers = [
cv2.TrackerBoosting_create(),
cv2.TrackerMIL_create(),
cv2.TrackerKCF_create(),
cv2.TrackerTLD_create(),
cv2.TrackerMedianFlow_create(),
cv2.TrackerGOTURN_create(),
cv2.TrackerCSRT_create(),
cv2.TrackerMOSSE_create()
]
status, img = webcam.read()
bbox = cv2.selectROI('Tracking', img, False)
# trackers 초기화
t = 0
color = []
for tracker in trackers:
tracker.init(img, bbox)
colors = np.random.uniform(0, 255, size=(1, 3))
color.append(colors[0].tolist())
t += 1
def drawBox(img, bbox, line, color):
x, y, w, h = int(bbox[0]), int(bbox[1]), int(bbox[2]), int(bbox[3])
cv2.rectangle(img, (x, y), ((x+w), (y+h)), color, 3, 1)
cv2.putText(img, trackerName[t], line, cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)
tracker_num = list(range(8))
while True:
status, img = webcam.read()
for t in tracker_num:
status, bbox = trackers[t].update(img)
# 추적 성공한 tracker
if status:
drawBox(img, bbox, (20, 30*t+20), color[t])
# 추적 실패한 tracker
else:
tracker_num.remove(t)
cv2.imshow('Tracking', img)
if cv2.waitKey(1) & 0xff == ord('q'):
break
이 영상에서 우리는 경험적으로
Bossting, MIL, CSRT 가 좋은 성능을 보여줌을 알 수 있습니다
(물론 다른 상황에서는 다른 tracker가 더 좋은 성능을 보일 수 도 있습니다)
그리고 객체 추적에서 하나 더 중요하게 여겨지는것은 속도 입니다
위의 코드에도 있듯이 fps 를 계산 하여 출력하였는데 일반적으로 우리가 real time 으로 느끼는 fps는 30이상이여야 한다고 합니다
현재 cpu만 사용하고 있는 제 PC 기준으로 같은 영상으로 각각의 tracker의 fps를 확인해보면
Boosting : 30~40
MIL : 10~20
KCF : 130~150
TLD : 15~20
MedianFlow : 170~220
GOTURN : 15~20
CSRT : 20~40
MOSSE : 500~600
결과적으로 CSRT가 가장 안정적이면서 적당한 속도를 내는것 같습니다
'컴퓨터비전' 카테고리의 다른 글
webcam과 Perspective Transform을 이용하여 스캔하기 + pytesseract 로 읽어보기 (0) | 2021.10.12 |
---|---|
OpenCV에서 YOLO 가중치 가져오기 (0) | 2021.09.06 |