Как сопоставить слегка смещенные изображения?

Я использую две камеры, чтобы одновременно снимать один и тот же пейзаж. Два получившихся снимка имеют разное соотношение сторон и немного смещены, так как камеры расположены на расстоянии нескольких сантиметров друг от друга. Моя цель - создать наложение обоих изображений.

Я использую 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). Таким образом, гомография не является точной (как описано здесь).

Есть ли альтернативный подход, зная, что изображения немного смещены?


person sourg    schedule 24.11.2020    source источник
comment
вы можете использовать другой дескриптор детектора функций и структуру сопоставления, чтобы получить больше функций. Ищите такие вещи, как ORB, KAZE   -  person Dr Yuan Shenghai    schedule 24.11.2020
comment
Пожалуйста, покажите примеры входных изображений. Рассматривали ли вы сопоставление шаблонов? или cv2.findTransformECC() с cv2.MOTION_EUCLIDEAN и cv2.warpAffine   -  person fmw42    schedule 24.11.2020
comment
Спасибо за помощь! Удивительно, но SURF лучше всего сработал с моими изображениями. Я пробовал ORB и KAZE/AKAZE заранее. @fmw42 cv2.findTransformECC() на самом деле работал очень хорошо, и в настоящее время я переделываю свой алгоритм на его основе.   -  person sourg    schedule 26.11.2020