Object Tracking - CamShift

Kategori: Computer Vision , 06 Mart 2020 , JanFranco


Bir önceki yazımda Meanshift algoritmasını anlatmıştım. Eğer çalıştırıp kendiniz test ettiyseniz fark etmiş olmalısınız, araba yakınlaştıkça doğal olarak büyüyor fakat penceremiz hala sabit kalıyor. Bu durum bir hata değildir. Ancak algoritma geliştirilebilir ve pencerenin boyutlarını değiştirebiliriz. Bu yazımda Meanshift algoritmasının gelişmiş bir versiyonu olan Camshift algoritmasını anlatacağım.

Algoritma ilk adımda Meanshift algoritmasının yaptığı aynı işi yapıyor. Yeni pencere bulunduğunda, adımlar tamamlandığında pencere boyutu aşağıdaki formüle göre yeniden ayarlanıyor:

camshift

Daha sonra aynı adımlar yeni pencere için yapılıyor. Belli bir accuracy değerine erişilinceye dek bu işlem devam ediyor. Aşağıdaki gifte bunu görebiliriz:

camshift

OpenCV kütüphanesini kullanarak Python üzerinden örnek yapalım. Önceki yazının devam niteliğinde bir yazı olduğundan kodu tekrar açıklamıyorum. Oldukça benzer. Tek fark method bir dikdörtgen pencere değil, döndürülmüş bir dörtgen dönecektir. Köşeleri belirlemek için boxPoints methodunu kullanabiliriz. Noktaları da polylines methoduna göndererek, döndürülmüş bir dörtgen çizebiliriz:


import cv2
import numpy as np

cap = cv2.VideoCapture('../data/traffic.mp4')
_, frame = cap.read()

x, y, w, h = 300, 200, 100, 50
track_window = (x, y, w, h)
roi = frame[y:y+h, x:x+w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while True:
    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
    ret, track_window = cv2.CamShift(dst, track_window, term_crit)
    pts = cv2.boxPoints(ret)
    pts = np.int0(pts)
    img2 = cv2.polylines(frame, [pts], True, 255, 2)
    cv2.imshow('img2', img2)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
>>

camshift


Sonraki Yazı: Object Tracking - BOOSTING Tracker
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın