· Hakan Çelik · OpenCV / Video Analizi · 3 dk okuma
Meanshift ve Camshift ile Nesne Takibi

OpenCV Serisi 43/64
- 1. Boya Fırçası Olarak Fare
- 2. Canny Kenar Algılama
- 3. Görüntü Geçişleri
- 4. Görüntü Piramitleri
- 5. Görüntülerde Aritmetik İşlemler
- 6. Görüntülerle İlgili Temel İşlemler
- 7. Görüntünün Geometrik Dönüşümleri
- 8. Görüntüyü Yumuşatma - ( Smoothing Images )
- 9. Histogramlar
- 10. Konturler ( Contours )
- 11. Morfolojik Dönüşümler
- 12. Opencv Nedir Ve Kurulumu
- 13. Opencv Resim Işlemleri
- 14. Opencv Video Işlemleri
- 15. Opencv'de Çizim Fonksiyonları
- 16. Performans Ölçüm Ve Geliştirme Teknikleri
- 17. Renk Alanlarını Değiştirme
- 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
- 19. Resim Eşikleme
- 20. Şablon Eşleştirme
- 21. Hough Doğru Dönüşümü
- 22. Hough Daire Dönüşümü
- 23. Fourier Dönüşümü
- 24. Histogram Eşitleme
- 25. 2B Histogramlar
- 26. Histogram Geri Projeksiyonu
- 27. Kontur Özellikleri
- 28. Kontur Nitelikleri
- 29. Konturlerle Daha Fazla İşlev
- 30. Kontur Hiyerarşisi
- 31. GrabCut ile Etkileşimli Ön Plan Çıkarma
- 32. Watershed Algoritması ile Görüntü Segmentasyonu
- 33. Özellikleri Anlamak
- 34. Harris Köşe Tespiti
- 35. Shi-Tomasi Köşe Dedektörü ve İzlenecek İyi Özellikler
- 36. SIFT'e Giriş (Ölçek Değişmez Özellik Dönüşümü)
- 37. SURF'e Giriş (Hızlandırılmış Sağlam Özellikler)
- 38. Köşe Tespiti için FAST Algoritması
- 39. BRIEF — İkili Sağlam Bağımsız Temel Özellikler
- 40. ORB (Yönlü FAST ve Döndürülmüş BRIEF)
- 41. Özellik Eşleştirme
- 42. Özellik Eşleştirme + Nesneleri Bulmak için Homografi
- 43. Meanshift ve Camshift ile Nesne Takibi
- 44. Optik Akış
- 45. Arka Plan Çıkarma
- 46. Kamera Kalibrasyonu
- 47. Poz Tahmini
- 48. Epipolar Geometri
- 49. Stereo Görüntülerden Derinlik Haritası
- 50. k-En Yakın Komşuyu Anlamak
- 51. kNN ile El Yazısı OCR
- 52. SVM'yi Anlamak
- 53. SVM ile El Yazısı OCR
- 54. K-Ortalamalar Kümeleme'yi Anlamak
- 55. OpenCV'de K-Ortalamalar Kümeleme
- 56. Görüntü Gürültü Giderme
- 57. Görüntü Onarımı (Inpainting)
- 58. Yüksek Dinamik Aralık (HDR) Görüntüleme
- 59. Haar Cascade ile Yüz Tespiti
- 60. pip ile OpenCV Kurulumu
- 61. Ubuntu'da OpenCV-Python Kurulumu
- 62. Fedora'da OpenCV-Python Kurulumu
- 63. Windows'ta OpenCV-Python Kurulumu
- 64. OpenCV-Python Bağlayıcıları Nasıl Çalışır?
Meanshift ve Camshift ile Nesne Takibi
Hedefler
Bu bölümde:
- Nesneleri takip etmek için Meanshift ve Camshift algoritmaları hakkında bilgi edineceğiz
- cv.meanShift() ve cv.CamShift() fonksiyonlarını öğreneceğiz
Meanshift
Meanshift algoritmasının arkasındaki fikir çok basittir. Bir nokta setiniz olduğunu varsayalım (piksel dağılımı, histogram gibi olabilir). Küçük bir pencere verildiğinde, bu pencereyi maksimum yoğunluklu bölgeye (veya en fazla nokta sayısına) taşımak istiyorsunuz. Aşağıdaki basit görüntüde gösterildiği gibi:
Başlangıç penceresi mavi daire ile “C1” etiketiyle gösterilir. Orijinal merkezi “C1_o” noktasıyla gösterilen mavi dikdörtgen olarak gösterilir. Pencerenin içindeki tüm noktaların centroidini hesaplarsanız, bu noktaların ağırlık merkezini “C1_r” ile gösterilen bir noktada elde edersiniz ve pencereyi yeni merkeze taşırsınız. Süreci tekrar uygularsınız, pencereyi taşırsınız ta ki yakınsayıncaya kadar, yani pencere merkezi ve centroid aynı yerde olana kadar.
OpenCV’de Meanshift
OpenCV’de Meanshift kullanmak için önce hedef nesneyi tanımlamamız gerekiyor. Bu nesneyi bir histogram ile temsil ediyoruz. Hedef nesneyi başlangıçta elle seçiyoruz veya buluyoruz. Sonra her karedeki nesneyi takip etmek için cv.meanShift() kullanıyoruz.
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('slow.flv')
# nesnenin başlangıç konumunu al
ret, frame = cap.read()
# kurulum için r, h, c, w'yi değiştirin
r, h, c, w = 250, 90, 400, 125
track_window = (c, r, w, h)
# ilgi bölgesini kur
roi = frame[r:r+h, c:c+w]
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
mask = cv.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
roi_hist = cv.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)
# Sonlandırma kriteri: 10 iterasyon veya en az 1 piksel hareket et
term_crit = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)
while True:
ret, frame = cap.read()
if ret == True:
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# meanshift uygula
ret, track_window = cv.meanShift(dst, track_window, term_crit)
# sonucu resme çiz
x, y, w, h = track_window
img2 = cv.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
cv.imshow('img2', img2)
k = cv.waitKey(30) & 0xff
if k == 27:
break
else:
breakCamshift
Dikkat ettiniz mi, Meanshift pencerenin boyutunu değiştirmiyor. Nesne kameraya yaklaşırken pencere aynı boyutta kalıyor, bu iyi değil. Bu sorunu çözmek için CAMshift (Sürekli Uyarlanabilir Meanshift) algoritması önerildi.
Camshift, önce nesnenin renginin geri projeksiyonunu hesaplar. Ardından Meanshift’i uygular. Meanshift yakınsadıktan sonra pencere boyutunu ve yönelimini güncelliyor. Sonra pencereyi küçük bir miktarda genişletiyor ve yeni boyutu bulmak için Meanshift’i yeniden uyguluyor. Bu süreç yakınsamaya kadar devam eder.
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('slow.flv')
ret, frame = cap.read()
r, h, c, w = 250, 90, 400, 125
track_window = (c, r, w, h)
roi = frame[r:r+h, c:c+w]
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
mask = cv.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
roi_hist = cv.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)
term_crit = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)
while True:
ret, frame = cap.read()
if ret == True:
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# Meanshift yerine Camshift uygula
ret, track_window = cv.CamShift(dst, track_window, term_crit)
# döndürülmüş dikdörtgen çiz
pts = cv.boxPoints(ret)
pts = np.int0(pts)
img2 = cv.polylines(frame, [pts], True, 255, 2)
cv.imshow('img2', img2)
k = cv.waitKey(30) & 0xff
if k == 27:
break
else:
breakCamshift, nesne büyürken veya küçülürken pencereyi uygun şekilde ölçeklendirir, bu onu Meanshift’ten çok daha sağlam kılar.
Ek Kaynaklar
- Camshift algoritması üzerine French Wikipedia makalesine dayalı İngilizce makale
- Bradski, G.R., “Computer Vision Face Tracking For Use in a Perceptual User Interface”, Intel Technology Journal, Q2 1998
Hakan Çelik


