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:
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:
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