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

article/2025/9/22 2:54:31

目录

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.针孔相机模型

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

\begin{aligned} &x=\frac{f X}{Z} \\ &y=\frac{f Y}{Z} \end{aligned}

\left(\begin{array}{l} u \\ v \\ 1 \end{array}\right)\sim \left(\begin{array}{c} f X \\ f Y \\ Z \end{array}\right)=\left[\begin{array}{llll} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]\left(\begin{array}{c} X \\ Y \\ Z \\ 1 \end{array}\right)

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

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

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

2.相机成像过程

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

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

2.1  各个坐标系之间的转换

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

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

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

 \begin{bmatrix} u\\v \\ 1 \end{bmatrix}=\begin{bmatrix} \frac{1}{dx} & 0&u_{0} \\ 0 & \frac{1}{dy} &v_{0} \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x\\ y \\1 \end{bmatrix}

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

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

\frac{Z_{c}}{f}=\frac{X_{c}}{x}=\frac{Y_{c}}{y} \Rightarrow\left\{\begin{array}{l} x=f \frac{X_{c}}{Z_{c}} \\ y=f \frac{Y_{c}}{Z_{c}} \end{array}\right.

用线性矩阵描述为:

Z_{c}\left[\begin{array}{l} x \\ y \\ 1 \end{array}\right]=\left[\begin{array}{llll} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]\left[\begin{array}{c} X_{c} \\ Y_{c} \\ Z_{c} \\ 1 \end{array}\right]

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

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

\begin{bmatrix} X_{c}\\ Y_{c} \\Z_{c} \\ 1 \end{bmatrix}=\begin{bmatrix} R & t\\ 0^{T} & 1 \end{bmatrix}\begin{bmatrix} X_{w}\\Y_{w} \\Z _{w} \\ 1 \end{bmatrix}

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

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

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

Z_{c}\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{ccc} \frac{1}{d x} & 0 & u_{0} \\ 0 & \frac{1}{d y} & v_{0} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]\left[\begin{array}{cc} R & t \\ 0^{T} & 1 \end{array}\right]\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{array}\right]=M_{1} M_{2}\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \\ w \end{array}\right]=M\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{array}\right]

M_{1}=\left[\begin{array}{ccc} \frac{1}{d x} & 0 & u_{0} \\ 0 & \frac{1}{d y} & v_{0} \\ 0 & 0 & \text { 1 } \end{array}\right]\left[\begin{array}{cccc} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right]

M_{2}=\begin{bmatrix} R & t\\ 0^{T} & 1 \end{bmatrix}\begin{bmatrix} X_{w}\\Y_{w} \\Z _{w} \\ 1 \end{bmatrix}

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

3.畸变与畸变矫正

3.1 畸变

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

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

桶状畸变:

枕形畸变:

3.2 畸变公式

径向畸变公式:

\begin{aligned} &\hat{x}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right) \\ &\hat{y}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right) \end{aligned}

切向畸变公式:

\begin{aligned} &\hat{x}=x+\left(2 p_{1} y+p_{2}\left(r^{2}+2 x^{2}\right)\right) \\ &\hat{y}=y+\left(p_{1}\left(r^{2}+2 y^{2}\right)+2 p_{2} x\right) \end{aligned}

    其中,(x,y),(\widehat{x},\widehat{y})分别为理想的无畸变的归一化的图像坐标、畸变后的归一化图像坐标,r为图像像素点到图像中心点的距离,即r^{2}=x^{2}+y^{2}

 相机标定的第二个目的就是获得相机的畸变参数,如上式中的k_{1},k_{2},k_{3},p_{1},p_{2}

4.相机标定原理

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

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

相机模型:

\begin{aligned} u_{i} &=\frac{m_{00} X_{i}+m_{01} Y_{i}+m_{02} Z_{i}+m_{03}}{m_{20} X_{i}+m_{21} Y_{i}+m_{22} Z_{i}+1} \\ v_{i} &=\frac{m_{10} X_{i}+m_{11} Y_{i}+m_{12} Z_{i}+m_{13}}{m_{20} X_{i}+m_{21} Y_{i}+m_{22} Z_{i}+1} \end{aligned}

线性方法:

\begin{aligned} &u_{i}\left(m_{20} X_{i}+m_{21} Y_{i}+m_{22} Z_{i}+1\right)=m_{00} X_{i}+m_{01} Y_{i}+m_{02} Z_{i}+m_{03} \\ &v_{i}\left(m_{20} X_{i}+m_{21} Y_{i}+m_{22} Z_{i}+1\right)=m_{10} X_{i}+m_{11} Y_{i}+m_{12} Z_{i}+m_{13} \end{aligned}

