欧氏单应优化

2024-04-26 07:30:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做全景缝合。我试图使用scipy.optimize.least_squares中的Levenberg-Marquardt算法,对匹配执行RANSAC后得到的欧几里德单应矩阵估计进行细化。 我这样做是为了解决全景图像输出中的弯曲问题

优化问题现在变成了一个非线性局部优化问题,其中我最小化单应性误差函数:enter image description here

其中x'为变换点,x为原点

我使用scipy.optimize.least_squares函数作为

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

其中dstsrc是我在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,得到与输入相同的结果


Tags: 函数图像srcvalscipyoptimizeleastsquares