摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图1)

限时干货下载:回复“资料”获取获取机器视觉教程,行业报告等资源,百度盘群组分享链接更新时间:2018-03-15,失效请在文末留言,不要在后台留言,你也可以在后台菜单“资源搜索”搜索更多你想要的网盘资源!

点击上方“3D视觉工坊”,选择“星标”

内参、外参、畸变参数三种参数与相机的标定方法与相机坐标系的理解

来源:http://blog.csdn.net/yangdashi888/article/details/51356385 

干货第一时间送达

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图2)

提到三角化大家都十分熟悉,在CV 领域中,由像点计算物点的过程称为三角化,但在摄影测量领域,其称作为前方交会。值得注意的是单张影像是无法恢复像点的三维坐标,至少需要两张影像才能得到像素点的真实坐标(这里已知两张影像的pose信息)

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图3)

1选购攻略、 相机参数是三种不同的参数。

三角化有很多方法,这里介绍两帧三角化、多帧三角化、迭代三角化、选权迭代多帧三角化(并附上本人代码)。


1、两帧三角化在opencv 中函数triangulatePoints就可根据两帧的pose 和内参恢复三维点坐标,cv中的三角化是两帧且是没有权的。其函数参数如下:

void cv::triangulatePoints ( InputArray  projMatr1, //P1 1 3*4
InputArray  projMatr2, //P2 3*4
InputArray  projPoints1, //pixel coordinates
InputArray  projPoints2, // pixel coordinates
OutputArray  points4D // 3D coordinates

2、多帧三角化三角化严密解推导过程:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图4)


由共线条件方程得到三角化严密解法,将分母移到左边,得到

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图5)

 相机的内参数是六个分别为:1/dx、1/dy、r、u0、v0、f。

整理可得:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图6)

opencv1里的说内参数是4个其为fx、fy、u0、v0。实际其fx=F*Sx,其中的F就是焦距上面的f,Sx是像素/没毫米即上面的dx,其是最后面图里的后两个矩阵进行先相乘,得出的,则把它看成整体,就相当于4个内参。其是把r等于零,实际上也是六个。

dx和dy表示:x方向和y方向的一个像素分别占多少长度单位,即一个像素代表的实际物理值的大小,其是实现图像物理坐标系与像素坐标系转换的关键。u0,v0表示图像的中心像素坐标和图像原点像素坐标之间相差的横向和纵向像素数。

l1X+l3Y+l3Z−lx=0L4X+l5Y+l6Z−ly=0其中:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图7)

从上可以知道,一个像点可以列2个方程,对于n个同名像点就可以列2n个方程(AX=B,超定方程按照最小二乘求解),即是多帧三角化,代码如下:

def pixelToCam(pts,K):
    '''

    :param pts: pixel coordinates
    :param K: camera params
    :return: camera coordinates
    '''
    camPts=np.zeros((1,2))
    camPts[0,0]=(pts[0,0]-K[0,2])/K[0,0]
    camPts[0,1]=(pts[0,1]-K[1,2])/K[1,1]
    return camPts
def getEquation(camPts,R,t):
    '''
    build equation ,one pixel point get 2 equations
    :param camPts: camera coordinates
    :param R: image pose-rotation ,world to camera
    :param t: image pose -translation,is camera center(t=-R.T*tvec)
    :return: equation coefficient
    '''
    A=np.zeros((2,3))
    b=np.zeros((2,1))
    A[0,0]=R[0,0]-camPts[0,0]*R[2,0]
    A[0,1]=R[0,1]-camPts[0,0]*R[2,1]
    A[0,2]=R[0,2]-camPts[0,0]*R[2,2]
    b[0,0]=t[0,0]*A[0,0]+t[0,1]*A[0,1]+t[0,2]*A[0,2]
    A[1,0]=R[1,0]-camPts[0,1]*R[2,0]
    A[1,1]=R[1,1]-camPts[0,1]*R[2,1]
    A[1,2]=R[1,2]-camPts[0,1]*R[2,2]
    b[1,0]=t[0,0]*A[1,0]+t[0,1]*A[1,1]+t[0,2]*A[1,2]
    return A,b
