Я использую две камеры, чтобы одновременно снимать один и тот же пейзаж. Два получившихся снимка имеют разное соотношение сторон и немного смещены, так как камеры расположены на расстоянии нескольких сантиметров друг от друга. Моя цель - создать наложение обоих изображений.
Я использую OpenCV python с SURF для обнаружения функций и FLANN для сопоставления функций. Чтобы отсортировать ложные совпадения, я использую тест отношения Лоу и RANSAC.
import numpy as np
import cv2
from matplotlib import pyplot
image_path1 = "./images/IMG01.jpg"
img1 = cv2.imread(image_path1, 0)
image_path2 = "./images/IMG02.jpg"
img2 = cv2.imread(image_path2, 0)
# Initiate SURF detector
surf = cv2.xfeatures2d.SURF_create()
# find the keypoints with SURF
kp1, des1 = surf.detectAndCompute(img1, None)
kp2, des2 = surf.detectAndCompute(img2, None)
# FLANN matcher
index_params = dict(algorithm = 1, trees = 5)
search_params = dict()
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(np.float32(des1), np.float32(des2),k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]
# ratio test as per Lowe's paper
good = []
for i,(m,n) in enumerate(matches):
if m.distance < 0.5*n.distance:
good.append(m)
MIN_MATCH_COUNT = 5
if len(good) > MIN_MATCH_COUNT:
src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5)
matchesMask = mask.ravel().tolist()
else:
print( "Not enough matches are found - {}/{}".format(len(good), MIN_MATCH_COUNT) )
matchesMask = None
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
img3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params)
pyplot.imshow(img3,),pyplot.show()
Иногда, напр. для изображений при слабом освещении очень мало правильных совпадений (‹ 10). Таким образом, гомография не является точной (как описано здесь).
Есть ли альтернативный подход, зная, что изображения немного смещены?