相机标定 订阅
相机标定方法有:传统相机标定法、主动视觉相机标定方法、相机自标定法、零失真相机标定法。 展开全文
相机标定方法有:传统相机标定法、主动视觉相机标定方法、相机自标定法、零失真相机标定法。
信息
作    用
恢复三维模型能否进一步做下去
方法种类
四种
中文名
相机标定
外文名
camera calibration
相机标定简介
在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。在零失真相机标定法中,每一个像素矢量在空间都是独立标定的,无需知道相机内部的结构,无需建立几何模型。
收起全文
精华内容
下载资源
问答
  • 相机标定

    2020-04-07 17:37:46
    相机标定技术3.1 基于离线相机标定3.2 基于在线相机标定3.2.1 基于场景约束的自标定3.2.2 基于几何约束的自标定4. 标定模板5. 相间标定原理 1. 相机标定简介 在图像测量过程以及机器视觉应用中,为确定空间物体表面...

    1. 相机标定简介

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

    2. 相机标定方法

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

    传统相机标定法需要使用尺寸已知的标定物,通过建立标定物上坐标已知的点与其图像点之间的对应,利用一定的算法获得相机模型的内外参数。根据标定物的不同可分为三维标定物和平面型标定物。三维标定物可由单幅图像进行标定,标定精度较高,但高精密三维标定物的加工和维护较困难。平面型标定物比三维标定物制作简单,精度易保证,但标定时必须采用两幅或两幅以上的图像。传统相机标定法在标定过程中始终需要标定物,且标定物的制作精度会影响标定结果。同时有些场合不适合放置标定物也限制了传统相机标定法的应用。

    目前出现的自标定算法中主要是利用相机运动的约束。相机的运动约束条件太强,因此使得其在实际中并不实用。利用场景约束主要是利用场景中的一些平行或者正交的信息。其中空间平行线在相机图像平面上的交点被称为消失点,它是射影几何中一个非常重要的特征,所以很多学者研究了基于消失点的相机自标定方法。自标定方法灵活性强,可对相机进行在线定标。但由于它是基于绝对二次曲线或曲面的方法,其算法鲁棒性差。

    基于主动视觉的相机标定法是指已知相机的某些运动信息对相机进行标定。该方法不需要标定物,但需要控制相机做某些特殊运动,利用这种运动的特殊性可以计算出相机内部参数。基于主动视觉的相机标定法的优点是算法简单,往往能够获得线性解,故鲁棒性较高,缺点是系统的成本高、实验设备昂贵、实验条件要求高,而且不适合于运动参数未知或无法控制的场合。

    3. 相机标定技术

    3.1 基于离线相机标定

    基于离线相机标定技术需要准确的相机内参数和外参数作为重构算法的输入和先决条件,目前最为流行的离线相机标定算法是Tsai在1987年提出的[Tsai1987],Tsai方法使用一个带有非共面专用标定标识的三维标定物来提供图像点和其对应的三维空间点的对应并计算标定参数。Zhang在1998年提出了另一个实用方法 [Bouguet2007],该方法需要对一个平面标定图案的至少两幅不同视图来进行标定。加州理工学院的相机标定工具对以上两个方法均作了有效实现,并且已经被集成到Intel的视觉算法库OpenCV中[OpenCV2004]。通过标定算法,可以计算相机的投影矩阵,并提供场景的三维测度信息。在不给定真实场景的绝对平移、旋转和放缩参数的情况下,可以达到相似变换级别的测度重构。

    3.2 基于在线相机标定

    在很多场合下,如缺失标定设备或相机内参数持续改变的情况下,没有足够数据来支持离线相机标定,对这类场景的多视三维重构就要用到在线相机标定的技术。在线标定和离线标定框架的主要区别在于标定相机或估计相机参数的方法上。在大多数文献中在线标定技术被称为自标定。自标定方法可以大致分为两类:基于场景约束的自标定和基于几何约束的自标定。

    3.2.1 基于场景约束的自标定

    合适的场景约束往往能够在很大程度上简化自标定的难度。比如说,广泛存在于建筑或人造场景中的平行线能够帮助提供三个主正交方向的消视点和消视线信息,并能够据此给出相机内参数的代数解或数值解 [Caprile1990]。消视点的求解可以通过投票并搜索最大值的方法进行。Barnard采用高斯球构造求解空间 [Barnard1983]。Quan、Lutton和Rother等给出了进一步的优化策略[Quan1989, Lutton1994, Rother2000]。文献[Quan1989]中给出了搜索解空间的直接算法,Heuvel给出的改进算法加入了强制性的正交条件 [Heuvel1998]。Caprile给出了基于三个主正交方向消视点的几何参数估计法,Hartley使用标定曲线计算焦距 [Hartley2003]。Liebowitz等进一步从消视点位置构造绝对二次曲线的约束并用考克斯分解求解标定矩阵 [Liebowitz1999]。

    3.2.2 基于几何约束的自标定

    基于几何约束的自标定不需要外在场景约束,仅仅依靠多视图自身彼此间的内在几何限制来完成标定任务。利用绝对二次曲面作自标定的理论和算法最先由Triggs提出 [Triggs1997]。基于Kruppa方程求解相机参数则始于 Faugeras, Maybank等的工作 [Faugeras1992, Maybank1992]。Hartley给予基本矩阵推导出了Kruppa方程的另一个推导 [Hartley1997]。文献[Sturm2000]则给出了Kruppa方程的不确定性的理论探讨。层进式自标定技术被用于从射影重构升级到度量重构 [Faugeras1992]。自标定技术的一个主要困难在于它不是无限制地用于任意图像或视频序列,事实上,存在着特定运动序列或空间特征分布导致自标定求解框架的退化和奇异解。

    4. 标定模板

    标定模板(标定板 Calibration Target) 在机器视觉、图像测量、摄影测量、三维重建等应用中,为校正镜头畸变;确定物理尺寸和像素间的换算关系;以及确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,需要建立相机成像的几何模型。通过相机拍摄带有固定间距图案阵列平板、经过标定算法的计算,可以得出相机的几何模型,从而得到高精度的测量和重建结果。而带有固定间距图案阵列的平板就是标定模板(标定板 Calibration Target)。

    5. 相间标定原理

    5.1 相机模型

    相机成像可分为四个步骤:刚体变换、透视投影、畸变校正和数字化图像。
    在这里插入图片描述

    5.1.1 各个坐标系

    确定空间某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型(各个坐标系),这些坐标系之间的转换参数就是相机参数,求解参数的过程叫做相机标定(摄像机标定)。建立立体视觉系统所需要的各个坐标系,包括世界坐标系、相机坐标系、以及图像坐标系(物理和像素坐标系)。
    (1)世界坐标系
    描述目标在真实世界中的位置引入的参考坐标系(Xw,Yw,Zw)
    (2)相机坐标系
    联系世界坐标系与图像坐标系的桥梁,一般取摄像机的光学轴为z轴(Xc,Yc,Zc)
    (3)图像物理坐标系
    根据投影关系引入,方便进一步得到像素坐标,单位为毫米,坐标原点为摄像机光轴与图像物理坐标系的交点位置(x,y)
    (4)图像像素坐标系
    真正从相机内读到的信息,图像物理坐标的离散化,以像素为单位,坐标原点在左上角(u,v)

    5.1.2 各个坐标系之间的转换关系

    (1)世界坐标系与相机坐标系
    这是将一个三维的坐标系转换成另一个三维的坐标系,这两个坐标系之间的转换属于刚体转换,物体只改变在两个坐标系中的空间位置(平移)和朝向(旋转),而不改变其形状。它们之间的转换关系可以用旋转矩阵R和平移矩阵T来完成,这两个矩阵反映了世界坐标系与相机坐标系之间的转换关系,合称外参矩阵Lw。获得了外参矩阵,这样已知世界坐标系中的一点通过转换关系就可以得到此点在相机坐标系的位置,反之亦成立。 
    相机坐标系转换为世界坐标系转换方程为:
    在这里插入图片描述
    在这里插入图片描述
    (2)相机坐标系与图像物理坐标系
    这是一个将三维的坐标系转化为二维的坐标系,这两个坐标系之间的转换要通过几何投影模型关系获得,下面是两个坐标系的投影关系示意图:
    在这里插入图片描述
    在这里插入图片描述
    (3)图像物理坐标系与图像像素坐标系
    首先以一个形象的例子来说明两个坐标系间的区别。物理坐标系是一个连续的概念,它是以毫米为单位,就好比某一观众在电影院里的具体坐标值(3.4,5.9);而像素坐标系是一个离散的概念,它是以像素作为单位,只能是整数值坐标,就好比某一观众在电影院里的位置是(第三排,第六列)。另外还需要注意的是,这两个坐标系的原点位置也不相同,物理坐标系将原点定为摄像机光轴与图像物理坐标系的交点位置,通常称其为主点;而像素坐标系则以像素图像的左上角为原点。
    在这里插入图片描述

    5.1.3 相机畸变模型

    一般只考虑径向畸变k和切向畸变p
    在这里插入图片描述
    其中:
    在这里插入图片描述
    一般选择2或3个k值,这个是经验证过可以获得较好的结果,如果k取得再多影响不会很大可以忽略,甚至可能反而导致效果不好。
    畸变模型:枕型畸变(k>0)和桶型畸变(k<0)
    在这里插入图片描述
    当k>0时,r越大(点离中心越远),畸变量越大,r越小,畸变量越小,呈枕型。
    当k<0时,r越大(点离中心越远),畸变量越小,r越小,畸变量越大,呈桶型。

    5.1.4 相机标定参数

    (1)内参:
    ①单位长度的像素个数
    在这里插入图片描述
    ②主点坐标
    在这里插入图片描述
    ③畸变系数
    在这里插入图片描述
    (2)外参:
    R、T(旋转和平移矩阵)

    5.2 张正友标定法

    5.2.1 标定基本原理

    目标函数:
    在这里插入图片描述
    这里A为内参,R、T为旋转平移矩阵。n代表n张图片,m代表每张图片上有m个角点。

    可以将三维空间中的点都投影到二维空间的对应点m^处,在二维平面上通过角点提取算法可以提取出对应角点mij。通过选择合适的内外参数来使得目标函数达到最小,将这一组内外参数作为实际求得的内外参数。

    5.2.2 张正友标定原理

    先求解单应性矩阵,根据单应性矩阵求解相机的内外参,这里不做详细过程介绍。张正友标定法通过代数求解出了一个代数意义上的内外参最优解,最后也需要将多组代数意义上的最优解代入目标函数中验证,获得物理意义上的最优解。
    也可以将畸变因子考虑在内,做进一步优化,目标函数就变为如下形式:
    在这里插入图片描述

    6. 实验内容

    6.1 制作棋盘格

    下图为对制作的5x5个小格,每小格为2cmx2cm的棋盘进行拍摄所得
    在这里插入图片描述

    6.2 实验代码

    # coding=utf-8
    import numpy as np
    import cv2
    import glob
    # 终止标准
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    #w = 6
    #h = 6
    #准备对象点,如(0,0,0),(1,0,0),(2,0,0)......,(6,5,0)
    #objp = np.zeros((w*h,3), np.float32)
    objp = np.zeros((4*4,3), np.float32)
    objp[:,:2] = np.mgrid[0:4,0:4].T.reshape(-1,2)
    
    # 用于存储所有图像中的对象点和图像点的数组。
    objpoints = [] # 在现实世界空间的3d点
    imgpoints = [] # 图像平面中的2d点。
    #glob是个文件名管理工具
    images = glob.glob('c:/picture/6.jpg')
    print('...loading')
    for fname in images:
        #对每张图片,识别出角点,记录世界物体坐标和图像坐标
        print('processing img:{fname}')
        img = cv2.imread(fname)
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转灰度
        print('grayed')
        #寻找角点,存入corners,ret是找到角点的flag
        #ret, corners = cv2.findChessboardCorners(gray, (w, h),None)
        ret, corners = cv2.findChessboardCorners(gray, (4, 4),None)
    
        # 如果找到,添加对象点,图像点(精炼后)
        if ret == True:
            print('chessboard detected')
            objpoints.append(objp)
            #执行亚像素级角点检测
            corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
            imgpoints.append(corners2)
    
            # 绘制并显示角点
            #img = cv2.drawChessboardCorners(img, (w,h), corners2,ret)
            img = cv2.drawChessboardCorners(img, (4,4), corners2,ret)
            cv2.namedWindow('img',0)
            cv2.resizeWindow('img', 500, 500)
            cv2.imshow('img',img)
            cv2.waitKey(500)
            cv2.destroyAllWindows()
    '''
    传入所有图片各自角点的三维、二维坐标,相机标定。
    每张图片都有自己的旋转和平移矩阵,但是相机内参和畸变系数只有一组。
    mtx,相机内参;dist,畸变系数;revcs,旋转矩阵;tvecs,平移矩阵。
    '''
    
    img2 = cv2.imread("c:/picture/6.jpg")
    print("type objpoints:{objpoints[0].shape}")
    print("type imgpoints:{imgpoints[0].shape}")
    
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
    h,  w = img2.shape[:2]
    
    '''
    优化相机内参(camera matrix),这一步可选。
    参数1表示保留所有像素点,同时可能引入黑色像素,
    设为0表示尽可能裁剪不想要的像素,这是个scale,0-1都可以取。
    '''
    newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))
    #纠正畸变
    dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
    
    # 裁剪图像,输出纠正畸变以后的图片
    x,y,w,h = roi
    dst = dst[y:y+h, x:x+w]
    cv2.imwrite('calibresult.png',dst)
    
    #打印我们要求的两个矩阵参数
    print ("newcameramtx外参:\n",newcameramtx)
    print ("dist畸变值:\n",dist)
    print ("newcameramtx旋转(向量)外参:\n",rvecs)
    print ("dist平移(向量)外参:\n",tvecs)
    #计算误差
    tot_error = 0
    for i in range(len(objpoints)):
        imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
        error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
        tot_error += error
    
    print ("total error: ", tot_error/len(objpoints))
    

    6.3 实验结果与分析

    6.3.1 运行结果截图

    (1)Harris角点检测
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (2)相机标定
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    6.3.2 运行结果分析

    上面的两张运行截图是我分别对像素不同的两幅图片进行标定检测,两者运行后的结果最大的不同便是平均重投影误差的数值。前者运行的图片像素是后者运行图片像素的一半,但前者的平均重投影误差的数值却是后者的四倍多。由此可知,像素会影响标定结果。像素越低平均重投影误差的数值越大,反之,像素越高平均重投影误差的数值越小。
    影响结果的另一重要原因是图片棋盘格的清晰度,由于是手机对电脑拍摄,因此不可避免地会使图片增加很多波纹,这也极有可能因此而导致了运行结果中的外参值过大。还有数组越界、角点检测等相关问题。倘若角点检测精度低,这也会影响到相机标定的精确度。
    手机拍摄电脑会产生许多纹路,这些纹路是水波纹,水波纹其实是显示器上一些亮点或亮线,它是由于手机拍摄的快门频率高于显示器刷新频率而产生的。生活中我们用肉眼看到的常亮显示器,实际上并不是它的“真面目”,它其实是由一张一张的图片刷新出现的。而且,显示器刷新并不是整个屏幕一起刷新,而是按照从左到右、从上到下的顺序逐步进行,在某个瞬间显示器只有一个亮点而已。
    因为人眼敏感度比较低,而屏幕的刷新速度非常快,很短时间之内就扫描了整个屏幕。再加上人眼视觉暂留效应,我们就会看到一整幅连续稳定的画面。但是,用手机拍摄时,由于快门频率高于显示器刷新频率,就会捕捉到一些亮点或亮线,这就是我们看到的“水波纹”。

    7. 遇到的问题

    7.1 name ‘size’ is not defined

    在这里插入图片描述
    解决方法:源代码的棋盘格数据与本人制作的不符,将获取标定板角点的位置注释下的代码数据改为与自己制作的棋盘格相符即可

    7.2 cv2.error: OpenCV(3.4.2)

    在这里插入图片描述
    解决方法:
    主要是图片路径中“文件夹分隔符”使用的错误,将“/”改成“\”就好了

    7.3 list index out of range

    在这里插入图片描述
    解决方法:参考如下链接
    https://blog.csdn.net/huacode/article/details/79759205

    8. 实验总结

    8.1 整个标定过程步骤

    (1)打印一张棋盘格,把它贴在一个平面上,作为标定物。
    (2)通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
    (3)从照片中提取棋盘格角点。
    (4)估算理想无畸变的情况下,五个内参和六个外参。
    (5)应用最小二乘法估算实际存在径向畸变下的畸变系数。
    (6)极大似然法,优化估计,提升估计精度。

    8.2 影响实验结果因素

    (1)图像角点检测精度:如果角点检测精度差,会直接影响到重投影误差。
    (2)图片像素:像素越高,实验准确率就越高
    (3)人为因素,拍照时手不稳,对着电脑进行拍摄导致棋盘格图片中有许多波纹,相机本身存在噪声,相机抖动等。
    (4)与相机分辨率有关,由于单位是像素。在其它条件一致的情况下,分辨率越大的相机,它的像素越密集,得到的重投影误差也会大。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,026
精华内容 2,010
关键字:

相机标定