## **1️⃣ Yorumlama Tabanlı (Model Bazlı) Algoritmalar**
  
  Bu yöntemlerde, görüntüden çıkarılan özellikler bir **öğrenilmiş model** veya **önceden belirlenmiş kurallar** ile anlamlandırılır.
### **📌 Derin Öğrenme Tabanlı Özellik Çıkarma**
(Bu yöntemler genellikle önceden eğitilmiş sinir ağlarını kullanır.)

- **SuperPoint** → CNN tabanlı, ölçek ve döndürme dayanıklı anahtar nokta çıkarma.
- **R2D2 (Repeatable and Reliable Detector and Descriptor)** → SuperPoint’e alternatif, daha kararlı eşleşmeler sağlar.
- **LF-Net (Learning Feature Matching)** → Derin öğrenme ile özellik eşleştirme yapar, geleneksel yöntemlerden daha iyi sonuçlar verir.
- **DELF (Deep Local Features)** → Google tarafından geliştirilen, görüntü eşleştirme için kullanılan bir özellik çıkarma ağıdır.
- ### **📌 Derin Öğrenme Tabanlı Takip ve Hareket Tahmini**
- **RAFT (Recurrent All-Pairs Field Transforms)** → Derin öğrenme tabanlı optik akış algoritması.
- **RAFT-SLAM** → RAFT’in SLAM’a uygulanmış hali.
- **DeepSORT (Simple Online and Realtime Tracker)** → Nesne takibi için derin öğrenme tabanlı bir yöntem.
- **TrackNet** → Spor analizlerinde kullanılan bir nesne takip ağı.
- ### **📌 Öğrenilmiş Model Kullanmadan Özellik Çıkarma**
  
  (Bu yöntemler belirli matematiksel modelleri kullanır.)
- **SIFT (Scale-Invariant Feature Transform)** → Ölçek ve döndürmeye dayanıklı özellik çıkarır.
- **SURF (Speeded-Up Robust Features)** → SIFT’e benzer ama daha hızlıdır.
- **KAZE** → Görüntünün doğal sınırlarını (edges) kullanarak özellik noktaları çıkarır.
- **AKAZE (Accelerated KAZE)** → KAZE’nin hızlandırılmış versiyonu.
- **ORB (Oriented FAST and Rotated BRIEF)** → Hafif ve hızlı, SLAM sistemlerinde yaygın olarak kullanılır.
- **BRISK (Binary Robust Invariant Scalable Keypoints)** → ORB’ye benzer ama farklı bir anahtar nokta seçme yöntemi kullanır.
  
  ---
- ## **2️⃣ Yorumsuz (Doğrudan Hesaplama Tabanlı) Algoritmalar**
  
  Bu yöntemlerde, görüntüden çıkarılan bilgiler **herhangi bir model eğitimi olmadan doğrudan matematiksel hesaplamalarla belirlenir**.
- ### **📌 Optik Akış (Optical Flow) Tabanlı Yöntemler**
  
  (Görüntüdeki piksellerin hareketini analiz eder.)
- **Lucas-Kanade Optical Flow** → Hareketli nesnelerin yönünü ve hızını tahmin eder, düşük çözünürlüklü görüntülerde etkilidir.
- **Farneback Optical Flow** → Lucas-Kanade’den farklı olarak yoğun (dense) akış hesaplar.
- **Gunnar-Farneback Method** → Farneback’in geliştirilmiş versiyonudur, video kareleri arasında akış belirler.
- **PWC-Net (Pyramid, Warping, and Cost Volume)** → Optik akış hesaplamak için bir CNN modelidir.
- **RAFT (Recurrent All-Pairs Field Transforms)** → En güncel derin öğrenme tabanlı optik akış modeli.
- ### **📌 Geometrik Yaklaşımlar**
  
  (Bu yöntemler doğrudan matematiksel dönüşümler ve eşleştirmeler ile çalışır.)
- **Epipolar Geometry** → Stereo kameralar arasındaki ilişkiyi modellemek için kullanılır.
- **Essential & Fundamental Matrix** → Kamera hareketini anlamak için kullanılır.
- **Homography Estimation** → İki görüntü arasında düzlemsel dönüşümü belirler.
- **Structure-from-Motion (SfM)** → 3D yapıların hareketli bir kameradan çıkarılmasını sağlar.
- **Visual-Inertial Odometry (VIO)** → Görsel verilerle IMU sensörlerini birleştirerek hareket tahmini yapar.
- ### **📌 Klasik Nesne Takip Algoritmaları**
  
  (Bu yöntemler doğrudan piksellerin hareketini takip eder.)
- **Mean-Shift** → Piksellerin renk dağılımına göre nesne takibi yapar.
- **CamShift (Continuously Adaptive Mean Shift)** → Mean-Shift’in adaptif versiyonu, nesnenin boyutunu değiştirebilir.
- **Kalman Filter** → Hareket tahmini ve nesne takibinde kullanılır.
- **Particle Filter (Monte Carlo Localization)** → Kalman filtresine benzer ama daha fazla olasılığa dayalıdır.
- **KLT Tracker (Kanade-Lucas-Tomasi Tracker)** → Optik akış kullanarak nesneleri takip eder.
  
  ---
