Good Features to Track

Kategori: Computer Vision , 14 Şubat 2020 , JanFranco


Good Features to Track bir köşe bulma algoritmasıdır. Bir önceki yazımda Harris Corner Detection algoritmasını anlatmıştım. Bir window, image üzerinde slide ediliyor, R değerleri hesaplanıyordu.

Shi-Tomasi algoritmasında ise R değeri aşağıdaki şekilde hesaplanıyor. Eigenvalue çarpımları değil minimum değer alınıyor.



Bir anda neden Shi-Tomasi algoritmasına neden girdik? Çünü GoodFeaturesToTrack methodu arkaplanda Harris ve Shi-Tomasi algoritmalarınıdan birini kullanıyor. Bunu biz seçiyoruz. OpenCV kütüphanesini kullanarak Python'da görelim. İlk olarak parametrelere bakalım:


cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])
image – Input resim
maxCorners – Bulunmak istenen köşe sayısı. Belirtilen rakamdan fazla bulunursa en güçlü köşeler döndürülecek.
qualityLevel – Bir bölgenin köşe olması için gereken minimum kalite düzeyinin hesaplanmasında kullanılan çarpım değeridir. Örneğin bir bölgede değer 1500 bulundu. qualityLevel 0.01 verildi. 1500 * 0.01 = 15. 15 değerinin altında kalan bölgeler köşe olarak tespit edilse bile geçerli olmayacaktır.
minDistance – Köşeler arası minimum olması gereken öklid uzaklık.
mask – Opsiyoneldir. Sadece belirli alanı almak istersek veririz.
blockSize – Türev hesabı için window boyutu.
useHarrisDetector – cornerHarris() ve cornerMinEigenVal() methodlarından hangisinin kullanılacağını belirtir. (cornerHarris methodu için 1 diğer method için 0)
k – Harris methodu için k değeri. Önceki yazımda açıklamıştım.

Algoritma şu şekilde çalışıyor:

1- Köşeler ve kalite değerleri cornerMinEigenVal veya cornerHarris methodları ile tespit ediliyor. (Default olarak cornerMinEigenVal, yukarıda bahsettiğimiz min(lambda1, lambda2))

2- Non-maximum suppression uygulanıyor.

3- Parametre olarak verdiğimiz değer ile kalite hesapları tekrar yapılıyor ve bazı değerler eleniyor.

4- Kalan köşeler kalite değerlerine göre sıralanıyor.

5- Köşeler son kez maxDistance değeri için test ediliyor. Eğer maxDistance değerinden daha yakında daha iyi köşeler varsa önceki köşeler eleniyor.

qualityLevel değeri 0-1 arasında seçilirse algoritma daha etkili çalışır. Python üzerinden deneyelim:


import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('../data/horse.jpg')
img2show = img.copy()
img2show = cv2.cvtColor(img2show, cv2.COLOR_RGB2BGR)
plt.figure(1)
plt.imshow(img2show)

grayImg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
dst = cv2.goodFeaturesToTrack(grayImg, 220, 0.01, 50)
dst = np.int0(dst)

blackBG = np.zeros(img.shape)

for i in dst:
    x, y = i.ravel()
    cv2.circle(blackBG, (x, y), 10, 255, -1)

plt.figure(2)
plt.imshow(blackBG)
plt.show()
>>





Burada 220 değerini tüm köşeleri bulsun diye rastgele verdim. 1000, 1000000 gibi bir değer de verilebilirdi. 0.01 genelde başarılı sonuçlar çıkartan bir kalite değeridir. Mesafe değerini de 50 verdim. Şimdi sonuçları değiştirip, gözlemler yapalım.


dst = cv2.goodFeaturesToTrack(grayImg, 220, 0.01, 10)
>>





Mesafe değerinin düşürdüğümüzde normal olarak köşe sayısı artacaktır. Bunu bir örnekle tekrar anlatayım. A köşesi seçildi. Mesafe değeri 100 verildi. 200 birim karelik alanda (merkez A olmak üzere) A köşesinden daha kaliteli köşeler aranacaktır ve bulunursa A köşesi görmezden gelinecektir. Değeri 10 verirsek ise A köşesiyle birlikte, A köşesinden daha kaliteli köşeler hep birlikte return edilecektir. Mesafe 10 kalsın, kalite levelini değiştirelim:


dst = cv2.goodFeaturesToTrack(grayImg, 220, 0.5, 10)
>>





Tabi ki değeri büyütürsek köşe sayısı azalacak, sadece türevleri arasında büyük farklar olan noktalar yani kaliteli köşeler gösterilecek. Son olarak goodFeaturesToTrack methodunun arkaplandaki algoritmasını Harris yapalım ve cornerHarris ile karşılaştıralım:


import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('../data/horse.jpg')
img2show = img.copy()
img2show = cv2.cvtColor(img2show, cv2.COLOR_RGB2BGR)
plt.figure(1)
plt.imshow(img2show)

grayImg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

dstHarris = cv2.cornerHarris(src=grayImg, blockSize=3, ksize=5, k=0.04)

blackBG = np.zeros(img.shape)
blackBG[dstHarris > .05 * dstHarris.max()] = [0, 0, 255]
plt.figure(2)
plt.imshow(blackBG)

dst = cv2.goodFeaturesToTrack(grayImg, 220, 0.2, 1, blockSize=3, useHarrisDetector=True, k=0.04)
dst = np.int0(dst)

blackBG = np.zeros(img.shape)

for i in dst:
    x, y = i.ravel()
    cv2.circle(blackBG, (x, y), 3, 255, -1)

plt.figure(3)
plt.imshow(blackBG)
plt.show()
>>




Sonraki Yazı: Canny Edge Detection
Yorumlar

Henüz bir yorum bulunmuyor.