相机标定-张正友棋盘格标定法

这篇具有很好参考价值的文章主要介绍了相机标定-张正友棋盘格标定法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.针孔相机模型

2.相机成像过程

2.1  各个坐标系之间的转换

2.1.1 图像坐标系到像素坐标系 

2.1.2 相机坐标系到图像坐标系

 2.1.3世界坐标系到相机坐标系

 2.1.4世界坐标系到像素坐标系

3.畸变与畸变矫正

3.1 畸变

3.2 畸变公式

4.相机标定原理

5.张正友标定法介绍

5.1张正友标定法的整体流程

5.2 张正友标定法的模型

5.3 模型求解

6.相机标定的步骤

7.源代码

8.实验结果及分析

8.1 实验结果

8.2 结果分析


1.针孔相机模型

      针孔相机成像原理其实就是利用投影将真实的三维世界坐标转换到二维的相机坐标上去,其模型示意图如下图所示:

张正友标定法,计算机视觉,opencv,人工智能

张正友标定法,计算机视觉,opencv,人工智能

      (X,Y,Z)为在世界坐标系下一点的物理坐标

      ( u , v ) 为该点对应的在像素坐标系下的像素坐标

     引入齐次坐标的原因:引入齐次坐标的目的是为了升维,将坐标从二维坐标变为三维坐标。
 

2.相机成像过程

     相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。

张正友标定法,计算机视觉,opencv,人工智能

  (1)世界坐标系(,,)
        描述目标在真实世界中的位置引入的参考坐标系。
  (2)相机坐标系(,,)
        联系世界坐标系与图像坐标系的桥梁,一般取摄像机的光学轴为z轴。
  (3)图像坐标系(x,y)
        根据投影关系引入,方便进一步得到像素坐标,单位为毫米,坐标原点为摄像机光轴与图像物理坐标系的交点位置。
  (4)像素坐标系(u,v)
        真正从相机内读到的信息,图像物理坐标的离散化,以像素为单位,坐标原点在左上角。

2.1  各个坐标系之间的转换

2.1.1 图像坐标系到像素坐标系 

     像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。

