Opencv de Şablon Eşleştirme

Kaan Koska
3 min readMay 12, 2021

Opencv de şablon eşleştirme elimizde bulunan bir görüntünün bir parçasını algoritmamızdaki fonksiyonlarımız yardımı ile bir başka şablon içerisinde yani kaynak şablonumuz içerisinde aratarak eşleşme olduğu takdire birleştirmemize yardımcı olur opencv de bir fotoğrafı incelerken o resmi matris olarak inceler eğer iki resminde matrislerindeki kısımlar uyuyor ise şablon birleştirme yapılmış olur bu yöntem nesneleri ayırt etmede pek başarılı değildir bu yöntemde sahip olduğumuz şablon kaynak matrisi üzerinde gezdirilir bu şekilde birleştirme yapılarak eşleşme sağlanır ancak eğer birleştirmek istediğiniz resim kaynak resiminizin içinde bulunmayan bir resim ise eşleşme sağlanamaz. Şablon eşleştirme yapılırken sahip olduğumuz şablon kaynak resmin 0,0 koordinatlarına oturtulur daha sonra her piksel incelenerek eşleşme aranır bu eşleşme aranırken bir çok farklı fonksiyon kullanılabilir bu fonksiyonlar şablon eşleştirme için geliştirilmiş en çok kullanılan fonksiyonlardır ve her birinin farklı matematik formülleri vardır.

  1. TM_CCOEFF
  2. 2. TM_CCOEFF_NORMED
  3. 3. TM_CCORR
  4. 4. TM_CCORR_NORMED
  5. 5. TM_SQDIFF
  6. 6. TM_SQDIFF_NORMED

Template Matching(Şablon Eşleştirme) görüntü işlemede kullanılan nesne tanımla yöntemlerinden birisidir ancak bu konuda çok verimli ve başarılı olduğu söylenemez bu yöntem kullanılarak başarılı bir şekilde nesne tanımlamak isteniyorsa tanınmak istenen görüntü kaynak üzerinden kesilerek alınmış bir nesne olmalıdır örneğin başka bir resimden alınan muzu ana şablon üzerinde aratırsanız sonuç olumsuz olucaktır eğer o muz resmini ana kaynaktan kırparak aldıysanız olumlu bir şekilde eşleşme sağlıyabilirsiniz. Bu sebeple çok etkili bir nesne tanıma performansı sunmaz.

Opencv Şablon Birleştirme Örneklerinin Kodlarının İncelenmesi

import cv2

import numpy as np

image_path = “D:\\OpenCV\\test_images\\starwars.jpg”

template_path = “D:\\OpenCV\\test_images\\starwars2.jpg”

Opencv fonksiyonlarımı kullanabilmek için opencv kütüphanemi import ediyorum daha sonra aynı şekilde dizi işlemlerimde kullanabilmek için numpy kütüphanemi import ediyorum daha önce de dediğim gibi şablon birleştirmede resmi bir matris olarak inceleyip her pikseli kontrol ederek tanımlama yapmaya çalışacağımız için dizilerle işimiz olucak bu yüzden bize bu konuda yardımcı olucak olan numpy kütüphanemizi kullanıyoruz Daha sonra ise resimlerimizin dosya yollarını değişkenlerimize atıyoruz bulmak istediğimiz nesne ve içinde aramak istediğimiz resimlerin dosya yolları.

img = cv2.imread(image_path)

gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

template = cv2.imread(template_path,cv2.IMREAD_GRAYSCALE)

w,h = template.shape[::-1]

Yukarıda ise ilk olarak resmimizi imread fonksiyonu ile okuyoruz daha sonra daha iyi bir inceleme performansı için resmimizi 3 kanaldan 1 kanala çekiyoruz yani griye çeviriyoruz daha sonra template i okuyoruz bu okumayıda aynı şekilde gri formatta yapıyoruz daha sonra ise w,h değişkenlerime template şablonumu yani bulmak istediğim nesnenin boyutunu ve genişliğini atıyorum bu bilgileri ileride eğer eşleşme sağlarsam rectangle çizmek için kullanacağım template.shape[::-1] bu formatta almamın sebebi ise terten okuyup alarak w,h width ve height değişkenlerime doğru değerleri atamak için

result = cv2.matchTemplate(gray_img,template,cv2.TM_CCOEFF_NORMED) location = np.where(result >= 0.95)

for point in zip(*location[::-1]):

cv2.rectangle(img,point,(point[0]+w,point[1]+h),(0,255,0),3) cv2.imshow(“Image”,img)

cv2.waitKey(0)

cv2.destroyAllWindows()

Yukarıda ise result değişkenime matchTemplate fonksiyonu ile şablon birleştirme yapıp bu değişkenin sonucunu atıyorum bu sonuç result değişkenine dizi olarak bu bilgileri atıyor yani birden fazla nesne tanımlamış oluyoruz bu fonksiyonun içinde ise ilk olarak ana resmim olan gray_resmi atıyorum daha sonra tanımlamak istediğim nesne olan tamplate i atıyorum daha sonra ise önceden bahsettiğim şablon birleştirme fonksiyonumu yazıyorum bu fonksiyonun opsiyon ve çeşitlerinden bahsetmiştim daha sonra ise location değişkenime result dizisindeki 95 değerinden büyük olan değerleri atıyorum daha sonra ise bu değerleri for döngüsünde dönerek teker teker ulaşıyorum bu bilgileri alırken location[::-1] yazarak ters den başlıyarak alıyorum zip şeklinde okumamın sebebi ise zip değerleri bize daha orantılı olarak sunuyor kabul edilebilir değerler örneğin 0.00050 değerini 0.50 olarak vermesi gibi bu önemli bir formatlama çünkü bu değerler bize tanımlamanın tespit edildiği koordinatları veriyor ve biz bu koordinatları rectangle çizerken kullanacağız daha sonra ise rectangle çiziyoruz buradaki konumlara daha öncede dediğim gibi for da dönüp pointe attığımız değerlerden alıyoruz daha sonra rectangleın rengini ve kalınlığını belirliyoruz en son ise resmimizi gösteriyoruz.

Örnek Pasaport üzerindeki Ülke Bayrağını Tanıma

--

--

Kaan Koska

Computer programming student, currently working on computer vision, opencv, Yolo, Python