非线性方法:

\left.\sum_{i=1}^{N}\left(u_{i}-\frac{m_{00} X_{i}+m_{01} Y_{i}+m_{02} Z_{i}+m_{03} \text { }}{m_{20} X_{i}+m_{21} Y_{i}+m_{22} Z_{i}+1}\right)^{2}-\frac{m_{10} X_{i}+m_{11} Y_{i}+m_{12} Z_{i}+m_{13}}{m_{20} X_{i}+m_{21} Y_{i}+m_{22} Z_{i}+1}\right)^{2}

5.张正友标定法介绍

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

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

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

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

5.2 张正友标定法的模型

      2D图像点:m=\begin{bmatrix} u & v \end{bmatrix}^{T}

      3D图像点:M=\begin{bmatrix} X & Y & Z \end{bmatrix}^{T}

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

s \tilde{\mathbf{m}}=K\left[\begin{array}{ll} \mathbf{R} & \mathbf{t} \end{array}\right] \tilde{\mathbf{M}} \quad K=\left[\begin{array}{lll} a & \gamma & u_{0} \\ 0 & \beta & v_{0} \\ 0 & 0 & 1 \end{array}\right]

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

          s \tilde{\mathbf{m}}=K\left[\begin{array}{ll} \mathbf{R} & \mathbf{t} \end{array}\right] \tilde{\mathbf{M}} \quad K=\left[\begin{array}{ccc} a & \gamma & u_{0} \\ 0 & \beta & v_{0} \\ 0 & 0 & 1 \end{array}\right]

5.3 模型求解

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

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

      2)、求解内参矩阵;

      3)、求解外参矩阵。

  1)求解内参与外参的积

           不妨设棋盘格位于Z=0

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

s\left[\begin{array}{c} u \\ v \\ 1 \end{array}\right]=K\left[\begin{array}{llll} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{r}_{3} & \mathbf{t} \end{array}\right]\left[\begin{array}{c} X \\ Y \\ 0 \\ 1 \end{array}\right]=K\left[\begin{array}{lll} \mathbf{r}_{1} & \mathbf{r}_{2} & \mathbf{t} \end{array}\right]\left[\begin{array}{c} X \\ Y \\ 1 \end{array}\right]

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

                               

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

        令H为

H=\begin{bmatrix} h_{1}& h_{2} & h_{3} \end{bmatrix}

\begin{bmatrix} h_{1}& h_{2} & h_{3} \end{bmatrix}=\lambda K\begin{bmatrix} r_{1} & r _{2}&t \end{bmatrix}

            Homography 8 个自由度,

           通过上述等式的矩阵运算,根据 r 1 r 2 正交,以及 归一化的约束可以得到如下等式:
K^{-1}\begin{bmatrix} h_{1}& h_{2} & h_{3} \end{bmatrix}=\lambda \begin{bmatrix} r_{1} & r _{2}&t \end{bmatrix}
r_{1}^{T}r_{2}=0
\left\|\mathbf{r}_{1}\right\|=\left\|\mathbf{r}_{2}\right\| \Rightarrow \quad \mathbf{h}_{1}^{T} K^{-T} K^{-1} \mathbf{h}_{1}=\mathbf{h}_{2}^{T} K^{-T} K^{-1} \mathbf{h}_{2}

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

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

2)求解内参

     定义

                                 B=K^{-T}K^{-1}=\begin{bmatrix} B_{11}&B_{21} &B_{31} \\ B_{12}&B_{22} &B_{32} \\ B_{13}&B_{23} &B_{33} \end{bmatrix}

                                        =\left[\begin{array}{ccc} \frac{1}{a^{2}} & -\frac{\gamma}{a^{2} \beta} & \frac{v_{0} \gamma-u_{0} \beta}{a^{2} \beta} \\ -\frac{\gamma}{a^{2} \beta} & \frac{\gamma^{2}}{a^{2} \beta^{2}}+\frac{1}{\beta^{2}} & -\frac{\gamma\left(v_{0} \gamma-u_{0} \beta\right)}{a^{2} \beta^{2}}-\frac{v_{0}^{2}}{\beta^{2}} \\ \frac{v_{0} \gamma-u_{0} \beta}{a^{2} \beta} & -\frac{\gamma\left(v_{0} \gamma-u_{0} \beta\right)}{a^{2} \beta^{2}}-\frac{v_{0}^{2}}{\beta^{2}} & \frac{\left(v_{0} \gamma-u_{0} \beta\right)^{2}}{a^{2} \beta^{2}}+\frac{v_{0}^{2}}{\beta^{2}}+1 \end{array}\right]

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