3 、迭代三角化其做法就是在方程系数加入因子,不断调整系数的因子,本人代码如下:

def IterativeLinearLSTri(u1,P1,u2,P2):
    wi,wi1=1,1 #不断需要更新的因子
    X=np.zeros((4,1))
    for i in range(10): #迭代10次
        X_=linear_ls_triangulation(u1,P1,u2,P2) # 线性求解两帧的像素点的三维坐标
        X[1,0]=X_[0,1]
        X[2,0]=X_[0,2]
        X[3,0]=1
        p2x=np.dot(P1[2,:].reshape(1,4),X)[0,0]
        p2x1=np.dot(P2[2,:].reshape(1,4),X)[0,0]
        if abs(wi-p2x) <=0.001 and abs(wi1-p2x1)<=0.001 :
            break
        wi=p2x
        wi1=p2x1
        A = np.array([(u1[0]*P1[2, 0] - P1[0, 0])/wi, (u1[0]*P1[2, 1] - P1[0, 1])/wi,
                      (u1[0]*P1[2, 2] - P1[0, 2])/wi, (u1[1]*P1[2, 0] - P1[1, 0])/wi,
                      (u1[1]*P1[2, 1] - P1[1, 1])/wi, (u1[1]*P1[2, 2] - P1[1, 2])/wi,
                      (u2[0]*P2[2, 0] - P2[0, 0])/wi1, (u2[0]*P2[2, 1] - P2[0, 1])/wi1,
                      (u2[0]*P2[2, 2] - P2[0, 2])/wi1, (u2[1]*P2[2, 0] - P2[1, 0])/wi1,
                      (u2[1]*P2[2, 1] - P2[1, 1])/wi1,
                      (u2[1]*P2[2, 2] - P2[1, 2])/wi1]).reshape(4, 3)
        B = np.array([-(u1[0]*P1[2, 3] - P1[0, 3])/wi,
                      -(u1[1]*P1[2, 3] - P1[1, 3])/wi,
                      -(u2[0]*P2[2, 3] - P2[0, 3])/wi1,
                      -(u2[1]*P2[2, 3] - P2[1, 3])/wi1]).reshape(4, 1)
        
        ret, X_ = cv2.solve(A, B, flags=cv2.DECOMP_SVD)
        X[0,0]=X_[0,0]
        X[1,0]=X_[1,0]
        X[2,0]=X_[2,0]
        X[3,0]=1
    return X
4、选权迭代多帧三角化首先解释选权迭代(IGG算法),上世纪 80 年代,首创从验后方差估计导出粗差定位的选权迭代法,命名为“李德仁方法”。在实际测量工作中客观条件的限制,很难完全避免粗差的存在或做到完全同等精度量测.在平差过程中,通常引入权作为比较观测值之间相对精度高低的指标,并为精度较高的观测数据赋予较高的权重,这样就可规避有害信息的干扰。例如,我们在image matching 的匹配的时候,会用到ransac(同样是稳健估计算法) 剔除outlier,但是当你的同名点是在多帧上且只有一个的时候(比如多帧红绿灯的位置测量),ransac 就不能再使用,这个时候使用IGG 算法可以有效的规避误点带来影响,论文参考-多像空间前方交会的抗差总体最小二乘估计,本人将论文的算法进行了复现,代码如下:

def IterationInsection(pts,K,R,t):
    # cam_xyz is  inital value
    # 这里假设像点x,y是等权的
    k0=1.5
    k1=2.5 # K1=2
    weight=np.identity(len(pts)*2)
    cam_xyz=mutiTriangle(pts,K,R,t)
    cam_xyz_pre=cam_xyz
    iteration=0
    while 1:
        d=np.zeros((len(pts),1))
        for i in range(len(R)):
            pro,J = cv2.projectPoints(cam_xyz.reshape(1, 1, 3), R[i], t[i], K, np.array([]))
            pro=pro.reshape(1,2)
       &nb

