Python 计算内部相机参数时获取复数

Python 计算内部相机参数时获取复数,python,matlab,camera,camera-calibration,calibration,Python,Matlab,Camera,Camera Calibration,Calibration,我试图在MATlab中实现Zhang的摄像机校准算法。实现这一点的步骤应该非常简单,易于实现,尤其是使用MATLab。然而,我一直被困在一个点上,我得到的是复数,而我应该得到实数 如果你们中的任何一个人以前做过这件事,你就知道必须做什么。第一步是拍摄棋盘的图像,并使用下面的公式计算模型平面和图像平面之间的单应映射(我基本上要包括我的大部分代码,因为它非常小): 其中,X保持世界平面中棋盘格角点的齐次坐标,X保持图像平面中的齐次坐标 下一步是求解方程EH=0,得到H: [u d v]=svd(

我试图在MATlab中实现Zhang的摄像机校准算法。实现这一点的步骤应该非常简单,易于实现,尤其是使用MATLab。然而,我一直被困在一个点上,我得到的是复数,而我应该得到实数

如果你们中的任何一个人以前做过这件事,你就知道必须做什么。第一步是拍摄棋盘的图像,并使用下面的公式计算模型平面和图像平面之间的单应映射(我基本上要包括我的大部分代码,因为它非常小):

其中,X保持世界平面中棋盘格角点的齐次坐标,X保持图像平面中的齐次坐标

下一步是求解方程EH=0,得到H:

  [u d v]=svd(E);
  H= v(:,end);
  H= reshape(H,3,3)';
我不打算详细介绍其余代码中每个变量的内容,因为我假设我将从已经这样做过的人那里得到帮助(这是一个非常流行的算法),所以我将把代码放在一些注释中:

vij = @(i,j,H) [ H(i,1)*H(j,1)
                     H(i,1)*H(j,2) + H(i,2)*H(j,1)
                     H(i,2)*H(j,2)
                     H(i,3)*H(j,1) + H(i,1)*H(j,3)
                     H(i,3)*H(j,2) + H(i,2)*H(j,3)
                     H(i,3)*H(j,3) ];
G = [ vij(1,2,H)'; (vij(1,1,H)-vij(2,2,H))' ];
V = [ V; G ];
当然,在上面的代码块中,我们处于一个循环中,循环的运行次数与图像的运行次数相同

接下来是整个算法最直接的部分,在这里你不会出错,我们计算内在参数:

[u1,d1,v1] = svd( V );
b = v1(:,end);
v0 = ( b(2)*b(4)-b(1)*b(5) ) / ( b(1)*b(3)-b(2)^2 );
lambda = b(6) - ( b(4)^2 + v0*(b(2)*b(4)-b(1)*b(5)) ) / b(1);
b(1)
alpha = sqrt( lambda / b(1) );
beta = sqrt( lambda*b(1) / (b(1)*b(3)-b(2)^2) );
gamma = -b(2)*alpha^2*beta / lambda;
u0 = gamma*v0 / beta - b(4)*alpha^2 / lambda;
A = [ alpha  gamma  u0;
      0      beta   v0;
      0      0      1   ]
然后,我们需要考虑图像平面和世界平面之间的平方大小差异,因此我们构建一个归一化矩阵:

N = [ 2/width     0      -1
                0     2/height  -1
                0        0       1 ];
其中,高度和宽度是图像的高度和宽度(以像素为单位)

最后,可以通过以下行获得内部矩阵A:

A = N\A;
现在,为了确保得到准确的结果,我将我的结果与加州理工学院(Bouget)的校准工具进行了比较,出于某种原因,我得到了正确的u0和v0,但其余的(α、β、γ)相差很远,事实上它们是复数

我意识到这是因为lambda可能是负数。除此之外,不应该这样!这就是问题所在

我已经在网上查看了数百个实现,它们都与我的非常接近,但它们的本质都是正确的。令我难以置信的是,我的u0和v0完全正确,而其他的只是复杂的jibberish


你能帮忙吗?我真的很感激

可能有点过于琐碎,但是除了
i
j
之外,您是否尝试过使用其他变量名

你能弄明白吗?我也遇到过同样的问题,你明白了吗?
A = N\A;