针孔相机模型原理坐标系辨析内参标定流程内参变换

针孔相机的内参标定

  • 针孔相机原理
    • 真空相机模型
    • 图片的伸缩和裁剪变换
  • 内参标定———非线性优化
  • 张正定标定详细原理(含公式推导)
  • 通过多张棋盘格照片完成相机的内参标定流程(C++代码)
  • 其他工具箱

相机分为短焦镜头和长焦镜头,短焦镜头看到的视野更广阔,同样距离大小的一颗树,在短焦相机中所占的像素个数较少。
长焦镜头看到的视野较窄,能看的更远。因为同样距离大小的一棵树,在长焦距镜头中的像素个数更多;
同一款芯片,短焦距fov大,长焦fov小。

针孔相机原理

真空相机模型

要搞明白针孔相机模型,首先需要明确世界坐标系 O X w Y w Z w OX_wY_wZ_w OXwYwZw、相机坐标系 O X c Y c Z c OX_cY_cZ_c OXcYcZc、物理坐标系 O X l Y l OX_lY_l OXlYl和像素坐标系 O U V OUV OUV之间的关系。最重要的是需要理解物理坐标系和像素坐标系之间的变换关系。
在这里插入图片描述

  • 坐标系之间的关系

    • 这里提到的世界坐标系,只是一种表征的方式,与其他专业领域提到的世界坐标系不一样。这里仅仅指代的是某个自定义原定的坐标系。在自动驾驶的传感器标定中,多指车体坐标系和激光雷达坐标系。尺度为m
    • 相机坐标系。相机坐标系是以相机光心为原点的笛卡尔坐标系,遵循右手定则。正前方深度方向为Z轴,y轴方向根据相机安装方式可以朝上也可以朝下,x轴方向取决于y轴的方向(根据右手定则确定)。尺度为m
    • 物理坐标系。物理坐标系与图像采集传感器联系紧密。也就是说光线在感光芯片上的成像点。原点通常情况下是成像平面的中心。以索尼IMX249芯片为例,芯片尺寸为 11.33 m m × 7.13 m m 11.33mm \times 7.13mm 11.33mm×7.13mm。那么 x l ∈ [ − 5.665 m m , 5.665 m m ] , y ∈ [ − 3.565 m m , 3.565 m m ] x_l \in [-5.665mm, 5.665mm], y \in [-3.565mm, 3.565mm] xl[5.665mm,5.665mm],y[3.565mm,3.565mm]
    • 像素坐标系。像素坐标系与芯片的像素尺寸 σ u , σ v \sigma_u, \sigma_v σu,σv有关,像素尺寸是指图像传感器上每个像素的物理尺寸,通常以微米 ( μ m ) (μm) (μm)为单位。它是指在传感器上每个像素所占据的面积。IMX249芯片的像素尺寸为 5.86 μ m × 5.86 μ m 5.86 \mu m \times 5.86 \mu m 5.86μm×5.86μm。所以分辨率为 1920 ( 11.33 / 5.86 × 1000 ) × 1200 ( 7.13 / 5.85 × 1000 ) 1920(11.33/5.86\times1000) \times 1200(7.13/5.85\times1000) 1920(11.33/5.86×1000)×1200(7.13/5.85×1000),也就是2.3M(230万)的分辨率。
  • 什么是内参?
    内参可以完成相机坐标系中点P到像素坐标系的投影。也就是说点P的反射光线,经过光心以及透镜的折射以后,会落在像素坐标系的那个像素坐标。以下面的公式讲解:
    [ u v 1 ] = 1 z c [ f x 0 c x 0 f y c y 0 0 1 ] [ x c y c z c ] ( 1 )   { u = f x z c x c + c x v = f y z c x c + c y   { x c = ( u − c x ) × σ u f × z c = ( u − c x ) f x × z c y c = ( v − c y ) × σ v f × z c = ( v − c y ) f y × z c ( 2 ) \begin{bmatrix} u\\ v\\ 1\\ \end{bmatrix} = {1 \over z_c} \begin{bmatrix} f_x&0&c_x\\ 0& f_y&c_y\\ 0&0&1\\ \end{bmatrix} \begin{bmatrix} x_c\\ y_c\\ z_c\\ \end{bmatrix} (1) \\ \ \\ \left\{ \begin{aligned} u = {f_x \over z_c} x_c + c_x \\ v = {f_y \over z_c} x_c + c_y \\ \end{aligned} \right. \\ \ \\ \left\{ \begin{aligned} x_c ={(u - c_x) \times \sigma_u \over f} \times z_c ={(u - c_x) \over f_x} \times z_c \\ y_c ={(v - c_y) \times \sigma_v \over f} \times z_c ={(v - c_y) \over f_y} \times z_c \\ \end{aligned} \right. (2) uv1=zc1fx000fy0cxcy1xcyczc(1) u=zcfxxc+cxv=zcfyxc+cy xc=f(ucx)×σu×zc=fx(ucx)×zcyc=f(vcy)×σv×zc=fy(vcy)×zc2
    上式为点P在相机坐标系中的坐标 ( x c , y c , z c ) (x_c,y_c,z_c) (xc,yc,zc)与像素坐标系坐标 ( u , v ) (u,v) (u,v)的关系。遵循相似三角形给原则,如下图:
    在这里插入图片描述
    其中, f为焦距, p p p是相机坐标系中的坐标位置, p ′ p' p为图像物理坐标系中的坐标位置。 p ′ ( x l , y l ) p'(x_l,y_l) p(xl,yl)在像素坐标中的位置为:
    u = ( x l − c x ) × σ u f   v = ( y l − c y ) × σ v f   f x = f σ u   f y = f σ v u = {(x_l - c_x) \times \sigma_u \over f} \\ \ \\ v = {(y_l - c_y) \times \sigma_v \over f} \\ \ \\ f_x = {f \over \sigma_u }\\ \ \\ f_y = {f \over \sigma_v} u=f(xlcx)×σu v=f(ylcy)×σv fx=σuf fy=σvf

所以说,内参的作用就是完成尺度转化和中心化。

点P在像素坐标系中的像素代表了光心与点P连线方向的射线上的所有点,如果你把式子(1)的相机坐标系坐标的xyz同时缩放m倍,得到的uv像素点是一致的。
反过来思考,如果给你一个像素点坐标uv, 以及内参矩阵,你可以得到该点在相机坐标系下的笛卡尔三维坐标吗?答案是不行的,因为缺少了深度信息。每个像素点都是一条射线,但是射线的长度你不知道。但是如果允许你进行深度的采样呐?也就是说假如相机的可见距离是200,那么采样2000个深度(2000个 z c z_c zc),就可以得到2000个坐标点位置,这2000个点都在射线上,这也就是自动驾驶中LSS的原理。
如果某个像素是个接地点,那么也算是获得了深度的信息。根据相机距离地面的高度,就可以获得深度。注意这里的相机光轴需要水平,如果不水平,需要使用一个水平状态的相机坐标系作为中转,这就是接地点测距的原理。针孔相机中借助了深度为1的平面。

  • 图像传感器尺寸,像素尺寸,焦距,FOV角之间的关系
    假定某相机镜头焦距为f(mm),芯片尺寸为 w , h w, h w,h,垂直FOV角为 θ v \theta_v θv,水平FOV角度为 θ u \theta_u θu。那么,
    t a n ( θ u 2 ) = w 2 × f   θ u = 2 × a r c t a n ( w 2 × f )   θ v = 2 × a r c t a n ( w 2 × f ) tan({\theta_u \over 2}) = {w \over 2 \times f} \\ \ \\ \theta_u = 2 \times arctan({w \over 2 \times f}) \\ \ \\ \theta_v= 2 \times arctan({w \over 2 \times f}) tan(2θu)=2×fw θu=2×arctan(2×fw) θv=2×arctan(2×fw)

  • 给定某个物体所占的像素大小,得到物体真实大小深度的原理
    假定有棵树与相机水平,真实高度为H,v方向占用像素M个, 像素尺寸 σ v \sigma_v σv,焦距 f f f,深度为z。则:
    H M × σ v = z f {H \over M \times \sigma_v} = {z \over f} M×σvH=fz

图片的伸缩和裁剪变换

上文已经讲解了内参的作用,给定一系列相机系下的三维点 P { p 1 , p 2 , . . . , p n } , p i ∈ R 3 P\{p_1, p_2, ... , p_n\},p_i \in R_3 P{p1,p2,...,pn},piR3。相机内参 I ∈ R 3 × 3 I \in R_{3\times3} IR3×3。计算对应的像素点,将这团三维点投影到图片上。
如果图片发生了裁剪和缩放,为了使得这团激光点还可以正确的完成反投影,需要怎么调整内参?
假定原始的内外参矩阵为:
I = [ f x 0 c x 0 f y c y 0 0 1 ] , I = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \\ \end{bmatrix} , I=fx000fy0cxcy1,

  • 图片缩放,在w方向缩放 t w t_w tw倍,在h方向缩放 t h t_h th
    [ u n e w v n e w 1 ] = 1 z c [ t w f x 0 t w c x 0 t h f y t h c y 0 0 1 ] [ x c y c z c ] \begin{bmatrix} u_{new}\\ v_{new}\\ 1\\ \end{bmatrix} = {1 \over z_c} \begin{bmatrix} t_wf_x&0&t_wc_x\\ 0& t_hf_y&t_hc_y\\ 0&0&1\\ \end{bmatrix} \begin{bmatrix} x_c\\ y_c\\ z_c\\ \end{bmatrix} unewvnew1=zc1twfx000thfy0twcxthcy1xcyczc

  • 图片裁剪,以原图上的像素位置 ( m x , m y ) (m_x,m_y) (mx,my)为左上角裁剪
    [ u n e w v n e w 1 ] = 1 z c [ f x 0 c x − m x 0 f y c y − m y 0 0 1 ] [ x c y c z c ] \begin{bmatrix} u_{new}\\ v_{new}\\ 1\\ \end{bmatrix} = {1 \over z_c} \begin{bmatrix} f_x&0&c_x - m_x \\ 0& f_y&c_y-m_y \\ 0&0&1\\ \end{bmatrix} \begin{bmatrix} x_c\\ y_c\\ z_c\\ \end{bmatrix} unewvnew1=zc1fx000fy0cxmxcymy1xcyczc

  • 先从 ( m x , m y ) (m_x,m_y) (mx,my)开始裁剪,裁剪后的图片尺寸是原始尺寸的 T 1 T_1 T1倍,随后把裁剪后的图片扩大到原始图片 T 2 T_2 T2
    [ u v 1 ] = 1 z c [ T 2 T 1 f x 0 T 2 T 1 ( c x − m x ) 0 T 2 T 1 f y T 2 T 1 ( c y − m y ) 0 0 1 ] [ x c y c z c ] \begin{bmatrix} u\\ v\\ 1\\ \end{bmatrix} = {1 \over z_c} \begin{bmatrix} {T_2 \over T_1 }f_x&0&{T_2 \over T_1 }(c_x - m_x)\\ 0&{T_2 \over T_1 } f_y&{T_2 \over T_1 }(c_y - m_y)\\ 0&0&1\\ \end{bmatrix} \begin{bmatrix} x_c\\ y_c\\ z_c\\ \end{bmatrix} uv1=zc1T1T2fx000T1T2fy0T1T2(cxmx)T1T2(cymy)1xcyczc

  • 先缩放后裁剪。先缩放到原始图片的 T 1 T_1 T1倍,然后从缩放后的图片的 ( m x , m y ) (m_x,m_y) (mx,my)开始裁剪。
    [ u v 1 ] = 1 z c [ T 1 f x 0 T 1 c x − m x 0 T 1 f y T 1 c y − m y 0 0 1 ] [ x c y c z c ] \begin{bmatrix} u\\ v\\ 1\\ \end{bmatrix} = {1 \over z_c} \begin{bmatrix} T_1f_x&0&T_1c_x - m_x\\ 0& T_1f_y&T_1c_y - m_y\\ 0&0&1\\ \end{bmatrix} \begin{bmatrix} x_c\\ y_c\\ z_c\\ \end{bmatrix} uv1=zc1T1fx000T1fy0T1cxmxT1cymy1xcyczc

内参标定———非线性优化

相机的内参标定通常是转化为非线性优化的问题,通过多组3D空间点和像素点的一一对应关系,构建优化函数,然后通过LM算法或者高斯牛顿计算。
在这里插入图片描述
构建棋盘格坐标系,原点为棋盘格左上角点,X/Y轴分别为棋盘格的两条边,Z轴垂直棋盘格平面。
根据棋盘格的尺寸,可以得到一系列棋盘格的交叉点3D坐标 P c h e s s b o a r d { p 0 , p 1 , p 2 , . . . , p n } , p ∈ R 3 P_{chessboard}\{p_0,p_1,p_2,...,p_n\},p \in R_3 Pchessboard{p0,p1,p2,...,pn},pR3。通过角点检测算法得到图片中的棋盘格格子角点的像素坐标(可以使用计算机视觉中的Harris算法,可以使用Opencv中的API)。最后根据外参(这里的外参是棋盘格坐标系到相机坐标系的变变换关系 T c h e s s b o a r d c a m e r a T_{chessboard}^{camera} Tchessboardcamera,图中是 T c a m e r a c h e s s b o a r d T_{camera}^{chessboard} Tcamerachessboard,我的习惯是写成前者,表示一个点从chessboar系到camera系的变换)和相机内参构建一系列的方程,通常至少需要四组点的对应关系。
那么现在的问题就是,我们得到了若干组的像素点与3D点的对应关系,怎么求解这里的内参矩阵和外参矩阵呐?这就需要提到张正友标定。

张式标定法的大致思路如下:
那么现在的问题就是,我们得到了若干组的像素点与3D点的对应关系,怎么求解这里的内参矩阵和外参矩阵呐?这就需要提到张正友标定。
张式标定法的大致思路如下:

  1. 准备一个张正标定法的棋盘格,棋盘格大小已知,用相机对其进行不同角度的拍摄,得到一组图像
  2. 对图像中的特征点如标定板的角点进行检测,得到标定板角点的像素坐标值(畸变后的),根据已知的棋盘格大小和世界坐标系(这里将棋盘格坐标系作为世界坐标系)原点,计算得到标定板角点的物理坐标值
  3. 求解内参矩阵和外参矩阵的点乘
    根据物理坐标系和像素坐标系值(就当成是没有畸变的像素点坐标)的关系,求出H矩阵(内参矩阵点乘外参矩阵),进而构造v矩阵,求解B矩阵,最后利用B矩阵求解内参矩阵,最后求解每张图片对应的相机外参矩阵。(这里的H,D,V,B矩阵的含义下文会介绍)
    这里的求解过程都是 将角点像素值作为没有畸变的情况下进行的,存在误差
  4. 求解畸变参数
    根据一组畸变后的角点像素值以及对应的理想像素值,构造D矩阵,计算畸变参数(这里的理想像素坐标值和畸变后的角点像素坐标的怎么得到?)
  5. 利用L-M算法对第4步目标函数进行求解,进行参数优化

张正定标定详细原理(含公式推导)

在梳理这个问题之前,需要明白的是不同位置不同角度的标定板与相机坐标系之间的外参矩阵 T c h e s s b o a r d c a m e r a T_{chessboard}^{camera} Tchessboardcamera是不同的,但是同一个位置标定板的不同角点坐标与相机之间的外参矩阵是一样的,还有就是所有位置所有角度拍摄的照片对应的内参是一样的。

  1. 第一步, 构建求解H矩阵
    H矩阵其实就是内参矩阵与外参矩阵的乘积,但是又有点不同,因为棋盘格坐标系Z轴垂直棋盘格平面的缘故,所以这里可以完成简化,不需要旋转矩阵的第三列。
    记点棋盘格坐标系P的坐标为 { x c h e s s b o a r d , y c h e s s b o a r d , z c h e s s b o a r d } \{x_{chessboard},y_{chessboard},z_{chessboard}\} {xchessboard,ychessboard,zchessboard},内参矩阵记为 I I I,外参矩阵记为 T c h e s s b o a r d c a m e r a T_{chessboard}^{camera} Tchessboardcamera,对应的像素点坐标为 { u , v } \{u,v\} {u,v},点P在相机坐标系下的z轴坐标为 z c a m z_{cam} zcam。由此得到如下公式:
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ z_{cam}\begin{…

因为棋盘坐标系垂直于棋盘格平面,所以这里的棋盘格点P的z轴坐标为0,因此得,

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ z_{cam}\begin{…

每个对应关系可以构建上式(8)(9)两个式子,式(7)的9个参数中有个其次坐标,因为需要四个棋盘格系的坐标点,构成8个等式完成H矩阵的8个参数的求解。注意这四个点需要来自同一个位置的棋盘格标定板,因为H矩阵包含了外参,这8个等式的H矩阵需要保持一致

  1. 第二步,构建 V V V矩阵,求解 B B B矩阵

B矩阵需要内参矩阵来求解, B = I − T I − 1 B = I^{-T}I^{-1} B=ITI1。为什么需要这个参数请看下边的分析

根据上文知道, r 1 , r 2 r_1,r_2 r1,r2是外参矩阵的前两列,这两个单位列向量正交,即 r 1 T r 2 = 0 r_1^Tr_2=0 r1Tr2=0,由此可以得到下列的过程,记矩阵 H = [ h 1 , h 2 , h 3 ] , h i ∈ R 3 H=[h_1,h_2,h_3],h_i \in R_3 H=[h1,h2,h3],hiR3
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ [h_1,h_2,h_3] …
记矩阵 B B B为:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ B &= I^{-T}I^{…
由式子(16)(17)我们可以知道在H矩阵已知的情况下,每个棋盘格位姿可以得到两个等式,内参据矩阵 I I I有5个参数需要求解,矩阵B有九个参数,但是因为矩阵B是个对称阵,所以矩阵B只剩下6个参数需要求解,因此我们需要三个棋盘格的位姿来完成6个等式的构建(每个棋盘格位姿选取超过4个角点坐标求出对应的H矩阵)。由此我们就求出了B矩阵,B矩阵与内参矩阵联系紧密。

因为B矩阵是个对称阵,因此B矩阵中还有6个参数需要求解,记作b。
b = [ b 11 , b 12 , b 22 , b 21 , b 22 , b 33 ] T b = [b_{11},b_{12},b_{22},b_{21},b_{22},b_{33}]^T b=[b11,b12,b22,b21,b22,b33]T
因此, h 1 T I − T I − 1 h 2 = 0 h_1^TI^{-T}I^{-1}h_2=0 h1TITI1h2=0可以完成下述推导,
KaTeX parse error: No such environment: align at position 7: \begin{̲a̲l̲i̲g̲n̲}̲ h_1^TI^{-T}I^{…
然后结合式子(16)(17),可以得到下列等式,
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \begin{bmatrix…
因此,每个姿态的标定板(通过标定板上的四个角点位置)得到的H矩阵的帮助下,可以构建两个方程,限制B矩阵(B矩阵来源自内参,所以所有标定板姿态对应的B矩阵都一样)的两个自由度(B矩阵只有六个自由度)。所以我们需要三个位置姿态的标定板对应的H矩阵来构建6个方程,完成B矩阵6个自由度的限制。

记第一个标定板对应的V矩阵为 v 12 ′ , v 11 ′ , v 22 ′ v'_{12},v'_{11},v'_{22} v12,v11,v22,第二个标定板对应的V矩阵为 v 12 ′ ′ , v 11 ′ ′ , v 22 ′ ′ v''_{12},v''_{11},v''_{22} v12,v11,v22,第三个标定板对应的V矩阵为 v 12 ′ ′ ′ , v 11 ′ ′ ′ , v 22 ′ ′ ′ v'''_{12},v'''_{11},v'''_{22} v12,v11,v22 。那么结合式(24),我们可以得到,
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \begin{bmatrix…
利用非线性优化的方式,就能求出矩阵b。

  1. 第三步,利用 B B B矩阵求解内参矩阵 I I I
    得到B矩阵以后,通过Cholesky分解得到相机的内参数
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ f_x & =\sqrt{\…

  2. 第四步,结合H矩阵和内参矩阵,求出每个姿态棋盘格的外参
    第三步结束以后,得到了相机的内参矩阵。然后结合每个位姿棋盘格求出的H矩阵和上一步求出的内参矩阵求解每个位置姿态的棋盘格坐标系与相机坐标系之间的转换关系 T c h e s s b o a r d c a m e r a T_{chessboard}^{camera} Tchessboardcamera
    结合式(15),具体计算步骤如下:
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ r_1 &= I^{-1}h…
    到这里,我们已经得到了使用的所有位姿棋盘格与相机坐标系直接的外参关系 T c h e s s b o a r d c a m e r a T_{chessboard}^{camera} Tchessboardcamera,以及相机的内参。

总结一下之前的四步: 首先每个棋盘格姿态我们提取四个角点,构建8个方程,完成H矩阵的求解(H矩阵是内参矩阵和该棋盘格坐标系与相机坐标系的乘积,因此每个位资的棋盘格都对应一个H矩阵);然后另外选取2个位姿的棋盘格,求出另外两个H矩阵。再然后每个H矩阵构建一个两个方程,三个H矩阵构建六个方程,最后构建一个方程组,自变量就是B矩阵的6个参数,系数矩阵记为V矩阵,使用非线性优化的方式求出B矩阵;在然后借助Cholesky分解完成内参矩阵的求解;最后求解相机坐标系与所有棋盘格姿态的外参联系 T c h e s s b o a r d c a m e r a T_{chessboard}^{camera} Tchessboardcamera需要注意的是,上述的过程都是在假设没有畸变的情况下,也就是说式(3)是在无畸变的情况下构建的等式。所以求出的H矩阵,也就基于无畸变的假设,进而造成后续的B矩阵,I矩阵和外参矩阵都有一定的误差存在。所以下边的步骤将解决这里的误差

  1. 第五步,求解畸变参数
    求畸变参数的过程也是最小化误差的过程,完成理想像素点坐标与畸变情况下的像素点坐标之间误差的最小化,最后构建一个方程组,使用LM算法完成最后畸变参数的求解。
    记理想像素坐标为 ( u , v ) (u,v) (u,v),对应在图像物理坐标系的坐标为 ( x l , y l ) (x_l,y_l) (xl,yl),距离芯片中心的距离 r c = x l 2 + y l 2 r_c=\sqrt{x_l^2 + y_l^2} rc=xl2+yl2 ;携带畸变的像素坐标为 ( u ′ , v ′ ) (u',v') (u,v),对应在图像物理坐标系的坐标为 ( x l ′ , y l ′ ) (x_l^{'},y_l^{'}) (xl,yl);感光芯片的像素尺寸为 ( σ u , σ v ) (\sigma_u,\sigma_v) (σu,σv);畸变参数为 k 1 , k 2 , k 3 , k 4 k_1,k_2,k_3,k_4 k1,k2,k3,k4 。为了方便写公式,下文仅对 k 1 , k 2 k_1,k_2 k1k2进行求解, k 3 , k 4 k_3,k_4 k3,k4同理拓展即可。
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ u &= {x_l \ove…
    结合式(35)和(36)可以推出,
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ u - c_x &= (u'…
    进一步,得
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \begin{bmatrix…
    上式中的理想像素坐标点,通过前四步求出的理想内外参矩阵完成棋盘格坐标系3D点的重投影,得到理想的像素点坐标。携带畸变的像素点坐标通过直接对图片进行角点检测得到对应的像素点。每个3D角点和像素点都可以构建式(39)的两个方程。为了可以最小化误差的影响,我们选择已经求出H矩阵的多个棋盘格(m个)位姿的多个3D角点和对应的图片角点像素坐标(n个),构建mn个方程,参照式子(39)的形式整理为矩阵相乘的形式。
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \begin{bmatrix…
    记作,
    KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ D \cdot k &= d…
    使用最小二乘法,得到最后的结果
    k = ( D T ⋅ D ) − 1 ⋅ D T ⋅ d k = (D^T \cdot D)^{-1} \cdot D^T \cdot d k=(DTD)1DTd
    至此,就已经算出了所有的参数。

  2. 第六步,重投影,根据重投影误差优化参数
    后续补充

通过多张棋盘格照片完成相机的内参标定流程(C++代码)

后续补充

其他工具箱

棋盘格下载: 棋盘格下载
ros的相机标定工具箱: ROS相机内参标定工具箱
激光雷达和相机的联合标定工具箱

https://zhuanlan.zhihu.com/p/686197773

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/571566.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QFD赋能人工智能:打造智能化需求分析与优化新纪元

在科技飞速发展的今天,人工智能(AI)已经渗透到我们生活的方方面面。然而,如何让AI更加贴合用户需求,提供更加精准和个性化的服务?这成为了一个亟待解决的问题。质量功能展开(Quality Function Deployment,简…

openjudge_2.5基本算法之搜索_1998:寻找Nemo

题目 1998:寻找Nemo 总时间限制: 2000ms 内存限制: 65536kB 描述 Nemo 是个顽皮的小孩. 一天他一个人跑到深海里去玩. 可是他迷路了. 于是他向父亲 Marlin 发送了求救信号.通过查找地图 Marlin 发现那片海像一个有着墙和门的迷宫.所有的墙都是平行于 X 轴或 Y 轴的. 墙的厚度可…

股票战法课程之倍阴龙战法

1. 核心要素 1、股价处于低位震荡区间 2、涨停板分时走的比较流畅,即使去到分时均线以下也能够是秒拉上来,或者沿着分时均线上攻打板 3、涨停后次日阴线的成交量是前一日涨停板成交量的两倍以上 4、倍量阴线出现后的30天以内第一个涨停板则是买点的浮现…

【数据结构】图(Graph)

文章目录 概念图的存储方式邻接矩阵邻接矩阵表示法邻接矩阵表示法的特点 邻接表邻接表表示法邻接表表示法的特点邻接表表示法的定义与实现查找插入删除其它构造函数析构函数创建图输出图 图的遍历深度优先遍历(DFS)广度优先遍历 图的连接分量和生成树生成…

Hive查询操作详解

Hive 数据准备: Tips: (1)SQL 语言大小写不敏感。 (2)SQL 可以写在一行或者多行。 (3)关键字不能被缩写也不能分行。 (4)各子句一般要分行写。 &#xff0…

进程动静态库

文章目录 动态库和静态库1. 静态库2. 动态库 承接上文: 文件描述符 动态库和静态库 静态库与动态库: 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库&#xf…

python绘制R控制图(Range Chart)

R控制图(Range Chart),也称为范围图或移动极差图,是一种用于分析和控制生产过程中的变异性的统计工具。它通常与Xbar控制图(均值图)一起使用,可以提供关于生产过程变异性的额外信息。以下是R控制…

ArgoCD集成部署到Kubernetes

1:环境 kubernetes1.23.3ArgoCD2.3.3 2:ArgoCD介绍 Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. Argo CD是一个基于Kubernetes的声明式的GitOps工具。 那么,什么是GitOps呢? GitOps是以Git为基…

feign整合sentinel做降级知识点

1&#xff0c;配置依赖 <!-- Feign远程调用依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> <!--sentinel--><dependency>…

Linux使用操作(一)

Linux创建链接的方式 在Linux中&#xff0c;可以给文件创建链接。链接的意思可以理解是快捷方式&#xff0c;它指向另一个文件或目录。 软链接 软连接&#xff08;也叫符号链接&#xff09;是一种特殊类型的文件&#xff0c;它指向另一个文件或目录 语法 ln -s 原文件路径…

谷歌发布基于声学建模的无限虚拟房间增强现实鲁棒语音识别技术

声学室模拟允许在AR眼镜上以最少的真实数据进行训练&#xff0c;用于开发鲁棒的语音识别声音分离模型。 随着增强现实&#xff08;AR&#xff09;技术的强大和广泛应用&#xff0c;它能应用到各种日常情境中。我们对AR技术的潜能感到兴奋&#xff0c;并持续不断地开发和测试新…

SpringBoot---------整合Mybatisplus

快速入门 第一步&#xff1a;导入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency> 第二步&#xff1a;编写mapper…

区块链 | OpenSea 相关论文:Toward Achieving Anonymous NFT Trading(下)

&#x1f951;原文&#xff1a; Toward Achieving Anonymous NFT Trading VII 讨论&#xff1a;关于匿名性与市场平台的困境 在本文的这一部分&#xff0c;我们将讨论关于隐藏 NFT 所有者地址的困境&#xff0c;以及为什么像 OpenSea 这样的 NFT 市场平台几乎必须得到完全的信…

Java | 选择排序算法实现

大家可以关注一下专栏&#xff0c;方便大家需要的时候直接查找&#xff0c;专栏将持续更新~ 题目描述 编写一个Java程序&#xff0c;实现选择排序算法。程序需要能够接收一个整型数组作为输入&#xff0c;并输出排序后的数组。 选择排序是一种简单直观的排序算法&#xf…

imx6ull -- SPI

SPI 是 Motorola 公司推出的一种同步串行接口 技术&#xff0c;是一种高速、全双工的同步通信总线&#xff0c; SPI 时钟频率相比 I2C 要高很多&#xff0c;最高可以工作 在上百 MHz。 SPI 以主从方式工作&#xff0c;通常是有一个主设备和一个或多个从设备&#xff0c;一般 SP…

ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

前言&#xff1a; 从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了&#xff0c;在之前的开发中使用element-ui上传组件el-upload都是直接使用文件选取后立即选择上传&#xff0c;今天刚好做了一个和之前类似的文件选择上传的需求&#xff0c;不过这次是需要手动点…

[InternLM训练营第二期笔记]5. LMDeploy 量化部署 LLM 实践

该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。 该笔记是第五节课&#xff0c;学习大语言模型量化的基本概念&#xff0c;以及利用LMDeploy工具进行微调。 0. 模型部署的概念 0.0 背景 如果要将大模型在特定平台&#xff08;大到服务器集群&#xff0c;小到…

需求 分析

需求分析的任务 需求分析的任务 1、需求分析是软件定义时期的最后一个阶段&#xff0c;它的基本任务是准确地回答“系统必须做什么?”这个问题。 2、确定系统必须完成哪些工作&#xff0c;也就是对目标系统提出完整、准确、清晰、具体的要求。 3、系统分析员应该写出软件需求…

Docker网络及CPU资源控制

一、实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容…

Gradio 最快创建Web 界面部署到服务器并演示机器学习模型,本文提供教学案例以及部署方法,避免使用繁琐的django

最近学习hugging face里面的物体检测模型&#xff0c;发现一个方便快捷的工具&#xff01; Gradio 是通过友好的 Web 界面演示机器学习模型的最快方式&#xff0c;以便任何人都可以在任何地方使用它&#xff01; 一、核心优势&#xff1a; 使用这个开发这种演示机器学习模型的…