张正友标定法,计算机视觉,opencv,人工智能

      由于(u,v)只代表像素的列数与行数,而像素在图像中的位置并没有用物理单位表示出来,所以,我们还要建立以物理单位(如毫米)表示的图像坐标系(x,y)。将相机光轴与图像平面的交点(一般位于图像平面的中心处,也称为像主点(principal point)定义为该坐标系的原点,且x轴与u轴平行,y轴与v轴平行,假设(,)代表在(u,v)坐标系下的坐标,dx与dy分别表示每个像素在横轴x和纵轴y上的物理尺寸,则图像中的每个像素在(u,v)坐标系中的坐标和在(x,y)坐标系中的坐标之间都存在如下的关系:

 

2.1.2 相机坐标系到图像坐标系

张正友标定法,计算机视觉,opencv,人工智能

     点P(Xc,Yc,Zc)由通过投影中心的光线投影到图像平面上,相应的图像点为p(x,y,f);根据相似三角形原理:

用线性矩阵描述为:

 2.1.3世界坐标系到相机坐标系

      世界坐标系是为了描述相机的位置而被引入,上图中坐标系OwXwYwZw即为世界坐标系。平移向量t旋转矩阵R可以用来表示相机坐标系与世界坐标系的关系。所以,假设空间点P在世界坐标系下的齐次坐标是,在相机坐标下的齐次坐标是,则存在如下关系:   

         其中 R为3x3的旋转矩阵,t为3x1的平移矢量。

 2.1.4世界坐标系到像素坐标系

       世界坐标系到像素坐标系的变换可由上面的公式组合而成:

     其中M1称为相机的内部参数矩阵,M2称为相机的外部参数矩阵,M称为投影矩阵 。

3.畸变与畸变矫正

3.1 畸变

     在世界坐标中的一条直线上的点在相机上只呈现出了一个点,其中发生了非常大的变化,同时也损失和很多重要的信息,这正是我们3D重建、目标检测与识别领域的重点和难点。实际中,镜头并非理想的透视成像,带有不同程度的畸变。理论上镜头的畸变包括径向畸变和切向畸变,切向畸变影响较小,通常只考虑径向畸变。

     径向畸变:径向畸变主要由镜头径向曲率产生(光线在远离透镜中心的地方比靠近中心的地方更加弯曲)。导致真实成像点向内或向外偏离理想成像点。其中畸变像点相对于理想像点沿径向向外偏移,远离中心的,称为枕形畸变;径向畸点相对于理想点沿径向向中心靠拢,称为桶状畸变

桶状畸变:

张正友标定法,计算机视觉,opencv,人工智能

枕形畸变:

张正友标定法,计算机视觉,opencv,人工智能

3.2 畸变公式

径向畸变公式:

张正友标定法,计算机视觉,opencv,人工智能

切向畸变公式:

张正友标定法,计算机视觉,opencv,人工智能

    其中,(),()分别为理想的无畸变的归一化的图像坐标、畸变后的归一化图像坐标,为图像像素点到图像中心点的距离,即张正友标定法,计算机视觉,opencv,人工智能

 相机标定的第二个目的就是获得相机的畸变参数,如上式中的

4.相机标定原理

       针对针孔相机模型,只要内参矩阵和外参矩阵就可以唯一的确定相机模型。这个过程就称为相机标定。相机标定的目的是为了获得相机的内参矩阵和外参矩阵。相机标定的内参主要包括焦距、像主点坐标、畸变参数。

      通过世界坐标集(,,),以及它们在图像平面上的投影坐标集(,),计算相机投影 矩阵M中的 11个未知参数。

相机模型:

张正友标定法,计算机视觉,opencv,人工智能

线性方法:

张正友标定法,计算机视觉,opencv,人工智能

非线性方法:

张正友标定法,计算机视觉,opencv,人工智能

5.张正友标定法介绍

      张正友标定法利用如下图所示的棋盘格标定板,在得到一张标定板的图像之后,可以利用相应的图像检测算法得到每一个角点的像素坐标( u , v ) 。

     张正友标定法将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标W = 0 ,由于标定板的世界坐标系是人为事先定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到每一个角点在世界坐标系下的物理坐标( U , V , W = 0 ) 。

      我们将利用这些信息:每一个角点的像素坐标( u , v ) 、每一个角点在世界坐标系下的物理坐标( U , V , W = 0 ),来进行相机的标定,获得相机的内外参矩阵、畸变参数。

张正友标定法,计算机视觉,opencv,人工智能

5.1张正友标定法的整体流程

张正友标定法,计算机视觉,opencv,人工智能

5.2 张正友标定法的模型

      2D图像点:

      3D图像点:

       描述空间坐标到图像坐标的映射:

       s : 世界坐标系到图像坐标系的尺度因子
       K : 相机内参矩阵
       ( u 0 , v 0 ): 像主点坐标
        α , β : 焦距与像素横纵比的融合    
        γ : 径向畸变参数

          

5.3 模型求解

    张正友标定法标定相机的内外参数的思路如下:

      1)、求解内参矩阵与外参矩阵的积;

      2)、求解内参矩阵;

      3)、求解外参矩阵。

  1)求解内参与外参的积

           不妨设棋盘格位于Z=0

           定义旋转矩阵R的第i列为ri,则有:

             于是空间到图像的映射可改为:

                               张正友标定法,计算机视觉,opencv,人工智能

        其中 H 是描述 Homographic 矩阵 , 可通过最小二乘 ,从角点世界坐标到图像坐标的关系求解

        令H为

            Homography 8 个自由度,

           通过上述等式的矩阵运算,根据 r 1 r 2 正交,以及 归一化的约束可以得到如下等式:

      其中,H为一个3*3的矩阵,并且有一个元素作为齐次坐标。因此,H有8个自由度。现在有8个自由度需要求解,所以需要四个对应点。也就是四个点就可以求出图像平面到世界平面的单应性矩阵H。通过4个点,我们就可以可以获得单应性矩阵H。但是,H是内参阵和外参阵的合体。

     由于和是通过单应性求解出来的,所以我们要求解的参数就变成K矩阵中未知的5个参数。我们可以通过三个单应性矩阵来求解这5个参数,利用三个单应性矩阵在两个约束下可以生成6个方程。其中,三个单应性矩阵可以通过三张对同一标定板不同角度和高度的照片获得。

