· Hakan Çelik · OpenCV / Video Analizi · 3 dk okuma
Optik Akış

OpenCV Serisi 44/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?
Optik Akış
Hedefler
Bu bölümde:
- Optik akış kavramlarını anlayacağız
- Lucas-Kanade yöntemi kullanılarak optik akış tahmini için cv.calcOpticalFlowPyrLK() kullanacağız
- Yoğun optik akış için cv.calcOpticalFlowFarneback() kullanacağız
Optik Akış
Optik akış, görüntüdeki nesnelerin ardışık kareler arasındaki görünür hareketi ifade eder. Bu, görüntü yüzeyindeki parlaklık desenlerinin görünür hareketinin 2B vektör alanıdır. Nesne hareketi veya kamera hareketi tarafından oluşturulur.
Şu varsayımları yapar:
- Birbirini takip eden kareler arasında piksellerin yoğunluğu değişmez.
- Komşu pikseller benzer harekete sahiptir (komşuluk kısıtlaması).
Lucas-Kanade Yöntemi
Lucas-Kanade yöntemi, yerel bir bölgede sabit bir akış olduğunu varsayan seyrek bir optik akış yöntemidir. Küçük bir pencerede yoğunluk eşitliği denklemini çözer.
OpenCV, bu algoritmanın piramit tabanlı bir versiyonunu sunar; bu sayede büyük hareketler de yakalanabilir.
import numpy as np
import cv2 as cv
cap = cv.VideoCapture('slow.flv')
# ShiTomasi köşe tespiti için parametreler
feature_params = dict(maxCorners=100,
qualityLevel=0.3,
minDistance=7,
blockSize=7)
# lucas kanade optik akış için parametreler
lk_params = dict(winSize=(15, 15),
maxLevel=2,
criteria=(cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))
# Rastgele renkler oluştur
color = np.random.randint(0, 255, (100, 3))
# İlk kareyi al ve köşeleri bul
ret, old_frame = cap.read()
old_gray = cv.cvtColor(old_frame, cv.COLOR_BGR2GRAY)
p0 = cv.goodFeaturesToTrack(old_gray, mask=None, **feature_params)
# Çizim için maske görüntüsü oluştur
mask = np.zeros_like(old_frame)
while True:
ret, frame = cap.read()
if not ret:
print('Daha fazla kare yok.')
break
frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
# optik akışı hesapla
p1, st, err = cv.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
# iyi noktaları seç
if p1 is not None:
good_new = p1[st == 1]
good_old = p0[st == 1]
# izleri çiz
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel().astype(int)
c, d = old.ravel().astype(int)
mask = cv.line(mask, (a, b), (c, d), color[i].tolist(), 2)
frame = cv.circle(frame, (a, b), 5, color[i].tolist(), -1)
img = cv.add(frame, mask)
cv.imshow('frame', img)
k = cv.waitKey(30) & 0xff
if k == 27:
break
# bir sonraki karede önceki kareler ve noktaları güncelle
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1, 1, 2)
cv.destroyAllWindows()Yoğun Optik Akış
Lucas-Kanade yöntemi, seyrek bir özellik kümesi için optik akışı hesaplar. OpenCV, Gunnar Farneback tarafından 2003 yılındaki makalesi “Two-Frame Motion Estimation Based on Polynomial Expansion” ile önerilen yoğun bir optik akış yöntemi sağlar.
Aşağıdaki örnek, yoğun optik akışı göstermektedir. Sonuç, yönü gösteren açıyla birlikte renk kodlamasıyla gösterilir:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture("vtest.avi")
ret, frame1 = cap.read()
prvs = cv.cvtColor(frame1, cv.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[..., 1] = 255
while True:
ret, frame2 = cap.read()
if not ret:
print('Daha fazla kare yok.')
break
next = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY)
flow = cv.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
mag, ang = cv.cartToPolar(flow[..., 0], flow[..., 1])
hsv[..., 0] = ang * 180 / np.pi / 2
hsv[..., 2] = cv.normalize(mag, None, 0, 255, cv.NORM_MINMAX)
bgr = cv.cvtColor(hsv, cv.COLOR_HSV2BGR)
cv.imshow('frame2', bgr)
k = cv.waitKey(30) & 0xff
if k == 27:
break
prvs = next
cv.destroyAllWindows()
Hakan Çelik


