2

我正在尝试根据本文http://cronos.rutgers.edu/~meer/TEACHTOO/PAPERS/zhang.pdf(第 2.3 节)中描述的 2D 到 3D 点对应关系计算相机的 3x3 校准矩阵 P蟒蛇2.7。我已经能够找到 P 的初始估计值,但现在需要使用 Levenberg-Marquardt 算法 (2.3.4) 对其进行细化。在我看来,这可以通过 scipy.optimize.minpack.leastsq 来完成。但是,我实现此功能的尝试失败了。这是我所拥有的简化版本(M 是格式为 (x,y,z,1) 的均质化 3d 点的 numpy 数组,形状为 (18,4),m 是均质化 2d 点的 numpy 数组格式为 (u,v,1),形状为 (18,3)):

import numpy as N
from scipy.optimize.minpack import leastsq

def e(P,M,m):
    a = P.dot(M.T) 
    print a.shape
    b = m.T-a
    b1 = b[0]
    b2 = b[1]
    b3 = b[2]
    dist = sqrt((b1**2)+(b2**2)+(b3**2))
    return dist



P = N.array( [ [4.66135353e+01,1.24341518e+02,-9.07923056e+00,9.59292826e+02],
               [-3.60062368e+01,3.56319152e+01,1.14245572e+02,2.32061401e-02],
               [-4.04188199e-02,4.00793699e-02,-9.48804649e-03,1.00000e+00] ] )

m = []
M = []
#define m list and M list
for i in range(0,len(uv)):        
    uv[i].append(1) #uv is unhomogenized uv coordinate list (source left out to      simplify)
    xyz[i].append(1) #xyz is unhomogenized xyz coordinate list (source left out to simplify)
    m.append(N.array( [ [uv[i][0]],[uv[i][1]],[uv[i][2]] ] ))    
m = N.array( uv )
M = N.array( xyz )
#the shape of m is (18,3) and the shape of M is (18,4)

P_new, success = leastsq(e, P, args=(M,m))

我认为问题在于 M 和 m 变量,即向量数组。我查看了 scipy.optimize.lstsq 函数的示例,我可以让它工作,但它只有一个维度的 args。

有谁知道我在这里做错了什么?我对编程还很陌生,所以如果这是白痴哈哈,请放轻松。非常感谢所有阅读本文的人,如果我能提供更多信息,请告诉我

4

1 回答 1

1

似乎leastsq不知道如何优化多维变量,这是一个很容易解决的问题:

def e2(P, M, m) :
    return np.sqrt(np.sum((m.T - np.dot(P.reshape(3,4), M.T))**2, axis=0))

P = P.reshape((12,))

P_new, success = leastsq(e2, P, args=(M, m))

这个运行,虽然我的随机数据很难收敛。基本思想是将矩阵P视为一个 12 项长的向量,并在需要转换Mm.

我还冒昧e地以更 numpythonic 的方式重写了你的函数......

于 2013-01-12T07:05:30.640 回答