Computer vision 摄像机外部校准

Computer vision 摄像机外部校准,computer-vision,camera-calibration,extrinsic-parameters,Computer Vision,Camera Calibration,Extrinsic Parameters,我有一个鱼眼照相机,我已经校准过了。我需要通过使用所述棋盘的单个图像、固有参数和棋盘方块的大小来计算棋盘的相机姿势w.r.t。不幸的是,许多校准库首先从一组图像计算外部参数,然后计算内部参数,这基本上是我想要的“反向”过程。当然,我可以将我的棋盘图像放在我用于校准的其他图像集中,然后再次运行校准过程,但这非常繁琐,而且,我不能使用与用于本质校准的棋盘大小不同的棋盘。谁能给我指出正确的方向吗 编辑:读了弗朗西斯科的答案后,我意识到我没有解释校准相机的意思。我的问题开始于我没有经典的内在参数矩阵(因

我有一个鱼眼照相机,我已经校准过了。我需要通过使用所述棋盘的单个图像、固有参数和棋盘方块的大小来计算棋盘的相机姿势w.r.t。不幸的是,许多校准库首先从一组图像计算外部参数,然后计算内部参数,这基本上是我想要的“反向”过程。当然,我可以将我的棋盘图像放在我用于校准的其他图像集中,然后再次运行校准过程,但这非常繁琐,而且,我不能使用与用于本质校准的棋盘大小不同的棋盘。谁能给我指出正确的方向吗

编辑:读了弗朗西斯科的答案后,我意识到我没有解释校准相机的意思。我的问题开始于我没有经典的内在参数矩阵(因此我不能实际使用Francesco描述的方法)。事实上,我用Scaramuzza的程序()校准了鱼眼相机,该程序基本上找到了一个多项式,可以将3d世界点映射到像素坐标(或者,将像素反向投影到单位球体的多项式)。现在,我认为这些信息足以找到相机姿势w.r.t.棋盘,但我不确定具体如何进行。

我假设“校准”意味着你的相机有一个针孔模型

然后,棋盘平面和图像平面之间的变换是单应性的,可以使用通常的DLT算法从角点的图像中估计单应性。然后,可以将其表示为内在参数a和[x y t]矩阵的乘积(按比例),其中x和y列是世界坐标系(即棋盘坐标系)的x和y单位向量,t是从相机中心到同一帧原点的向量。即:

H=标度*A*[x | y | t]

所以

[x | y | t]=1/刻度*inv(A)*H

选择比例是为了使x和y具有单位长度。一旦有了x和y,第三个轴就是它们的叉积。

该过程计算棋盘的外部姿势(CB)在摄影机坐标中。openCV在其3D重建模块中添加了一个鱼眼库,以适应具有大视场的摄影机中的显著扭曲。当然,如果您的固有矩阵或变换不是经典固有矩阵,则必须修改PnP:

  • 撤消您所做的任何反向投影
  • 现在你们有了所谓的标准化相机,消除了固有的矩阵效应

    k*[u,v,1]T=R | T*[x,y,z,1]T

  • 解决此问题的方法是先为k编写表达式:

    k=R20*x+R21*y+R22*z+Tz
    
    然后在中使用上述表达式

    k*u = R00*x+R01*y+R02*z+Tx
    k*v = R10*x+R11*y+R12*z+Tx
    
    您可以重新排列这些术语,以获得Ax=0,服从| x |=1,其中未知

    x=[R00,R01,R02,Tx,R10,R11,R12,Ty,R20,R21,R22,Tz]T

    A,b 由已知的u、v、x、y、z像素和CB角坐标组成

    然后求解x=V的最后一列,其中A=ULVT,并从x组装旋转和平移矩阵。然后,对于这种处理,实际上有一些非常典型的“混乱”步骤:

    A.确保获得真实的旋转矩阵-在R2=UVT上执行正交Procrustes,其中R=ULVT

    B.计算比例因子scl=和(R2(i,j)/R(i,j))/9

    C.更新转换向量T2=scl*T,检查Tz>0;如果为负,则反转T并否定R


    现在,R2,T2为非线性算法优化(如Levenberg-Marquardt)提供了一个良好的起点。这是必需的,因为之前的线性步骤只优化参数的代数误差,而非线性步骤优化正确的度量,如像素距离的平方误差。然而,如果您不想遵循所有这些eps你可以利用openCV的特性。

    假设你有两条光线通过一个正方形的边的定界点
    r1=(x1,y1,1)
    r2=(x2,y2,1)
    ,在标准化坐标中。知道在世界坐标中,光线是通过一段长度
    w
    (正方形的宽度)连接起来的形成一个三角形,并且世界坐标中的点的坐标是标准化坐标的倍数,你能通过在一个系统中的多个点上使用这些约束来恢复姿势吗?只是一个想法,这是我的想法之一:基本上,我必须找到一个特定的平面,通过投影所有的棋盘格从图像的四个角,我得到了具有正确正方形大小和垂直边的原始棋盘。因此,这就像我有一个参数化平面,我需要找到它的参数,从而找到姿势。但我不确定如何从数学上形式化问题。我认为三维点只是“真实”的角点棋盘格,Z分量都等于零。我实际上试着做你Vlad描述的事情,事实上我读了校准工具箱所基于的论文,并提出了一个齐次方程组(因此没有“b”向量,因为所有常数项都为零).不幸的是,尝试用Matlab解决它会导致一个简单的解决方案(零向量)。不确定这里出了什么问题。aledalgrande,你知道棋盘(CB)的平方大小(比如sz)你只需在其上放置一个局部坐标系,并将角点设置为x=isz,y=jsz,z=0;请注意,这是链接到CB的局部坐标系,而不是摄影机中心。Alb,我的错,PnP不是最小二乘问题,而是最小方向问题,为了避免琐碎的解决方案,它通过约束| x |=1来解决;要解决它,需要使用SVD(奇异值分解)并选取V的最后一列(它对应于A的协方差椭圆的最小轴或最小奇异值)。我更新了我的答案,见上文。嗨,弗拉德,谢谢你的输入。你知道我在哪里吗