相机的外参数是6个:三个轴的旋转参数分别为(ω、δ、 θ),然后把每个轴的3*3旋转矩阵进行组合(即先矩阵之间相乘),得到集合三个轴旋转信息的R,其大小还是3*3;T的三个轴的平移参数(Tx、Ty、Tz)。R、T组合成成的3*4的矩阵,其是转换到标定纸坐标的关键。其中绕X轴旋转θ,则其如图:

   注意:在每个视场无论我们能提取多少个角点,我们只能得到四个有用的角点信息,这四个点可以产生8个方程,6个用于求外参,这样每个视场就还赚两个方程来求内参,则其在多一个视场即可求出4个内参。因为六个外参,这就是为什么要消耗三个点用于求外参。

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图8)

畸变参数是:k1,k2,k3径向畸变系数,p1,p2是切向畸变系数。径向畸变发生在相机坐标系转图像物理坐标系的过程中。而切向畸变是发生在相机制作过程,其是由于感光元平面跟透镜不平行。其如下:

1.径向畸变:产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲径向畸变主要包含桶形畸变和枕形畸变两种。下面两幅图是这两种畸变的示意:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图9)

          它们在真实照片中是这样的:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图10)

           2.切向畸变:产生的原因透镜不完全平行于图像平面,这种现象发生于成像仪被粘贴在摄像机的时候。下面图片来自于《学习opencv》p413。

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图11)

其中畸变的形象示意图是如下:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图12)

其总的转换关系:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图13)

下面是普通摄像头标定后的输出值,其如下:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图14)

其中的fx、fy是f/dx、f/dy得出来的值。其中的cx、cy一般不是正好是图像分辨率的一半,其是有偏差的,一般越好的摄像头则其越接近于分辨率的一半。上面例子使用的摄像头是一个普通的1280x720分辨率的摄像头,其偏差还是蛮大的。下面的数据是比较好的摄像头罗技720p的,其分辨率也是1280x720的分辨率。可以看出其更接近分辨率的一半。

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图15)

2、相机的标定方法与意义:

(一)什么是摄像机标定

    在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为摄像机标定。

(一)相机标定的意义

    无论是在图像测量或者机器视觉应用中,摄像机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响摄像机工作产生结果的准确性。因此,做好摄像机标定是做好后续工作的前提,是提高标定精度是科研工作的重点所在。其标定的目的就是为了相机内参、外参、畸变参数。

  其标定方法大概有三种如下:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图16)

1.线性标定方法的大概数学公式是:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图17)

其求解过程如下:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图18)

注意:这种标定是没有考虑到相机畸变的非线性问题,意思是这种标定是在不考虑相机畸变的情况下使用。

2.非线性标定方法:

镜头畸变明显时必须引入畸变模型,将线性标定模型转化为非线性标定模型,通过非线性优化的方法求解相机参数:

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图19)

3.两步标定法:

   1.Tsai的经典两步法

       概念:Tsai基于 RAC 约束(RadialAlignment Constrain)提出的两步法,在求解过程中将CCD(电耦合器件)阵列感光元的横向间距和纵向间距当作已知参数,求解的摄像机内部参数:有效焦距f;镜头径向畸变系数k1,k2;非确定性尺度因子xs ;图像中心或主点u0,v0。外部参数:世界坐标系与摄像机坐标系之间的旋转矩阵R与平移向量t。

     求解:首先利用最小二乘法求解超定线性方程组,求得模型外部参数;然后求解内部参数,如果摄像机无透镜畸变,可通过一个超定线性方程组解出,如果存在一个以二次多项式近似的径向畸变,则利用一个包含三个变量的目标函数进行优化搜索求解。

  

