· Hakan Çelik · OpenCV / Özellik Tespiti · 3 dk okuma
Özellik Eşleştirme

OpenCV Serisi 41/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?
Özellik Eşleştirme
Hedefler
Bu bölümde:
- Bir görüntüdeki özelliklerin diğerleriyle nasıl eşleştirileceğini göreceğiz
- OpenCV’de Kaba Kuvvet eşleştiricisi ve FLANN Eşleştiricisini kullanacağız
Kaba Kuvvet Eşleştiricisinin Temelleri
Kaba Kuvvet eşleştiricisi basittir. İlk setin bir özelliğinin tanımlayıcısını alır ve bazı mesafe hesaplamaları kullanarak ikinci setteki diğer tüm özelliklerle eşleştirir. En yakın olan döndürülür.
BF eşleştiricisi için, cv.BFMatcher() kullanarak BFMatcher nesnesi oluşturulmalıdır. İki isteğe bağlı parametre alır:
- normType — mesafe ölçümünü belirtir. Varsayılan cv.NORM_L2’dir (SIFT, SURF için iyidir). ORB, BRIEF, BRISK gibi ikili dize tabanlı tanımlayıcılar için Hamming mesafesini kullanan cv.NORM_HAMMING kullanılmalıdır.
- crossCheck — True ise yalnızca çapraz eşleşmeleri döndürür; bu, SIFT makalesindeki oran testinin iyi bir alternatifidir.
İki önemli yöntem vardır: BFMatcher.match() (en iyi eşleşmeyi döndürür) ve BFMatcher.knnMatch() (k en iyi eşleşmeyi döndürür).
cv.drawMatches() eşleşmeleri çizmemize yardımcı olur. İki görüntüyü yatay olarak yığar ve en iyi eşleşmeleri gösteren çizgiler çizer.
ORB Tanımlayıcılarıyla Kaba Kuvvet Eşleştirmesi
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1 = cv.imread('box.png', cv.IMREAD_GRAYSCALE) # sorgu görüntüsü
img2 = cv.imread('box_in_scene.png', cv.IMREAD_GRAYSCALE) # eğitim görüntüsü
# ORB dedektörünü başlat
orb = cv.ORB_create()
# ORB ile anahtar noktaları ve tanımlayıcıları bul
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
# cv.NORM_HAMMING ile BFMatcher nesnesi oluştur
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
# Tanımlayıcıları eşleştir
matches = bf.match(des1, des2)
# Mesafe sırasına göre sırala
matches = sorted(matches, key=lambda x: x.distance)
# İlk 10 eşleşmeyi çiz
img3 = cv.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3), plt.show()
DMatch Nesnesi Nedir?
matches = bf.match(des1, des2) satırının sonucu bir DMatch nesneleri listesidir. Bu DMatch nesnesi şu özelliklere sahiptir:
- DMatch.distance — Tanımlayıcılar arasındaki mesafe. Düşük olan daha iyidir.
- DMatch.trainIdx — Eğitim tanımlayıcılarındaki tanımlayıcı indeksi
- DMatch.queryIdx — Sorgu tanımlayıcılarındaki tanımlayıcı indeksi
- DMatch.imgIdx — Eğitim görüntüsünün indeksi
SIFT Tanımlayıcılarıyla Kaba Kuvvet Eşleştirmesi ve Oran Testi
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1 = cv.imread('box.png', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('box_in_scene.png', cv.IMREAD_GRAYSCALE)
# SIFT dedektörünü başlat
sift = cv.SIFT_create()
# SIFT ile anahtar noktaları ve tanımlayıcıları bul
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# Varsayılan parametrelerle BFMatcher
bf = cv.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
# Oran testini uygula
good = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good.append([m])
# cv.drawMatchesKnn, eşleşmeler için liste listesi bekler
img3 = cv.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.imshow(img3), plt.show()
FLANN Tabanlı Eşleştirici
FLANN, Yaklaşık En Yakın Komşular için Hızlı Kütüphane anlamına gelir. Büyük veri setlerinde ve yüksek boyutlu özellikler için hızlı en yakın komşu araması için optimize edilmiş algoritmalar içerir. Büyük veri setleri için BFMatcher’dan daha hızlı çalışır.
FLANN tabanlı eşleştirici için, kullanılacak algoritmayı ve ilgili parametrelerini belirten iki sözlük geçirmemiz gerekir:
# SIFT, SURF vb. için:
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
# ORB için:
FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH,
table_number=6,
key_size=12,
multi_probe_level=1)import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1 = cv.imread('box.png', cv.IMREAD_GRAYSCALE)
img2 = cv.imread('box_in_scene.png', cv.IMREAD_GRAYSCALE)
sift = cv.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
matchesMask = [[0, 0] for i in range(len(matches))]
for i, (m, n) in enumerate(matches):
if m.distance < 0.7 * n.distance:
matchesMask[i] = [1, 0]
draw_params = dict(matchColor=(0, 255, 0),
singlePointColor=(255, 0, 0),
matchesMask=matchesMask,
flags=cv.DrawMatchesFlags_DEFAULT)
img3 = cv.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **draw_params)
plt.imshow(img3), plt.show()
Hakan Çelik


