· Hakan Çelik · OpenCV / Görüntü İşleme · 3 dk okuma
Şablon Eşleştirme

OpenCV Serisi 20/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?
Şablon Eşleştirme
Hedefler
Bu bölümde öğrenecekleriniz:
- Şablon eşleştirme kullanarak bir görüntüdeki nesneleri bulmak
- Şu fonksiyonları göreceksiniz:
cv2.matchTemplate(),cv2.minMaxLoc()
Teori
Şablon eşleştirme, bir şablon görüntüsünün daha büyük bir görüntü içindeki konumunu araştırmak ve bulmak için kullanılan bir yöntemdir. OpenCV bu amaç için cv2.matchTemplate() fonksiyonuna sahiptir. Bu fonksiyon, şablon görüntüyü girdi görüntüsü üzerinde kaydırır (2B konvolüsyona benzer şekilde) ve şablon ile şablonun altındaki girdi görüntüsü yamasını karşılaştırır. OpenCV’de birçok karşılaştırma yöntemi uygulanmıştır. Sonuç olarak her piksel değerinin şablonla ne kadar eşleştiğini gösteren gri tonlamalı bir görüntü döner.
Girdi görüntüsü (W x H) boyutundaysa ve şablon görüntü (w x h) boyutundaysa, çıktı görüntüsü (W-w+1, H-h+1) boyutunda olacaktır. Sonucu aldıktan sonra en yüksek/en düşük değerin nerede olduğunu bulmak için cv2.minMaxLoc() fonksiyonunu kullanabilirsiniz. Bu değeri dikdörtgenin sol üst köşesi olarak alın ve (w, h) değerlerini dikdörtgenin genişliği ve yüksekliği olarak kullanın. O dikdörtgen şablonunuzun bölgesidir.
Not:
cv2.TM_SQDIFFkarşılaştırma yöntemini kullanıyorsanız minimum değer en iyi eşleşmeyi verir.
OpenCV’de Şablon Eşleştirme
Örnek olarak Messi’nin fotoğrafında yüzünü arayacağız. Bu amaç için aşağıdaki şablonu oluşturduk:

Sonuçların nasıl göründüğünü görmek için tüm karşılaştırma yöntemlerini deneyelim:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg', cv.IMREAD_GRAYSCALE)
assert img is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
img2 = img.copy()
template = cv.imread('template.jpg', cv.IMREAD_GRAYSCALE)
assert template is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
w, h = template.shape[::-1]
# Karşılaştırma için 6 yöntemin listesi
methods = ['TM_CCOEFF', 'TM_CCOEFF_NORMED', 'TM_CCORR',
'TM_CCORR_NORMED', 'TM_SQDIFF', 'TM_SQDIFF_NORMED']
for meth in methods:
img = img2.copy()
method = getattr(cv, meth)
# Şablon eşleştirmeyi uygula
res = cv.matchTemplate(img, template, method)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# TM_SQDIFF veya TM_SQDIFF_NORMED ise minimum değeri al
if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img, top_left, bottom_right, 255, 2)
plt.subplot(121), plt.imshow(res, cmap='gray')
plt.title('Eşleştirme Sonucu'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img, cmap='gray')
plt.title('Tespit Edilen Nokta'), plt.xticks([]), plt.yticks([])
plt.suptitle(meth)
plt.show()Sonuçlara bakın:
- cv2.TM_CCOEFF

- cv2.TM_CCOEFF_NORMED

- cv2.TM_CCORR

- cv2.TM_CCORR_NORMED

- cv2.TM_SQDIFF

- cv2.TM_SQDIFF_NORMED

Gördüğünüz gibi cv2.TM_CCORR yöntemi beklediğimiz kadar iyi bir sonuç vermemektedir.
Birden Fazla Nesneyle Şablon Eşleştirme
Önceki bölümde Messi’nin yüzünü aradık ve bu yüz görüntüde yalnızca bir kez geçiyordu. Birden fazla kez geçen bir nesne arıyorsanız cv2.minMaxLoc() size tüm konumları vermez. Bu durumda eşik değeri (thresholding) kullanırız. Bu örnekte ünlü Mario oyununun ekran görüntüsünü kullanarak içindeki paraları bulacağız:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv.imread('mario.png')
assert img_rgb is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
img_gray = cv.cvtColor(img_rgb, cv.COLOR_BGR2GRAY)
template = cv.imread('mario_coin.png', cv.IMREAD_GRAYSCALE)
assert template is not None, "Dosya okunamadı, os.path.exists() ile kontrol edin"
w, h = template.shape[::-1]
res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv.imwrite('res.png', img_rgb)Sonuç:

Hakan Çelik

