视觉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 小时前
ROS2测试仿真
机器人·ros·slam
Mr.Winter`15 小时前
轨迹优化 | 基于ESDF的非线性最小二乘法路径平滑(附ROS C++仿真)
人工智能·科技·机器人·自动驾驶·ros·最小二乘法·ros2
kuan_li_lyg2 天前
ROS2 与机器人视觉入门教程(ROS2 OpenCV)
开发语言·人工智能·opencv·计算机视觉·matlab·机器人·ros
两棵雪松5 天前
为什么使用ROS的remap标签不起作用?
ros
加点油。。。。6 天前
ubuntu22.4 ROS2 安装gazebo(环境变量配置)
linux·python·ubuntu·ros
点云SLAM8 天前
CVPR 2024 自动驾驶方向总汇
人工智能·计算机视觉·自动驾驶·slam·cvpr·cvpr 2024·道路检测
Mr.Winter`8 天前
轨迹优化 | 基于贝塞尔曲线的无约束路径平滑与粗轨迹生成(附ROS C++/Python仿真)
人工智能·机器人·自动驾驶·ros·几何学·ros2·轨迹优化
worthsen9 天前
ROS1 与 ROS2 使用区别 【命令】
机器人·ros
Mr.Winter`16 天前
无人船 | 图解推导三自由度USV的运动学和动力学建模
人工智能·机器人·ros·无人船
chinamaoge20 天前
ROS2软件架构全面解析-学习如何设计通信中间件框架
ros·ros2·通信中间件