视觉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保持一致
相关推荐
古希腊掌握嵌入式的神1 天前
[ROS]ROS系统是如何协调工作机器人
机器人·ros
慕羽★7 天前
多无人车协同探索开源包启动文件介绍(上)
机器人·ros·gazebo·运动规划·rrt·多无人车·协同探索
Mr.Winter`14 天前
轨迹优化 | 基于梯度下降的路径规划算法(附ROS C++/Python仿真)
c++·人工智能·算法·机器人·自动驾驶·ros·ros2
白云千载尽19 天前
开源的自动驾驶视觉语言模型标注数据集
算法·机器学习·自动驾驶·ros
PNP机器人21 天前
Franka机器人ROS 2 发布:赋能机器人研究和行业应用
人工智能·深度学习·机器人·ros·franka fr3
小仇学长22 天前
ROS实践一构建Gazebo机器人模型文件urdf
机器人·ros
Mr.Winter`1 个月前
深度强化学习 | 详解过估计现象与Double DQN算法(附Pytorch实现)
人工智能·pytorch·深度学习·神经网络·自动驾驶·ros·强化学习
点云SLAM1 个月前
卡尔曼滤波算法(Kalman Filter, KF)深入推导
人工智能·算法·slam·状态估计·滤波器·卡尔曼滤波算法
白云千载尽1 个月前
端到端自动驾驶——cnn网络搭建
人工智能·神经网络·算法·机器学习·cnn·自动驾驶·ros
是阿牛啊1 个月前
【ubuntu20安装usv_sim_lsa (无人水面航行器模拟环境) - v0.3】
ubuntu·ros·osg·usv_sim