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