- ## **Özet Karşılaştırma**
  
  | Yaklaşım | Algoritma | Model Gerektirir mi? | Hız | Doğruluk | Uygulama Alanı |
  | ---- | ---- | ---- |
  | **Yorumlama Tabanlı ** | SuperPoint | ✅ | Orta | Çok Yüksek | SLAM, Görüntü Eşleştirme |
  |   | R2D2 | ✅ | Orta | Yüksek | Görüntü Analizi |
  |   | SIFT | ❌ | Yavaş | Çok Yüksek | 3D Rekonstrüksiyon |
  |   | ORB | ❌ | Çok Hızlı | Orta | SLAM, Gerçek Zamanlı Uygulamalar |
  |   | AKAZE | ❌ | Orta | Yüksek | Görsel Odometri |
  |   | RAFT | ✅ | Orta | Çok Yüksek | Optik Akış, Video Analizi |
  | **Yorumsuz** | Lucas-Kanade Optical Flow | ❌ | Hızlı | Orta | Video İşleme |
  |   | Farneback Optical Flow | ❌ | Orta | Orta | Hareket Algılama |
  |   | Epipolar Geometry | ❌ | Orta | Yüksek | Stereo Görüntüleme |
  |   | Kalman Filter | ❌ | Hızlı | Orta | Nesne Takibi |
  |   | CamShift | ❌ | Hızlı | Orta | Basit Nesne Takibi |
  
  ---
## **Sonuç**
- **Gerçek zamanlı uygulamalar için** ORB, AKAZE veya optik akış yöntemleri daha uygundur.
- **Hassasiyet gerektiren uygulamalar için** SIFT, SuperPoint veya RAFT gibi derin öğrenme tabanlı yöntemler tercih edilmelidir.
- **SLAM ve görsel odometri için** SuperPoint, R2D2, AKAZE ve optik akış tabanlı yöntemler iyi bir seçenektir.
- **Nesne takibi için** DeepSORT, Kalman Filter veya optik akış kullanılabilir.


! Bu algoritmalar Yorumlayıcı ve Keyframes ile çalışan algoritmalarıdır.

**Binary descriptor**, bir keypoint (anahtar nokta) çevresindeki yerel görsel bilgiyi temsil eden **ikili (0 ve 1'lerden oluşan) sabit uzunlukta bir bit vektörüdür**. Bir pikselin 0 veya 1 oluşu etrafında karşılaştıldıgı bir pikselin aydınlık olma durumuna göredir. Mesela diğer piksel daha parlaksa (255'e daha yakınsa) bu piksele 0 yazılır.

**Float Descriptor**,bir keypoint (anahtar nokta) çevresindeki yerel görsel piksellerin her birine ait float değerler tutar.

Algoritmalar

### Bınary Yorumlayıcılar (Descriptor)
- ORB  (hız)
- AKAZE (doğruluk)
- BRISK

### Float Yorumlayıcılılar
- KAZE
- SIFT (doğruluk)
- SURF

### Eşleştiriciler

#### BFMatcher

- Tüm descriptorlar birbirleri ile karşılaştırır.
```
cv2.BFMatcher(normType=cv2.NORM_HAMMING, crossCheck=True)
		  ```
`normtype`: Bınary'ler için: cv2.NORM_HAMMING, Floatlar için: cv2.NORM_L2 (öklid)
		- `crosscheck`: Doğrulamanın iki yönlü yapılmasını sağlar, A noktası B'ye en yakınsa **ve** B noktası da A’ya en yakınsa, eşleşme kabul edilir.

#### FlannBasedMatcher 
- FLANN (Fast Library for Approximate Nearest Neighbors), büyük veri setlerinde descriptor eşleşmesini yaklaşık (approximate) olarak ve çok daha hızlı yapar.
- index_params = dict(algorithm=1, trees=5) search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)

`algorithm = 1` => KDTree algoritması seçilir.
Float Descriptorlar için
`algorithm = 0` => LSH algoritması seçilir. 

Binary Descriptorlar için
- `trees` Kaç tane KDTree oluşturulacağı (daha fazla → daha iyi doğruluk ama yavaş)
- `checks`  Aramada kaç alternatif değerlendirileceği (daha fazla → daha doğru ama daha yavaş)

- **.match ve .knnMatch(k) Metodları**

- Bu iki metot flann ve bf içinde kullanılabilir. .match her bir desciptor için bir tane eşleşme döndürür. .knnMatch ise her desciptor için k adet eşleşme döndürür. Dolayısıyla knn daha yavaştır fakat daha detaylı sonuç üretmektedir. KNN için **Lowe's Ratio Test** uygulanabilir. Bu da en iyi eşleşme en iyi ikinci eşleşmeden daha iyi olmalıdır presinsibidir.
