Template Matching

Kategori: Computer Vision , 27 Ocak 2020 , JanFranco


Template matching, temel computer vision uygulamalarındandır. Elimizde bir target resim bir de target resmi arayacağımız başka bir resim olması gerekir. Bir resmi bir resmin içinde ararız. Ancak en büyük dezavantaj, tamamen aynı resim olmak zorundadır. OpenCV kütüphanesini kullanarak Python üzerinden template matching uygulamasını yapalım. Başlamadan önce template matching ile ilgili daha fazla bilgi öğrenmek için Wikipedia linkini, methodların arkasındaki matematik için ise opencv linkini ziyaret edebilirsiniz:


https://en.wikipedia.org/wiki/Template_matching
https://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
Template matching arkasındaki matematik ve methodların detayları ile ilgili daha ayrıntılı yazıları ileride yayınlayacağım. Ancak yine de okumanızı tavsiye ederim. Kütüphaneleri ve resimleri alalım:


import cv2
import matplotlib.pyplot as plt

dogImg = cv2.imread('../data/sammy.jpg')
faceImg = cv2.imread('../data/sammy_face.jpg')

dogImg = cv2.cvtColor(dogImg, cv2.COLOR_RGB2BGR)
faceImg = cv2.cvtColor(faceImg, cv2.COLOR_RGB2BGR)

plt.title("Dog image")
plt.imshow(dogImg)
plt.show()

plt.title("Face of the dog")
plt.imshow(faceImg)
plt.show()
>>

Template Matching

Template Matching

6 farklı methodumuz var. Bu methodların isimlerini bir listeye atıp eval fonksiyonu ile gerçek bir fonksiyonmuş gibi davranabiliriz:


height, width, _ = faceImg.shape
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
methods listesinde gezinecek bir for döngüsü açalım. Resmin kopyasını alalım. matchTemplate methodu ile template matching yapalım ve sonuçları res değişkenine atalım. res değişkeni şuan bir heat map yani ısı resimdir. Eşleşmenin olduğu yerler daha sarı renklidir. cv2.minMaxLoc methodu ile bu heat maptaki minimimum ve maximum değerleri ve bu değerlerin lokasyonlarını alabiliriz. TM_SQDIFF ve TM_SQDIFF_NORMED diğer methodların tam tersi bir şekilde çalışıyor ve eşleşme olduğu yeri maximum değil minimim olarak alıyor. Bu özelliğe de dikkat ederek:


for m in methods:

    full = dogImg.copy()

    res = cv2.matchTemplate(full, faceImg, eval(m))
    minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(res)

    if eval(m) in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        topLeft = minLoc
    else:
        topLeft = maxLoc

    bottomRight = (topLeft[0] + width, topLeft[1] + height)
    cv2.rectangle(full, topLeft, bottomRight, (0, 0, 255), 5)

    plt.subplot(121)
    plt.imshow(res)
    plt.title('Result of Template Matching')

    plt.subplot(122)
    plt.imshow(full)
    plt.title('Detected Point')
    plt.suptitle(m)
    plt.show()
>>

Template Matching

Template Matching

Template Matching

Template Matching

Template Matching

Template Matching


Sonraki Yazı: Corner Detection
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın