Object Tracking - Meanshift

Kategori: Computer Vision , 02 Mart 2020 , JanFranco


Object tracking algoritmalarından meanshift ile devam ediyoruz. Meanshift algoritması, anlaması oldukça basit bir algoritmadır. Bir frame'deki piksellerin dağılımını düşünelim. Bir konumdaki penceredeki (bu pencere kare veya daire vs. olabilir) piksellerin yoğun olduğu kısmı buluruz. Daha sonra pencereyi bu yoğunluğa doğru kaydırırız. Kayan pencerede bu hesabı tekrar yaparız. Ta ki pencere hareket etmeyene kadar. Bu adımlarla ilgili bir görsel:



Burada görüyoruz ki mavi çemberin merkezi C1_o. Bu çemberdeki piksel yoğunluğunun merkezi ise C1_r. Bu nedenle yeni çember, merkezden o yöne doğru bir hareket yapıyor. Yeni çemberdeki yoğun noktalar tekrar hesaplanıyor ve merkezden o yöne doğru tekrar bir hareket oluyor. Bir kaç iteration sonrasında yeşil çemberi elde ediyoruz. OpenCV kütüphanesi ile Python üzerinden kodlayalım ve daha iyi anlayalım. Kütüphaneleri ve videoyu alalım:


import cv2
import numpy as np

cap = cv2.VideoCapture('../data/traffic.mp4')
Videoyu aşağıdaki linkten indirebilirsiniz:

https://www.bogotobogo.com/python/OpenCV_Python/images/mean_shift_tracking/slow_traffic_small.mp4

Videonun ilk frame'ini alalım. Bir pencere oluşturacağız. Beyaz arabanın üstüne gelecek şekilde koordinatları belirleyelim ve o kısmı alalım:


ret, 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]
İlgili kısmı HSV'ye çevirelim. Gürültüleri vs. engellemek için sadece belirli aralıktaki değerler ile ilgileneceğiz. Bunu inRange methodu ile yapabiliriz. İlgili kısmın Histogramını çıkartalım. Normalizasyon yapalım. Ayrıca algoritma için bir criteria oluşturmalıyız, onu da oluşturalım:


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)
Videonun framelerini okumak için sonsuz bir While döngüsü açalım. Her frame'i HSV'ye çevirelim. cv2.meanShift algoritması parametre olarak backproject histogram, bir pencere ve döngü için criteria alır. Criteria'yı tanımladık. Penceremiz zaten belli. Bu durumda cv2.calcBackProject methodu ile backproject hesaplaması yapalım. Daha önce bahsetmiğimiz bir method fakat basitçe şu işi yapar, verilen resimdeki piksellerin, verilen histogramdaki dağılıma ne kadar uyduğuna bakar. Bunu da hesapladıktan sonra parametre olarak gönderiyoruz ve meanShift methodu bize yeni koordinatları dönüyor. Bu koordinatlar ile yeni pencereyi çiziyoruz:


while True:
    _, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
    _, track_window = cv2.meanShift(dst, track_window, term_crit)
    x, y, w, h = track_window
    img2 = cv2.rectangle(frame, (x, y), (x+w, y+h), 255, 2)
    cv2.imshow('img2', img2)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break
>>


Sonraki Yazı: Object Tracking - CamShift
Yorumlar

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