视觉SLAM14精讲——相机与图像3.1

作者 : admin 本文共1785个字,预计阅读时间需要5分钟 发布时间: 2024-06-9 共2人阅读

视觉SLAM14精讲

  1. 三维空间刚体运动1.0
  2. 三维空间刚体运动1.1
  3. 三维空间刚体运动1.2
  4. 李群与李代数2.1
  5. 相机与图像3.1

视觉SLAM14精讲——相机与图像3.1

  • 视觉SLAM14精讲
      • 简介
      • 相机模型
        • 内参K

简介

相机是VSLAM中的核心传感器。本章知识点内容涉及到相机相关的知识以及3D计算视觉的一些基础内容。技术栈涉及到相机内外参的标定,投影,以及三维重建。

相机模型

内参K

K

=

[

f

x

0

c

x

0

f

y

c

y

0

0

1

]

\begin{equation} K = \left[\begin{array}{ccc} f_x & 0 & c_x \ 0 & f_y & c_y \ 0& 0& 1\end{array} \right] \end{equation}

K=

fx000fy0cxcy1

在忽略畸变的情况下,相机平面中的点,需要转换成列向量,乘以内参的逆

K

1

K^{-1}

K1, 就可以将其转换为空间坐标。但要注意,此时的空间坐标是以

z

z

z坐标进行归一化了的。同样的,空间中的点,对

z

z

z轴归一化以后,乘以内参

K

K

K就可以转换到图像空间。

P

3

D

=

K

1

Z

u

,

v

P

2

D

=

K

1

Z

u

,

v

(

u

v

1.0

)

P

2

D

=

K

1

z

P

3

D

=

K

1

z

(

x

y

z

)

\begin{align} P_{3D} &= K^{-1} Z_{u, v} P_{2D} = K^{-1} Z_{u, v} \left( \begin{array}{ccc} u \ v \ 1.0 \end{array} \right)\ P_{2D} &= K \frac{1}{z }P_{3D} = K \frac{1}{z }\left( \begin{array}{ccc} x \ y \ z \end{array} \right)\ \end{align}

P3DP2D=K1Zu,vP2D=K1Zu,v

uv1.0

=Kz1P3D=Kz1

xyz

  • 三维点投影二维点,只需要坐标本身和内参即可计算获得。因此,式(2)中的

    z

    z

    z值就是三维坐标中的

    z

    z

    z分量。

  • 相反的是,二维点不包含尺度因子,因此在恢复三维点的时候,需要额外的尺度因子作为补充。这里的尺度因子,就是常提到的深度 。式(1)中的

    Z

    u

    ,

    v

    Z_{u, v}

    Zu,v是坐标

    u

    ,

    v

    u, v

    u,v处所对应的深度信息。

式(1,2)反映只考虑一个这样的点进行内参计算的操作。意味着这样的操作需要重复

w

×

h

w imes h

w×h次。每个像素对应的深度值不同,才能够恢复出物体的结构。如若全部采用同一个深度值,则投影物体会变成一个“纸片”。或者干脆忽略深度因子,所重建的物体会在一米处形成一个“纸片”。

  • 需要乘以深度信息揭示,内参矩阵中的焦距参数

    f

    x

    ,

    f

    y

    f_x, f_y

    fx,fy的单位并不是网上所谓的

    p

    i

    x

    e

    l

    m

    m

    \frac{pixel}{mm}

    mmpixel或者其他带有实际物理距离的转换量纲,而是归一化的单位

    p

    i

    x

    e

    l

    1.0

    \frac{pixel}{1.0}

    1.0pixel

  • 此处的中心点坐标

    c

    x

    ,

    c

    y

    c_x, c_y

    cx,cy,是张正友标定法确定的投影中心坐标。如果单纯是图像中心坐标其实是不需要计算的。因此不能够简单用图像中心坐标当作内参的中心坐标。以上提到的所有参数,包括畸变参数,都随着相机芯片和固定了的镜头所确定。镜头动、芯片换,内参就需要重新进行标定。同一个内参,即便是同款相机也不能混用,必须做到一机一内参。相机镜头被意外触动,理论上必须重新进行内参标定。

  • 还有一种情况。在相机的日常使用过程中,还会遇到的一种情况是改变相机分辨率。可能下意识会觉得需要重新标定内参K。其实这时候内参只需要和图像保持同样的缩放比即可, 但是

    K

    [

    3

    ,

    3

    ]

    K[3,3]

    K[3,3]仍要保持等于1。

img2x = cv2.resize(img, (0,0), fx=2, fy=2)
K = K * 2
K[2, 2] = 1

img0_5x = cv2.resize(img, (0,0), fx=0.5, fy=0.5)
K = K * 0.5
K[2, 2] = 1
  • 另一些情况下,我们希望在即便矫正以后,图像仍能够保持相同的内参K参数,需要在opencv矫正畸变接口中,设定输出的内参参数,一般与矫正畸变前保持一致。
cv2.undistort(img, camera_matrix, K, K) #K.保持一致
cv2.initUndistortRectifyMap(K, D, R, K, (w,h), mapx, mapy) #K保持一致
本站无任何商业行为
个人在线分享 » 视觉SLAM14精讲——相机与图像3.1
E-->