आप सुविधा मिलान पर एक नज़र रखना चाहते हैं। विचार दो छवियों में सुविधाओं को खोजने और उनसे मेल खाने का है। इस पद्धति का उपयोग आमतौर पर किसी अन्य छवि में टेम्पलेट (लोगो कहने) के लिए किया जाता है। एक विशेषता, संक्षेप में, उन चीजों के रूप में वर्णित किया जा सकता है जो मनुष्य को एक छवि में दिलचस्प मिलेंगे, जैसे कि कोने या खुली जगह। कई तरह की फीचर डिटेक्शन तकनीकें हैं, हालांकि मेरी सिफारिश है कि एक स्केल-इनवायरमेंट फीचर ट्रांसफॉर्मेशन (SIFT) का इस्तेमाल फीचर डिटेक्शन एल्गोरिदम के रूप में किया जाए। SIFT छवि अनुवाद, स्केलिंग, रोटेशन, रोशनी परिवर्तन के लिए आंशिक रूप से अपरिवर्तनीय, और स्थानीय ज्यामितीय विरूपण के लिए मजबूत है। यह आपके विनिर्देश से मेल खाता है जहां छवियों में थोड़ा भिन्न अनुपात हो सकता है।
आपकी दो प्रदान की गई छवियों को देखते हुए, यहां FLANN सुविधा मिलानकर्ता का उपयोग करके सुविधाओं से मेल खाने का प्रयास किया गया है । यह निर्धारित करने के लिए कि दो छवियां समान हैं, हम इसे कुछ पूर्व निर्धारित दहलीज से आधार बना सकते हैं जो डेविड जी लोव द्वारा स्केल-इनवेरिएंट कीप्वाइंट्स से डिस्टिंक्टिव इमेज फीचर्स में वर्णित अनुपात परीक्षण पास करने वाले मैचों की संख्या को ट्रैक करता है । परीक्षण की एक सरल व्याख्या यह है कि यदि परीक्षण अस्पष्ट हैं और उन्हें हटा दिया जाना चाहिए, तो अनुपात परीक्षण जांच करता है, आप इसे एक आउटस्टैंडिंग हटाने की तकनीक के रूप में मान सकते हैं। हम यह निर्धारित करने के लिए कि इस परीक्षण को पास कर सकते हैं कि दोनों चित्र समान हैं या नहीं। यहाँ सुविधा मिलान परिणाम हैं:
Matches: 42
डॉट्स का पता लगाए गए सभी मैचों का प्रतिनिधित्व करते हैं जबकि हरी रेखा "अच्छे मैचों" का प्रतिनिधित्व करते हैं जो अनुपात परीक्षण पास करते हैं। यदि आप अनुपात परीक्षण का उपयोग नहीं करते हैं, तो सभी बिंदु खींचे जाएंगे। इस तरह, आप इस फ़िल्टर का उपयोग केवल सर्वश्रेष्ठ मिलान सुविधाओं को रखने के लिए एक सीमा के रूप में कर सकते हैं।
मैंने इसे पायथन में लागू किया, मैं रेल से बहुत परिचित नहीं हूं। उम्मीद है कि इससे मदद करेगी, सुसंयोग!
कोड
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
कमांड लाइन टूल में एक-subimage-search
स्विच है।