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

针孔相机的内参标定

  • 针孔相机原理
    • 真空相机模型
    • 图片的伸缩和裁剪变换
  • 内参标定———非线性优化
  • 张正定标定详细原理(含公式推导)
  • 通过多张棋盘格照片完成相机的内参标定流程(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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debian常用命令

Debian是一种常见的Linux发行版,以下是一些常用的Debian命令: 1. apt-get:用于安装、升级和删除软件包。例如:apt-get install package_name。 2. dpkg:用于管理Debian软件包。例如:dpkg -i package_name…

白平衡简介

文章目录 白平衡的概念白平衡的调节常见的白平衡模式 白平衡的概念 白平衡是指摄影、摄像和显示技术中的一项重要概念,用于调节图像中的白色或中性灰色的色彩,使其看起来在不同光源条件下都是准确的白色或灰色。白平衡的主要目的是确保图像的色彩准确性…

C语言 | Leetcode C语言题解之第49题字母异位词分组

题目: 题解: /*1.将字符串原串与副本进行绑定成一个节点2.对字符串副本进行按ascii码表进行从小到大排序3.按照字符串进行比较排序4.合并 */ typedef struct Node{char*s;char*s_vice;int len; }Node;void sortShellChar(char*s,int len){for(int dista…

TS类型断言

类型断言(Type Assertions)在 TypeScript 中确实是一种在表达式级别上临时指定类型的机制,它允许开发者在编译时覆盖编译器的类型推断结果。类型断言有两种语法形式: “尖括号”语法: let someValue: any this is a s…

查找总价格为目标值的两个商品 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将每两个的和都算出来, 判断是否为目标值解法二: 数组中的数是按升序排序的, 我们可以定义左右指针 如果和小于目标值, 则应该让和变大, 所以左指针右移如果和大于目标值, 则应该让和变小, 所以右指针左移 思路: 定义left 0, righ…

python学习29:python中的字典dict

python中的字典dict 1.字典的定义: 同样是使用{},不过存储的元素是一个个的:键值对,如下语法: """ 字典的定义: #定义字典字面量:{key:value,key:value,....,key:value} #定义字典变量&am…

每天一个数据分析题(二百九十)——直方图与条形图

关于直方图与条形图的描述,下列说法正确的是() A. 直方图用于展示分类型数据的分布情况 B. 直方图用来展示数值型数据的分布情况 C. 条形图只能用于展示顺序型数据的分布情况 D. 条形图只能用于展示分类型数据的分布情况 题目来源于CDA模…

绝地求生【商城更新】WIA联名上架//专属商店下架

大家好,我是闲游盒. 本周商城将在4.24(周三)更新,商城内容更新如下: 上架物品 ▲W.I.A联名皮肤大礼包 小礼包如下: 包含3套衣服以及MINI、DBS的联名皮肤,3个头饰还挺有特色的,你喜欢…

链栈算法库构建

学习贺利坚老师, 链栈 , 构建链栈算法库 数据结构之自建算法库——链栈_领会链栈结构和掌握链栈中的各种基本算法-CSDN博客文章浏览阅读3.9k次,点赞3次,收藏8次。本文针对数据结构基础系列网络课程(3):栈和队列中第4课时栈的链式存储结构及其…

安全开发实战(3)--存活探测与端口扫描

目录 安全开发专栏 前言 存活探测 端口扫描 方式一: 1.3.1 One 1.3.2 Two 1.3.3 批量监测 方式二: 1.3.1 One 1.3.2 Two 1.3.3 Three 1.3.4 扫描ip地址,提取出开放端口和协议 ​编辑 1.3.5 批量扫描(最终完成版) 总结 安全开发专栏 安全开发实战​http://t.csd…

数据安全风险评估流程

数据安全风险评估是一个系统性的过程,旨在识别、评估和管理数据安全风险。以下是数据安全风险评估的一般流程及其内容: 确定评估范围:确定评估的范围和目标,包括评估的数据资产、系统、流程和相关方。 收集信息:收集有…

spring mvc \ spring boot \ spring cloud

spring mvc 主要是用作IOC 容器 框架还是传统三层架构 1.容器 依赖注入 CDI 传统web是由beanmanager管理bean的依赖和注入,beanfactory管理bean的创建,以消息进行驱动(HttpSessionListener等) 由框架自行管理 2.IOC 控制反转 bean的创建由开发人员…

leveldb中THREAD_ANNOTATION_ATTRIBUTE__宏的作用

THREAD_ANNOTATION_ATTRIBUTE__ 宏在 LevelDB 或类似的 C 项目中用于指定线程安全相关的源码注解(Source Code Annotation),这些注解有助于清晰地表达程序中函数、变量、类型等元素在多线程环境中的行为特征和并发保证。这样的注解不仅有助于…

【zabbix7】新版本尝鲜之connector

zabbix历史版本中,会使用python脚本,把zabbix的告警发送到kafka进行二次处理,或者使用filebeat把zabbix的Export的njson指标数据发送到kafka进行二次处理,然而在zabbix7中新增了新功能connector简化了操作并且可以根据tag进行区分…

【算法刷题day36】Leetcode:435. 无重叠区间、763.划分字母区间、56. 合并区间

文章目录 Leetcode 435. 无重叠区间解题思路代码总结 Leetcode 763.划分字母区间解题思路代码总结 Leetcode 56. 合并区间解题思路代码总结 草稿图网站 java的Deque Leetcode 435. 无重叠区间 题目:435. 无重叠区间 解析:代码随想录解析 解题思路 先按…

Centos Top 30常用命令及详解

在Linux的众多发行版中,CentOS以其稳定性和高效性备受青睐。掌握CentOS的操作对于系统管理员来说至关重要,而熟悉一系列核心命令更是提高工作效率的关键。从文件管理到系统监控,我们精心编制的Top 50常用CentOS命令列表是每位Linux用户的实战…

systemd 强大的初始化系统和服务管理器

在Linux下,systemd 是一个非常强大的初始化系统和服务管理器, 它可以用来管理各种系统服务和进程。如果想要使用 systemd 来监控一个进程, 并在它退出时自动重新启动它,可以为该进程创建一个 systemd 服务单元文件。 以下是如何为…

详解Al作画算法原理

ChatGPT AI作画算法,又称为AI图像生成算法,是一种人工智能技术,它可以根据给定的输入自动生成图像。这类算法近年来变得非常流行,尤其是随着深度学习技术的发展。这里我将聚焦于目前最先进的一类AI作画算法,即生成对抗…

CVE-2022-0543 Redis沙盒逃逸漏洞复现(CVE-2022-0543)

0x01前言 Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值(Key-Value)存储数据库,并提供多种语言的API。 redis 存在安全漏洞,攻击者可利用该漏洞远程执行代码。…

C++:构造函数与析构函数

目录 构造函数 构造函数的概念 析构函数的作用 自定义构造函数与默认构造函数 自定义构造函数 默认构造函数 调用自定义构造函数 析构函 自定义析构函数和默认构造函数 自定义构造函数 默认析构函数 构造函数 构造函数的概念 我们通常的函数是都需要有返回值的,但…