Возможно, вы захотите взглянуть на соответствие функции. Идея состоит в том, чтобы найти функции на двух изображениях и сопоставить их. Этот метод обычно используется для поиска шаблона (скажем, lo go) в другом изображении. По сути, особенность может быть описана как вещи, которые люди находят интересными на изображении, такие как углы или открытые пространства. Существует много типов методов обнаружения признаков, однако я рекомендую использовать масштабно-инвариантное преобразование признаков (SIFT) в качестве алгоритма обнаружения признаков. SIFT инвариантен к трансляции изображения, масштабированию, повороту, частично инвариантен к изменениям освещения и устойчив к локальному искажению геометрии c. Похоже, это соответствует вашей спецификации, где изображения могут иметь немного отличающиеся rat ios.
Учитывая ваши два предоставленных изображения, вот попытка сопоставить функции, используя Соответствие функций FLANN . Чтобы определить, совпадают ли эти два изображения, мы можем основать его на некотором заранее определенном пороговом значении, которое отслеживает число совпадений, которые проходят тест на соотношение, описанный в Отличительные особенности изображения из масштабируемых инвариантных ключевых точек на Дэвид Дж. Лоу . Простое объяснение теста состоит в том, что тест отношения проверяет, являются ли совпадения неоднозначными и должны быть удалены, вы можете рассматривать это как метод удаления выбросов. Мы можем подсчитать количество совпадений, прошедших этот тест, чтобы определить, совпадают ли два изображения. Вот результаты соответствия функции:
![image](https://i.stack.imgur.com/R9ngs.jpg)
![image](https://i.stack.imgur.com/vIPko.jpg)
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()