คุณอาจต้องการดูการจับคู่คุณสมบัติ แนวคิดคือการค้นหาคุณสมบัติในสองภาพและจับคู่พวกเขา วิธีนี้มักใช้เพื่อค้นหาแม่แบบ (พูดโลโก้) ในภาพอื่น ในสาระสำคัญสามารถอธิบายเป็นสิ่งที่มนุษย์จะพบว่าน่าสนใจในภาพเช่นมุมหรือพื้นที่เปิดโล่ง มีเทคนิคการตรวจจับคุณสมบัติอยู่หลายประเภท แต่ข้อเสนอแนะของฉันคือการใช้การแปลงคุณสมบัติแบบไม่แปรปรวน (SIFT) เป็นอัลกอริทึมการตรวจจับคุณลักษณะ SIFT ไม่แปรเปลี่ยนไปจากการแปลภาพ, การปรับขนาด, การหมุน, ค่าคงที่บางส่วนเพื่อการเปลี่ยนแปลงความสว่างและความทนทานต่อความผิดเพี้ยนทางเรขาคณิตในท้องถิ่น ดูเหมือนว่าจะตรงกับข้อกำหนดของคุณซึ่งรูปภาพสามารถมีอัตราส่วนต่างกันเล็กน้อย
ป.ร. ให้ไว้สองภาพของคุณที่นี่ความพยายามที่จะตรงกับคุณสมบัติที่ใช้Flann คุณลักษณะจับคู่ เพื่อตรวจสอบว่าภาพสองภาพที่เหมือนกันเราสามารถฐานมันออกบางเกณฑ์ที่กำหนดไว้ซึ่งติดตามจำนวนของการแข่งขันที่ผ่านการทดสอบอัตราส่วนที่อธิบายไว้ในภาพที่โดดเด่นจากคุณสมบัติชั่ง-คง Keypoints โดย เดวิด G โลว์ คำอธิบายอย่างง่ายของการทดสอบคือการทดสอบอัตราส่วนจะตรวจสอบว่าการจับคู่นั้นไม่ชัดเจนและควรลบออกหรือไม่คุณสามารถถือว่าเป็นเทคนิคการกำจัดค่าเดิมได้ เราสามารถนับจำนวนการแข่งขันที่ผ่านการทดสอบนี้เพื่อตรวจสอบว่าภาพทั้งสองเหมือนกันหรือไม่ นี่คือผลลัพธ์ที่ตรงกับคุณสมบัติ:
Matches: 42
จุดแสดงถึงการแข่งขันทั้งหมดที่ตรวจพบในขณะที่เส้นสีเขียวแสดงถึง "การจับคู่ที่ดี" ที่ผ่านการทดสอบอัตราส่วน หากคุณไม่ได้ใช้การทดสอบอัตราส่วนคะแนนทั้งหมดจะถูกวาด ด้วยวิธีนี้คุณสามารถใช้ตัวกรองนี้เป็นเกณฑ์ในการรักษาคุณสมบัติที่ดีที่สุดเท่านั้น
ฉันนำไปใช้ใน Python ฉันไม่คุ้นเคยกับ Rails มากนัก หวังว่านี่จะช่วยโชคดี!
รหัส
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
เครื่องมือบรรทัดคำสั่งของ ImageMagick มี-subimage-search
สวิตช์