Yin的笔记本

vuePress-theme-reco Howard Yin    2021 - 2023
Yin的笔记本 Yin的笔记本

Choose mode

  • dark
  • auto
  • light
Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • MyIdeas
  • Linux
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 形式语言与自动机
  • 博弈论
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • Node
  • Nvidia
  • Python
  • Rust
  • Shell
  • Tex
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
author-avatar

Howard Yin

261

Article

142

Tag

Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • MyIdeas
  • Linux
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 形式语言与自动机
  • 博弈论
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • Node
  • Nvidia
  • Python
  • Rust
  • Shell
  • Tex
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
  • 【摘抄】相机的内外参数

    • 相机外参
      • 相机内参

      【摘抄】相机的内外参数

      vuePress-theme-reco Howard Yin    2021 - 2023

      【摘抄】相机的内外参数


      Howard Yin 2023-09-11 00:03:05 图形学

      相机的位置和朝向由相机的外参(extrinsic matrix)决定,投影属性由相机的内参(intrinsic matrix)决定。

      注意:接下来的介绍假设矩阵是列矩阵(column-major matrix),变换矩阵左乘坐标向量实现坐标变换(这也是OpenCV/OpenGL/NeRF里使用的形式)。

      # 相机外参

      相机外参是一个4x4的矩阵MMM,其作用是将世界坐标系的点Pworld=[x,y,z,1]P_{world}=[x,y,z,1]Pworld​=[x,y,z,1]变换到相机坐标系Pcamera=MPworldP_{camera}=MP_{world}Pcamera​=MPworld​下。我们也把相机外参叫做world-to-camera (w2c)矩阵(注意用的是4维的齐次坐标,如果不了解齐次坐标系请自行查阅相关资料)。

      相机外参的逆矩阵被称为camera-to-world (c2w)矩阵,其作用是把相机坐标系的点变换到世界坐标系。因为NeRF主要使用c2w,这里详细介绍一下c2w的含义。c2w矩阵是一个4x4的矩阵,左上角3x3是旋转矩阵RRR,右上角的3x1向量是平移向量TTT。

      [RT01]=[r11r12r13t1r21r22r23t2r31r32r33t30001]\left[ \begin{array}{l} R&T\\ 0&1 \end{array} \right] = \left[ \begin{array}{l} r_{11}&r_{12}&r_{13}&t_1\\ r_{21}&r_{22}&r_{23}&t_2\\ r_{31}&r_{32}&r_{33}&t_3\\ 0&0&0&1 \end{array} \right] [R0​T1​]=⎣⎢⎢⎢⎡​r11​r21​r31​0​r12​r22​r32​0​r13​r23​r33​0​t1​t2​t3​1​⎦⎥⎥⎥⎤​

      有时写的时候可以忽略最后一行[0,0,0,1][0,0,0,1][0,0,0,1]。

      [RT]=[r11r12r13t1r21r22r23t2r31r32r33t3]\left[ \begin{array}{l} R&T\\ \end{array} \right] = \left[ \begin{array}{l} r_{11}&r_{12}&r_{13}&t_1\\ r_{21}&r_{22}&r_{23}&t_2\\ r_{31}&r_{32}&r_{33}&t_3\\ \end{array} \right] [R​T​]=⎣⎢⎡​r11​r21​r31​​r12​r22​r32​​r13​r23​r33​​t1​t2​t3​​⎦⎥⎤​

      刚刚接触的时候,对这个c2w矩阵的值可能会比较陌生。其实c2w矩阵的值直接描述了相机坐标系的朝向和原点:

      具体的,旋转矩阵的第一列到第三列分别表示了相机坐标系的X, Y, Z轴在世界坐标系下对应的方向;平移向量表示的是相机原点在世界坐标系的对应位置。

      如果这段描述还是有点抽象,可以尝试进行下列计算帮助自己理解。刚刚讲到c2w是将相机坐标系的向量变换到世界坐标系下,那我们如果将c2w作用到(即左乘)相机坐标系下的X轴[1,0,0,0],Y轴[0,1,0,0], Z轴[0,0,1,0],以及原点[0,0,0,1](注意方向向量的齐次坐标第四维等于0,点坐标第四维等于1),我们会得到它们在世界坐标系的坐标表示:

      [RT][1000]=[r11r21r31]\begin{aligned} \left[\begin{array}{l}R&T\end{array}\right] \left[ \begin{array}{l} 1\\ 0\\ 0\\ 0\\ \end{array} \right] = \left[ \begin{array}{l} r_{11}\\ r_{21}\\ r_{31}\\ \end{array} \right] \end{aligned} [R​T​]⎣⎢⎢⎢⎡​1000​⎦⎥⎥⎥⎤​=⎣⎢⎡​r11​r21​r31​​⎦⎥⎤​​

      [RT][0100]=[r12r22r32]\begin{aligned} \left[\begin{array}{l}R&T\end{array}\right] \left[ \begin{array}{l} 0\\ 1\\ 0\\ 0\\ \end{array} \right] = \left[ \begin{array}{l} r_{12}\\ r_{22}\\ r_{32}\\ \end{array} \right] \end{aligned} [R​T​]⎣⎢⎢⎢⎡​0100​⎦⎥⎥⎥⎤​=⎣⎢⎡​r12​r22​r32​​⎦⎥⎤​​

      [RT][0010]=[r13r23r33]\begin{aligned} \left[\begin{array}{l}R&T\end{array}\right] \left[ \begin{array}{l} 0\\ 0\\ 1\\ 0\\ \end{array} \right] = \left[ \begin{array}{l} r_{13}\\ r_{23}\\ r_{33}\\ \end{array} \right] \end{aligned} [R​T​]⎣⎢⎢⎢⎡​0010​⎦⎥⎥⎥⎤​=⎣⎢⎡​r13​r23​r33​​⎦⎥⎤​​

      [RT][0001]=[t1t2t3]\begin{aligned} \left[\begin{array}{l}R&T\end{array}\right] \left[ \begin{array}{l} 0\\ 0\\ 0\\ 1\\ \end{array} \right] = \left[ \begin{array}{l} t_{1}\\ t_{2}\\ t_{3}\\ \end{array} \right] \end{aligned} [R​T​]⎣⎢⎢⎢⎡​0001​⎦⎥⎥⎥⎤​=⎣⎢⎡​t1​t2​t3​​⎦⎥⎤​​

      从上面可以看到可以看到,将c2w作用到相机坐标系下的X轴、Y轴、 Z轴、以及原点我们会依次得到c2w的四列向量。

      # 相机内参

      刚刚介绍了相机的外参,现在简单介绍一下相机的内参。

      相机的内参矩阵将相机坐标系下的3D坐标映射到2D的图像平面,这里以针孔相机(Pinhole camera)为例介绍相机的内参矩阵KKK:

      K=[fx0cx0fycy001]K= \left[ \begin{array}{l} f_x&0&c_x\\ 0&f_y&c_y\\ 0&0&1 \end{array} \right] K=⎣⎢⎡​fx​00​0fy​0​cx​cy​1​⎦⎥⎤​

      内参矩阵KKK包含4个值,其中fxf_xfx​和fyf_yfy​是相机的水平和垂直焦距(对于理想的针孔相机,fx=fyf_x=f_yfx​=fy​)。焦距的物理含义是相机中心到成像平面的距离,长度以像素为单位。cxc_xcx​和cyc_ycy​是图像原点相对于相机光心的水平和垂直偏移量。cxc_xcx​,cyc_ycy​有时候可以用图像宽和高的1/21/21/2近似:

      #  NeRF run_nerf.py有这么一段构造K的代码
          if K is None:
              K = np.array([
                  [focal, 0, 0.5*W],
                  [0, focal, 0.5*H],
                  [0, 0, 1]
              ])
      
      1
      2
      3
      4
      5
      6
      7
      帮助我们改善此页面!
      创建于: 2023-09-11 00:03:51

      更新于: 2023-09-11 00:03:51