b=\begin{bmatrix} B_{11} &B_{12} & B_{22} &B_{13} &B_{23} &B_{33} \end{bmatrix}

    设H中的第i列为h_{i},

h_{i}=\begin{bmatrix} h_{i1} &h_{i2} &h_{i3} \end{bmatrix}^{T}

    根据b的定义,推导出:

\begin{aligned} &\mathbf{h}_{i}^{T} \mathbf{B} \mathbf{h}_{j}=\mathbf{v}_{i j}^{T} \mathbf{b}\\ &\mathbf{v}_{i j}=\\ &\left[\begin{array}{llllll} 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} \end{array}\right]^{T}\\ &\begin{aligned} &\mathbf{h}_{1}^{T} K^{-T} K^{-1} \mathbf{h}_{2}=0 \\ &\mathbf{h}_{1}^{T} K^{-T} K^{-1} \mathbf{h}_{1}=\mathbf{h}_{2}^{T} K^{-T} K^{-1} \mathbf{h}_{2} \end{aligned} \end{aligned}

    可以推导出

\left[\begin{array}{c} \mathbf{v}_{12}^{T} \\ \left(\mathbf{v}_{11}-\mathbf{V}_{22}\right)^{T} \end{array}\right] \mathbf{b}=0

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

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

B=K^{-T}K^{-1}

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

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

\begin{aligned} &v_{0}=\left(B_{12} B_{13}-B_{11} B_{23}\right) /\left(B_{11} B_{22}-B_{12}^{2}\right)\\ &\lambda=B_{33}-\left[B_{13}^{2}+v_{0}\left(B_{12} B_{13}-B_{11} B_{23}\right)\right] / B_{11}\\ &a=\sqrt{\lambda / B_{11}}\\ &\beta=\sqrt{\lambda B_{11} /\left(B_{11} B_{22}-B_{12}^{2}\right)}\\ &y=-B_{12} a^{2} \beta / \lambda\\ &u_{0}=\gamma v_{0} / a-B_{13} a^{2} / \lambda \end{aligned}

 3)求解外参

      根据\begin{bmatrix} h_{1} & h_{2} &h_{3} \end{bmatrix}=\lambda K\begin{bmatrix} r_{1} & r_{2} &t \end{bmatrix}化简可得外部参数,即:

6.相机标定的步骤

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

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

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

  (4)求解畸变系数;

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

7.源代码

import cv2
import glob
import numpy as npw = 9  # 内角点个数,内角点是和其他格子连着的点
h = 6objp = 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是找到角点的flagret, 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 += errorprint("total error: ", tot_error / len(objpoints))

8.实验结果及分析

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

8.1 实验结果

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

   实验结果:

    角点检测结果:

 

  

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

 实验结果:

 

 

              

8.2 结果分析

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

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

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

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

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

   

       


http://chatgpt.dhexx.cn/article/SbCnobep.shtml

相关文章

相机标定原理———标定原理介绍

声明:欢迎任何人和组织转载本blog中文章,但必须标记文章原始链接和作者信息。 本文链接:http://blog.csdn.net/li_007/archive/2010/10/30/5976261.aspx 开拓进取的小乌龟------->CSDN点滴点点滴滴Blog 由于在word中包含大量的公式和矩…

VisionMaster标定板标定

选择工具 标定板生成工具我比较喜欢用海康自己研发的标2定板 具体参数看自己需求 最后选择0 导出图像就行 一般不需要cad图纸 保存 去路径下打印看看你的按照路径 我的是D:\VisionMasterV4.2.0\VisionMaster4.2.0\Applications\Tools 找到这张图片 不要改变比例直接打印 …

9点标定方法

9点标定,旋转标定 1.9点标定2.旋转标定3.公式推导过程 1.9点标定 夹具夹取产品或者标定块,选取一个特征,开始进行标定 X轴、Y轴移动一个位置,记录轴的物理坐标:(Qx1,Qy1) 提取图像中…

相机标定(一)

相机标定 相机成像模型参考坐标系针孔模型畸变模型相机参数 相机成像模型 参考坐标系 通常畸变分为两种,径向畸变和切向畸变。 图像像素坐标系:表示场景中三维点在图像平面上的投影,其坐标原点在CCD图像平面的左上角,u轴平行于…

张正友相机标定Opencv实现以及标定流程标定结果评价图像矫正流程解析(附标定程序和棋盘图)

使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些? 相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择…

标定工具介绍

作者 | WenDao_Engineer 微信公众号 | 闻道工程师之家 在前面标定相关的系列文章文对标定的基本介绍、标定的实现过程以及标定所涉及的相关协议都进行了介绍,从今天开始我们介绍一下标定实现过程中的标定工具相关知识。 标定系统组成 我们已经知道通过CCP或者XCP…