2)求解内参

     定义

                                 

                                        张正友标定法,计算机视觉,opencv,人工智能

      B是对称矩阵,其未知量可表示为6D向量b,

    设H中的第i列为,

    根据b的定义,推导出:

张正友标定法,计算机视觉,opencv,人工智能

    可以推导出

    如果有 n 组观察图像,则 V 2n x 6 的矩阵
    根据最小二乘定义,的解是 最小特征值对应的特征向量。

    当观测图像大于或等于三幅图像时,就可以得到b的唯一解,应用上述公式我们就可以估算出B了。

      B是通过b构造的对称矩阵。

      得到B后,我们通过cholesky分解 ,就可以得到摄相机机的内参阵A的六个自由度,即

张正友标定法,计算机视觉,opencv,人工智能

 3)求解外参

      根据化简可得外部参数,即:

张正友标定法,计算机视觉,opencv,人工智能

6.相机标定的步骤

   (1)准备一个张正友标定法的棋盘格,棋盘格大小已知,用相机对其进行不同角度的拍摄,得到一组图像;

  (2)对图像中的特征点如标定板角点进行检测,得到标定板角点的像素坐标值,根据已知的棋盘格大小和世界坐标系原点,计算得到标定板角点的物理坐标值;

  (3)求解内参矩阵与外参矩阵;

  (4)求解畸变系数;

  (5)利用L-M(Levenberg-Marquardt)算法对上述参数进行优化。

7.源代码

import cv2
import glob
import numpy as np

w = 9  # 内角点个数,内角点是和其他格子连着的点
h = 6

objp = np.zeros((w * h, 3), np.float32)#一个9*6行3列的矩阵
objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)# 储存棋盘格角点的世界坐标和图像坐标对      reshape(-1, 2)-1表示不确定分几行,2表示分为2列
objp=2.6*objp #棋盘格实际大小
objpoints = []  # 在世界坐标系中的三维点
imgpoints = []  # 在图像平面的二维点

images = glob.glob('photo2/*.jpg')
# 取文件夹中所有图片
for fname in images:
    # 对每张图片,识别出角点,记录世界物体坐标和图像坐标
    img = cv2.imread(fname)#获取图像的水平方向和垂直方向的尺寸
    img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)#立方插值法 缩放到原来的二分之一
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转灰度

    # 寻找角点,存入corners,ret是找到角点的flag
    ret, corners = cv2.findChessboardCorners(gray, (9, 6), None)

    # criteria:角点精准化迭代过程的终止条件
    criteria = (cv2.TERM_CRITERIA_MAX_ITER+ cv2.TERM_CRITERIA_EPS , 30, 0.001)#第一项表示迭代次数达到最大次数时停止迭代,第二项表示角点位置变化的最小值已经达到最小时停止迭代

    # 执行亚像素级角点检测
    corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) # 输入图像、角点初始坐标、搜索窗口为2*winsize+1、第四个参数作用类似于winSize,但是总是具有较小的范围,通常忽略(即Size(-1, -1)),  求角点的迭代终止条件
    objpoints.append(objp)# .append()向列表/数组添加元素
    imgpoints.append(corners2)

    # 在棋盘上绘制角点
    img = cv2.drawChessboardCorners(img, (9, 6), corners2, ret)
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.imshow('img', img)
    cv2.waitKey(1000)

'''
传入所有图片各自角点的三维、二维坐标,相机标定。
每张图片都有自己的旋转和平移矩阵,但是相机内参和畸变系数只有一组。
mtx,相机内参;dist,畸变系数;rvecs,旋转矩阵;tvecs,平移矩阵。
'''
# 输入:世界坐标系里的位置 像素坐标 图像的像素尺寸大小 3*3矩阵,相机内参数矩阵 畸变矩阵
#使用cv2.calibrateCamera()进行标定,这个函数会返回标定结果、相机的内参数矩阵、畸变系数、旋转矩阵和平移向量
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
img = cv2.imread('photo2/5.jpg')

img = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
h, w = img.shape[:2]

'''
使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数
参数1表示保留所有像素点,同时可能引入黑色像素,并返回一个ROI用于将其剪裁掉
设为0表示尽可能裁剪不想要的像素,这是个scale,0-1都可以取。
'''

newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
# 纠正畸变
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)

# 输出纠正畸变以后的图片
x, y, w, h = roi
dst = dst[y:y + h, x:x + w]
cv2.imwrite('result.png', dst)
# 输出:标定结果 相机的内参数矩阵 畸变系数 旋转矩阵 平移向量
mtx_new=mtx.tolist()
print("相机内参矩阵:\n", mtx_new)#[fx,s,x0;0,fy,y0;0,0,1],fx,fy为焦距,一般二者相等;x0、y0为主点坐标(相对于成像平面),s为坐标轴倾斜参数,理想情况下为0
print("newcameramtx:\n", newcameramtx)
print (("旋转向量rvecs:\n"),rvecs)    # 旋转向量  # 外参数,3个旋转参数
print (("平移向量tvecs:\n"),tvecs)    # 平移向量  # 外参数,3个平移参数
print("畸变系数dist:\n", dist)#5个畸变参数,径向畸变k1,k2,k3,切向畸变p1、p2

# 计算误差
# 反投影误差越接近0,说明结果越理想。
# 通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,
# 然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差,这个值就是反投影误差。
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))

8.实验结果及分析

本次实验采用了两组数据,第1组为拍摄角度变化较大的15张,第2组拍摄角度几乎没变的15张。

8.1 实验结果

第1组棋盘格照片(角度变化比较大的15张):

张正友标定法,计算机视觉,opencv,人工智能

   实验结果:

    角点检测结果:

张正友标定法,计算机视觉,opencv,人工智能

张正友标定法,计算机视觉,opencv,人工智能

张正友标定法,计算机视觉,opencv,人工智能

张正友标定法,计算机视觉,opencv,人工智能

 张正友标定法,计算机视觉,opencv,人工智能

张正友标定法,计算机视觉,opencv,人工智能  

张正友标定法,计算机视觉,opencv,人工智能

 第2组棋盘格照片(拍摄角度几乎不变的15张):

张正友标定法,计算机视觉,opencv,人工智能

 实验结果:

张正友标定法,计算机视觉,opencv,人工智能

 张正友标定法,计算机视觉,opencv,人工智能

张正友标定法,计算机视觉,opencv,人工智能

 张正友标定法,计算机视觉,opencv,人工智能

             张正友标定法,计算机视觉,opencv,人工智能 

张正友标定法,计算机视觉,opencv,人工智能

8.2 结果分析

    (1) 同一相机用同一组图片进行多次实验得到的相机内参一致,且畸变系数保持不变。但是每张图片的旋转矩阵和平移矩阵不同。

    (2) 同一相机分别对角度变化比较大的15张图片和角度几乎不变的15张图片进行实验得到的相机内参不一致,是由于相机标定时采用的是小孔成像模型,但是这个模型并不是真正的模型,只是一个近似模型,所以不同距离等效的相机光心点不一样,导致在不同距离标定的相机内参是不一样的。另一方面的原因是因为相机标定时标定板并不能做到完全在一个平面上,会对实验结果产生一定的误差。

      (3)   标定照片的图片不能太少,会导致标定参数不准确。

      (4)   拍摄过程中如果调整了焦距会对实验结果有影响,需要重新标定。

    (5)拍摄的图片的清晰度会影响角点检测,从而影响实验结果。

   

       文章来源地址https://www.toymoban.com/news/detail-792588.html

