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