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

简介

相机是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} K−1, 就可以将其转换为空间坐标。但要注意,此时的空间坐标是以 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=K−1Zu,vP2D=K−1Zu,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\times 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。

python 复制代码
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矫正畸变接口中,设定输出的内参参数,一般与矫正畸变前保持一致。
python 复制代码
cv2.undistort(img, camera_matrix, K, K) #K.保持一致
cv2.initUndistortRectifyMap(K, D, R, K, (w,h), mapx, mapy) #K保持一致
相关推荐
智驾机器人技术前线16 小时前
近期两篇NeRF/3DGS-based SLAM方案赏析:TS-SLAM and MBA-SLAM
3d·slam·nerf·3dgs
mjlsuccess2 天前
红外相机和RGB相机外参标定 - 无需标定板方案
相机标定·红外和可见光相机标定·thermal和rgb相机标定
Mr.Winter`3 天前
轨迹优化 | 基于Savitzky-Golay滤波的无约束路径平滑(附ROS C++/Python仿真)
人工智能·算法·机器人·自动驾驶·ros·ros2·数值优化
CA7274 天前
【视觉SLAM】2-三维空间刚体运动的数学表示
slam·三维旋转·四元数
huanggang9824 天前
在Ubuntu22.04上源码构建ROS noetic环境
ros·ubuntu 22.04
找不着地窖的皮险家5 天前
ROS Action
c++·机器人·ros
CA7276 天前
【视觉SLAM】4b-特征点法估计相机运动之PnP 3D-2D
slam
大山同学6 天前
RA-L开源:Light-LOAM: 基于图匹配的轻量级激光雷达里程计和地图构建
语言模型·机器人·去中心化·slam·感知定位
大山同学7 天前
DPGO:异步和并行分布式位姿图优化 2020 RA-L best paper
人工智能·分布式·语言模型·去中心化·slam·感知定位
OAK中国_官方8 天前
OAK相机:纯视觉SLAM在夜晚的应用
人工智能·机器学习·slam