Özellik eşleşmesine bir göz atmak isteyebilirsiniz. Fikir, iki görüntüdeki özellikleri bulmak ve bunlarla eşleşmektir. Bu yöntem, başka bir görüntüdeki bir şablonu (bir logo söyleyin) bulmak için yaygın olarak kullanılır. Bir özellik, özünde, insanların köşeler veya açık alanlar gibi bir görüntüde ilginç bulacağı şeyler olarak tanımlanabilir. Orada birçok özellik algılama tekniği vardır, ancak benim tavsiyem bir özellik algılama algoritması olarak ölçek değişmez özellik dönüşümü (SIFT) kullanmaktır. SIFT görüntü çevirisi, ölçeklendirme, döndürme, aydınlatma değişikliklerine kısmen değişmez ve yerel geometrik bozulmaya karşı dayanıklıdır. Bu, görüntülerin biraz farklı oranlara sahip olabileceği spesifikasyonunuza uyuyor gibi görünüyor.
Sağladığınız iki resim göz önüne alındığında, FLANN özellik eşleştiricisini kullanarak özellikleri eşleştirmeye çalışacağız . İki görüntünün aynı olup olmadığını belirlemek için, David G. Lowe tarafından Ölçek-Değişmez Anahtar Noktalarından Ayırt Edici Görüntü Özelliklerinde açıklanan oran testini geçen eşleşme sayısını izleyen önceden belirlenmiş bir eşiği temel alabiliriz . Testin basit bir açıklaması, oran testinin eşleşmelerin belirsiz olup olmadığını kontrol etmesi ve kaldırılması gerektiğidir, bunu bir aykırı değer kaldırma tekniği olarak ele alabilirsiniz. İki görüntünün aynı olup olmadığını belirlemek için bu testi geçen eşleşme sayısını sayabiliriz. İşte sonuç eşleşen özellik:
Matches: 42
Noktalar algılanan tüm eşleşmeleri temsil ederken yeşil çizgiler oran testini geçen "iyi eşleşmeleri" temsil eder. Oran testini kullanmazsanız tüm noktalar çizilecektir. Bu şekilde, bu filtreyi yalnızca en iyi eşleşen özellikleri korumak için bir eşik olarak kullanabilirsiniz.
Python'da uyguladım, Rails'e pek aşina değilim. Umarım bu yardımcı olur, iyi şanslar!
kod
import numpy as np
import cv2
# Load images
image1 = cv2.imread('1.jpg', 0)
image2 = cv2.imread('2.jpg', 0)
# Create the sift object
sift = cv2.xfeatures2d.SIFT_create(700)
# Find keypoints and descriptors directly
kp1, des1 = sift.detectAndCompute(image2, None)
kp2, des2 = sift.detectAndCompute(image1, None)
# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]
count = 0
# Ratio test as per Lowe's paper (0.7)
# Modify to change threshold
for i,(m,n) in enumerate(matches):
if m.distance < 0.15*n.distance:
count += 1
matchesMask[i]=[1,0]
# Draw lines
draw_params = dict(matchColor = (0,255,0),
# singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
# Display the matches
result = cv2.drawMatchesKnn(image2,kp1,image1,kp2,matches,None,**draw_params)
print('Matches:', count)
cv2.imshow('result', result)
cv2.waitKey()
compare
komut satırı aracında bir-subimage-search
anahtar var.