1.相机坐标系:

是连接图像物理坐标系与世界坐标系的桥梁,其中相机坐标的系的坐标原点是:镜头的光心---其也是相机坐标系里的投影中心。

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图20)

参考文献:

像素坐标转换到标定纸坐标的过程:http://blog.csdn.net/wangxiaokun671903/article/details/37966891 

工业相机标定相关知识整理

来源:http://blog.csdn.net/dcrmg/article/details/52880508 点击阅读原文进入

相机标定内参和外参

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性,做好相机标定和提高标定精度是做好后续工作的前提。

相机标定中所要确定的几何模型参数分为内参和外参两种类型。相机内参的作用是确定相机从三维空间到二维图像的投影关系。相机外参的作用是确定相机坐标与世界坐标系之间相对位置关系。

相机内参共有6个参数(f,κ,Sx,Sy,Cx,Cy),其中:

f为焦距; 

κ表示径向畸变量级,如果κ为负值,畸变为桶型畸变,如果为正值,那畸变为枕型畸变。

Sx,Sy是缩放比例因子。一般情况下相机成像单元不是严格的矩形的,其在水平和垂直方向上的大小是不一         致的,这就导致在X和Y方向上的缩放因子不一样,所以需要分别定义两个缩放因子。  对针孔摄像机来               讲,表示图像传感器上水平和垂直方向上相邻像素之间的距离;                      

Cx,Cy是图像的主点,即过镜头轴心垂直于成像平面与图像平面的交点。对针孔摄像机来讲,这个点是投             影中心在成像平面上的垂直投影,同时也是径向畸变的中心 。

 摄像机外参共有6个参数(α,β,γ,Tx,Ty,Tz),相机坐标与世界坐标的关系可以表述为:

                               Pc= RPw + T

     其中Pw为世界坐标,Pc是摄像机坐标。式中,T= (Tx,Ty,Tz),是平移向量,R =R(α,β,γ)是旋转矩阵,分别是绕摄像机坐标系z轴旋转角度为γ,绕y轴旋转角度为β,绕x轴旋转角度为α。6个参数组成(α,β,γ,Tx,Ty,Tz)为摄像机外参。

通常情况下,通过镜头,一个三维空间中的物体会被映射成一个倒立缩小的像,然后被成像传感器感知到。

理想情况下,镜头的光轴(就是通过镜头中心垂直于传感器平面的直线)应该是穿过图像的正中间的,但是,实际由于安装精度的问题,总是存在误差,即光轴偏移,这种误差需要用内参来描述;  

理想情况下,相机对x方向和y方向的尺寸的缩小比例是一样的,但实际上,镜头如果不是完美的圆,传感器上的像素如果不是完美的紧密排列的正方形,都可能会导致这两个方向的缩小比例不一致。内参中包含两个参数可以描述这两个方向的缩放比例,不仅可以将用像素数量来衡量的长度转换成三维空间中的用其它单位(比如米)来衡量的长度,也可以表示在x和y方向的尺度变换的不一致性;

理想情况下,镜头会将一个三维空间中的直线也映射成直线(即射影变换),但实际上,镜头无法这么完美,通过镜头映射之后,直线会变弯,所以需要相机的畸变参数来描述这种变形效果。  以下三种畸变分别为枕形畸变、桶形畸变和线性畸变。

摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图21)            摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图22)            摄影测量(计算机视觉)中的三角化方法内参、外参、畸变参数三种参数与工业相机的标定方法与相机坐标系的理解(图23)


相机标定的方法

相机标定方法有:传统相机标定法、相机自标定法、主动视觉相机标定方法。

传统相机标定法需要使用尺寸已知的标定物,通过建立标定物上坐标已知的点与其图像点之间的对应,利用一定的算法获得相机模型的内外参数。根据标定物的不同可分为三维标定物和平面型标定物。三维标定物