我正在做全景缝合。我试图使用scipy.optimize.least_squares
中的Levenberg-Marquardt算法,对匹配执行RANSAC后得到的欧几里德单应矩阵估计进行细化。
我这样做是为了解决全景图像输出中的弯曲问题
优化问题现在变成了一个非线性局部优化问题,其中我最小化单应性误差函数:
其中x'为变换点,x为原点
我使用scipy.optimize.least_squares
函数作为
ls_lm = least_squares(fun, [theta, tx, ty], args=(dst,src), method='lm')
其中dst
和src
是我在RANSAC之后从源图像和目标图像进行的通信。我从单应估计H
中获取theta, tx, ty
。我的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
,得到与输入相同的结果
目前没有回答
相关问题 更多 >
编程相关推荐