单目相机标定实现--张正友标定法

文章目录 一:相机坐标系,像素平面坐标系,世界坐标系,归一化坐标系介绍1:概述公式 二:实现1:整体流程4:求出每张图像的单应性矩阵并用LMA优化5:求解理想无畸变情况下的摄像机的内参数…

摄像机标定和立体标定

尝试用OpenCV来实现立体视觉也有一段时间了,主要的参考资料就是Learning OpenCV十一、十二章和OpenCV论坛上一些前辈的讨论。过程中磕磕碰碰,走了不少弯路,终于在前不久解决了最头大的问题,把整个标定、校准、匹配的流程调试成功。…

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

目录 为什么需要相机标定? 相机标定可以做什么? 相机标定后可以得到什么? 什么情况下需要借助相机标定的方法? 相机标定的原理 实现相机标定的方法 为什么需要相机标定? 一个是由于每个镜头的在生产和组装过程中的…

标定方法——张正友标定法

标定 标定是联系世界坐标与像素坐标的环节,目的是求出相机和投影仪的内外参数,对于3D成像来说至关重要 张正友标定法 通过各种方法的对比,为了方便,我们采用的是张正友标定。我们主要对张正友标定法的原理进行介绍,…

笔记总结-相机标定(Camera calibration)原理、步骤

这已经是我第三次找资料看关于相机标定的原理和步骤,以及如何用几何模型,我想十分有必要留下这些资料备以后使用。这属于笔记总结。 1.为什么要相机标定? 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置…

如何实现标定?

上一篇《什么是标定》对标定进行了初步的介绍,让大家有了一个感性的认识。标定是一项非常复杂的工作的,涉及方方面面的知识非常多,本文将对标定具体实现的过程进行介绍。 控制器对标定的支持 在前面的文章中介绍了控制算法是在软件编程的时候…

标定的分类(一)

关于标定的分类及说明(一) 现在工业机器视觉和计算机视觉大量应用标定算法,但是对于初学者来说,存在概念模糊,理论理解错误的现状,因此,需要对标定进行梳理,防止大家在学习过程中混淆各种标定概念。话不多…

什么是标定?

标定这两个字在汽车行业里的工程师基本都听过,但是在其他行业里大部分人都不知道什么是标定,甚至都没有听说过标定。什么是标定?举一个常见的例子,家里买了电视,连接网络就可以看节目了,与其他任何环境影响…

JMS及其API介绍

Java Message Service是java ee的规范之一,可以用来发送异步消息,在某些场景下,可以作为不同系统,或者不同模块之间的集成方式。 可以类比为通过数据库来集成的方式,模块A完成逻辑以后,往数据库插…

Springboot 整合 JMS

ActiveMQ JMS 仅支持 Java 平台。 由于 JMS 是一套标准,所以 SpringBoot 整合 JMS 必然是整合 JMS 的某一个实现。 Apache ActiveMQ 是一个开源的消息中间件,完全支持 JMS 1.1 规范,支持多种编程语言( C、C、C#、Delphi、Erlang、AdobeFla…

1.JMS规范介绍

目录 1.什么是JMS规范 2.什么是MOM 3.MOM的特点 4.JMS和MOM的关联 5.JMS的体系结构 6.JMS常见基本概念 7.JMS 的事务性会话和非事务性会话 8.JMS消息的可靠性机制 1.什么是JMS规范 Java 消息服务(Java Message Service)是 java 平台中关于面向消息…

JMS 示例

JMS 开发示例。 使用weblogic8作为jms server。 1、在weblogic中配置JMS。 配置JMS connection factory 配置JMS File Store 配置JMS Server 配置JMS destination 2、创建JMS Sender package jms; import java.util.Hashtable; import javax.jms.JMSE

ActiveMQ详解一 —— JMS介绍

1. JMS概述 不同系统之间信息交换,有多种方式。 SUN公司提出了一种面向详细的中间件服务—— JMS,Java消息服务,是JavaEE的标准/规范之一。 JMS指出:消息的发送应该是异步的、非阻塞的。 也就是说,消息的发送者发送…

SpringBoot整合JMS

SpringBoot整合JMS 文章目录 SpringBoot整合JMS前言一、JMS、AMQP概念以及区别二、ActiveMQ安装三、SpringBoot整合ActiveMQ:队列模式实例1、创建demo项目2、添加依赖3、添加application配置4、添加配置文件ActiveMQConfig5、创建JMS组件文件6、发送消息控制器7、测…