· Hakan Çelik · OpenCV / Özellik Tespiti · 2 dk okuma
Özellik Eşleştirme + Nesneleri Bulmak için Homografi

OpenCV Serisi 42/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 + Nesneleri Bulmak için Homografi
Hedefler
Bu bölümde:
- Karmaşık bir görüntüde bilinen nesneleri bulmak için calib3d modülünden özellik eşleştirme ve findHomography’yi birleştireceğiz
Temel Bilgiler
Son oturumda ne yaptık? Bir sorgu görüntüsü aldık, içinde bazı özellik noktaları bulduk, başka bir eğitim görüntüsü aldık, o görüntüdeki özellikleri bulduk ve aralarındaki en iyi eşleşmeleri bulduk. Kısacası, bir nesnenin bazı bölgelerini karmaşık başka bir görüntüde bulduk. Bu bilgi, nesneyi eğitim görüntüsünde tam olarak bulmak için yeterlidir.
Bunun için calib3d modülünden cv.findHomography() fonksiyonunu kullanabiliriz. Her iki görüntüden nokta setini geçirirsek, o nesnenin perspektif dönüşümünü bulur. Ardından nesneyi bulmak için cv.perspectiveTransform() kullanabiliriz. Dönüşümü bulmak için en az dört doğru nokta gereklidir.
Eşleştirme sırasında bazı hatalar olabilir. Bu sorunu çözmek için algoritma RANSAC veya LEAST_MEDIAN kullanır. İyi eşleşmeler inlier, geri kalanlar ise outlier olarak adlandırılır. cv.findHomography() inlier ve outlier noktaları belirten bir maske döndürür.
Kod
Önce görüntülerde SIFT özelliklerini bulalım ve en iyi eşleşmeleri bulmak için oran testini uygulayalım:
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
MIN_MATCH_COUNT = 10
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ü
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)
# Lowe'un oran testine göre tüm iyi eşleşmeleri sakla
good = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good.append(m)Şimdi en az 10 eşleşme olması koşulunu belirliyoruz. Yeterli eşleşme bulunursa, eşleştirilen anahtar noktaların konumlarını her iki görüntüden çıkarıyoruz. Perspektif dönüşümü bulmak için bunlar geçirilir. Bu 3×3 dönüşüm matrisini elde ettikten sonra, sorgu görüntüsünün köşelerini eğitim görüntüsündeki karşılıklı noktalara dönüştürmek için kullanırız:
if len(good) > MIN_MATCH_COUNT:
src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
M, mask = cv.findHomography(src_pts, dst_pts, cv.RANSAC, 5.0)
matchesMask = mask.ravel().tolist()
h, w = img1.shape
pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
dst = cv.perspectiveTransform(pts, M)
img2 = cv.polylines(img2, [np.int32(dst)], True, 255, 3, cv.LINE_AA)
else:
print("Yeterli eşleşme bulunamadı - {}/{}".format(len(good), MIN_MATCH_COUNT))
matchesMask = None
draw_params = dict(matchColor=(0, 255, 0), # eşleşmeleri yeşil çiz
singlePointColor=None,
matchesMask=matchesMask, # yalnızca inlierleri çiz
flags=2)
img3 = cv.drawMatches(img1, kp1, img2, kp2, good, None, **draw_params)
plt.imshow(img3, 'gray'), plt.show()Aşağıda sonuca bakın. Nesne, karmaşık görüntüde beyaz renkle işaretlenmiştir:

Hakan Çelik


