Оптимизация евклидовой гомографии python - PullRequest
1 голос
/ 13 января 2020

Я работаю над панорамированием c шить. Я пытаюсь уточнить оценку матрицы евклидовой гомографии, которую я получаю после выполнения RANSA C на матчах, используя алгоритм Левенберга-Марквардта в scipy.optimize.least_squares. Я делаю это, чтобы решить для изгиба в моем выводе Panorami c изображения.

Задача оптимизации теперь становится нелинейной локальной оптимизацией, где я минимизирую функцию ошибки гомографии: enter image description here

, где x '- преобразованная точка, а x - исходная точка.

Я использую функцию scipy.optimize.least_squares как

ls_lm = least_squares(fun, [theta, tx, ty], args=(dst,src), method='lm')

Где dst и src - мои соответствия от исходного и конечного изображения после RANSA C. Я беру theta, tx, ty из оценки гомографии H. Мой fun выглядит так:

def fun(pars, x, src):
    theta, tx, ty = pars
    H = array([[cos(theta), -sin(theta), tx],\
         [sin(theta), cos(theta), ty],
         [0,0,1]])
    src1 = c_[src,ones(src.shape[0])]
    fun = sum((x - src1.dot(H.T)[:,:2])**2)
    ret_val = ones(len(src), float)
    for i in range(len(src)):
        ret_val[i] = fun
    return ret_val

Но функция least_squares не сходится и выдает мне тот же вход [theta, tx, ty], что и на выходе. Что я делаю неправильно ? Могу ли я решить проблему изгиба, используя другой метод или подход? Может ли настройка пучка решить эту проблему, если да, то как мне это реализовать?

Кроме того, обязателен ли ввод в матрицу Якоби для моего случая? Если да, что это должно быть?

Спасибо, за ваше время !!

То, что я пытался:

1) Инициализировать мои параметры из [0, 0, 0] и добавил шум к H. Результаты кажутся незначительными по сравнению с исходным H, но не решают проблему.

2) Используйте scipy.optimize.minimize, получили те же результаты, что и ввод.

...