到了这里,关于相机标定-张正友棋盘格标定法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉】OpenCV实现单目相机标定

    文章目录 单目相机标定(基于Python OpenCV) 1.上期填坑 2.单目相机标定 2.1 数据采集 2.2 角点提取 2.3 参数求解 2.4 参数评估(重投影误差) 2.5 相机位姿(棋盘位姿)可视化 2.6 同Matlab标定结果比较 在开始本篇博客之前,先填一下上一篇博客【计算机视觉】基于ORB角点+RANSAC算法实现图像

    2023年04月18日
    浏览(45)
  • 计算机视觉之三维重建(二)(摄像机标定)

    标定示意图 标定目标 P ′ = M P w = K [ R   T ] P w P^{\\\'}=MP_w=K[R space T]P_w P ′ = M P w ​ = K [ R   T ] P w ​ 其中 K K K 为内参数, [ R   T ] [R space T] [ R   T ] 为外参数。该式子需要使用至少六对内外点对进行求解内外参数(11个未知参数)。 其中 R 3 × 3 , T 3 × 1 R_{3 times 3}, T_{3 times

    2024年02月12日
    浏览(34)
  • 【计算机视觉】相机

    我的《计算机视觉》系列参考UC Berkeley的CS180课程,PPT可以在课程主页看到。 成像原理 想要拍一张相片,直接拿胶片对着景物肯定是不行的,因为物体的每一点发出的光线都会到达胶片上的每一点,从而导致胶片上的影像非常模糊,甚至什么都看不出来。因此,我们想建立景

    2024年02月08日
    浏览(29)
  • 计算机视觉的相机选型

    #你一般什么时候会用到GPT?# 目前市面上的工业相机大多是基于CCD(ChargeCoupled Device)或CMOS(Complementary Metal Oxide Semiconductor)芯片的相机。一般CCD制造工艺更加复杂,也会更贵一点! 1、CCD工业相机主要应用在运动物体的图像提取,不过因为CMOS相机的成本低,所以应用也比较广

    2024年02月08日
    浏览(34)
  • 计算机视觉基础(7)——相机基础

    从这一节开始,我们来学习 几何视觉 。中层视觉包括 相机模型、单目几何视觉、对极几何视觉和多目立体视觉等 。在学习几何视觉最开始,我们先来学习一下 相机模型 ,了解相机的基本原理,了解相机如何记录影像。 相机用于生成 二维的图像 ,图像最小的单元被称为

    2024年02月04日
    浏览(31)
  • OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、

    2024年03月13日
    浏览(35)
  • 计算机视觉:多相机硬件同步拍摄

    目前主要有两种方法来同步不同传感器的信息(帧、IMU数据包、ToF等): 硬件同步(基于硬件信号触发,同步精度较高,需要硬件支持) 软件同步(基于时间戳或序列号同步,同步精度较低,无需硬件支持) 此博客重点介绍硬件同步,它允许在多个相机传感器之间精确同步

    2024年02月13日
    浏览(25)
  • 计算机视觉:OAK多相机硬件同步拍摄

    目前主要有两种方法来同步不同传感器的信息(帧、IMU数据包、ToF等): 硬件同步(基于硬件信号触发,同步精度较高,需要硬件支持) 软件同步(基于时间戳或序列号同步,同步精度较低,无需硬件支持) 此博客重点介绍硬件同步,它允许在多个相机传感器之间精确同步

    2024年02月09日
    浏览(32)
  • 【计算机视觉】相机基本知识(还在更新)

    面阵相机则主要采用的 连续的、面状扫描光线 来实现产品的检测; 线阵相机即利用 单束扫描光 来进行物体扫描的工作的。 (1)面阵CCD工业相机: 优点 :应用面较广,如面积、形状、尺寸、位置,甚至温度等的测量。面阵CCD的优点是可以获取测量图像直观,二维图像信息

    2024年02月12日
    浏览(43)
  • 计算机视觉算法中的 相机姿态估计(Camera Pose Estimation)

    目录 ​编辑引言 相机姿态估计的基本概念 相机姿态估计的方法 特征点匹配 直接法 基于深度学习的方法 相机姿态估计的应用 增强现实(AR) 机器人导航 三维重建 结论 相机姿态估计是计算机视觉领域的重要任务之一。它涉及到确定相机在三维空间中的位置和朝向,常用于

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包