@JRBRO

Как сопоставить два изображения чтобы убрать сдвиг?

Такой вопрос. Есть ли какая-то функция, которая может определить примерно сдвиг и сопоставить изображение с референсом? По сути, это то, как работает цифровая стабилизация. Изображение режется и затем подгоняется одно под другое.

Как я это понимаю, ищется общая точка между двумя изображениями и каждый последующий кадр центрируется по нему.

В целом, есть идея как определить сдвиг, это поиск по кусочку.

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
img2 = img.copy()
template = cv.imread('template.jpg',0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR',
            'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:
    img = img2.copy()
    method = eval(meth)
    # Apply template Matching
    res = cv.matchTemplate(img,template,method)
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
    # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
    if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv.rectangle(img,top_left, bottom_right, 255, 2)
    plt.subplot(121),plt.imshow(res,cmap = 'gray')
    plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
    plt.subplot(122),plt.imshow(img,cmap = 'gray')
    plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
    plt.suptitle(meth)
    plt.show()


Но как сделать так, чтобы эти два изображения максимально сравнялись относительно друг друга, при условии что я знаю где находится кусочек на изображениях 1 и 2?
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
cv2.goodFeaturesToTrack() чтобы найти "узнаваемые точки" на каждом изображении.
cv2.calcOpticalFlowPyrLK() чтобы понять, насколько они сдвинулись. Далее выбираешь точки вокруг интересующего объекта, вычитаешь из их позиций их предыдущие позиции, усредняешь, получаешь вектор среднего смещения за кадр. На основании этого вектора уже что-то делаешь с изображением.
Например, если тебе нужно сглаживать резкие рывки, может иметь смысл отслеживать значение среднего смещения от кадра к кадру. Если смещение в каком-то кадре резко изменилось (заметно отличается от среднего за предыдущие N кадров), значит, кадр нужно сдвинуть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы