相机径向畸变和切向畸变_VIO标定(二)广角相机模型

1. 广角相机成像原理

广角相机成像步骤与普通相机基本一致, 主要的区别在于镜头聚光的部分, 广角相机为了获得更大的FOV, 有三种镜头聚光方式:

  1. Dioptric cameras: 通过透镜来实现, 主要是折射
  2. Catadioptric cameras: 使用一个标准相机加一个面镜(Shaped mirror)
  3. Polydioptric camera: 通过多个相机重叠视野

c982876cf332b491c9d741b23f01f318.png

广角相机引入了很多模型, 为了防止混乱, 我们先总结一下, 我们通常会讨论两种模型: 相机模型和畸变模型.

2. 相机模型

相机模型指的是相机坐标系到理想图像平面(通常也称为Normalize 平面)的投影模型. 设相机坐标系下的点为

, 投影到normalize平面的点为
, 相机模型是指:

注意: 广义上相机模型包括投影成像, 畸变, 内外参等全部模型, 这里讨论的相机模型仅指的透镜/面镜的投影模型.

2.1 针孔相机模型(Pinhole)

针孔相机模型利用透镜进行聚光成像的相机使用的模型, 该模型非常简单:

2.2 全向模型(Omnidirectional)

全向模型利用面镜(mirror)反射进行成像的相机使用的模型. 该模型带有一个参数

.

首先将相机坐标系的点归一化到半径为1的球面上:

然后再投影到图像平面上

其逆变换推导出来如下:

最后,注意下当

时, 全向模型就退化为了针孔模型.

3. 畸变模型

畸变模型指的理想图像平面到真实图像平面的变换模型, 也就是Normalize平面上的畸变模型.

理想的针孔成像模型确定的坐标变换关系均为线性的,而实际上,现实中使用的相机由于镜头中镜片因为光线的通过产生的不规则的折射,镜头畸变(lens distortion)总是存在的,即根据理想针孔成像模型计算出来的像点坐标与实际坐标存在偏差。

3.1 radtan畸变模型

普通相机畸变通常包括径向畸变和切向畸变, 如下图所示.

f96c4b69c7ba2ba23d054545f80bd666.png

径向畸变表式沿半径方向的偏移量, 径向畸变的形成原因是镜头制造工艺不完美,使得镜头形状存在缺陷, 通常又分为桶性畸变和枕形畸变, 分别代表

往外偏和往里偏.

eb18f39e92322fa4c24a7a33ebc935e2.png

径向畸变的数学转换为:

切向畸变又分为薄透镜畸变和离心畸变等,薄透镜畸变则是因为透镜存在一定的细微倾斜造成的;离心畸变的形成原因是镜头是由多个透镜组合而成的,而各个透镜的光轴不在同一条中心线上。切向畸变可以用如下数学表达式来描述:

结合径向和切向畸变, 像平面点的转换关系为:

这就是OpenCV calibration使用的畸变模型, 由于参数过多导致数值求解不稳定, 通常只使用

, 其他参数设为0. 简化后的模型就是常用的radtan畸变模型:

3.2 鱼眼畸变模型

鱼眼镜头的畸变模型有很多种:

3ba90c424d56f4c7982f08f008cdf9b4.png

其中使用最多的是Equidistant模型, 即

, 对实际的鱼眼镜头来说,它们不可能精确地按照投影模型来设计,所以为了方便鱼眼相机的标定,Kannala提出了一种鱼眼相机的一般多项式近似模型。通过前面的四个模型,可以发现
的奇函数,而且将这些式子按泰勒级数展开,发现
可以用
的奇次多项式表示,即

畸变投影模型为:

opencv中的fisheye::calibrate就是用的该畸变模型. 也叫作kannala-brandt模型.

3.3 FOV畸变模型

FOV畸变模型转换关系如下:

4. Unified Projection Model

在鱼眼相机中通常会看到Unified Projection Model或者MEI model, 其实就是Omnidirectional相机模型+radtan畸变模型. 前面提到了Omnidirectional模型涵盖了Pinhole模型, 所以MEI model可以表示鱼眼和非鱼眼相机.

c7e2631a9797939e735b93781efa0d7b.png

参考:

  1. https://blog.youkuaiyun.com/u011178262/article/details/86656153
  2. https://blog.youkuaiyun.com/okasy/article/details/90665534#fn4
  3. https://zhuanlan.zhihu.com/p/23090593
  4. https://blog.youkuaiyun.com/u010128736/article/details/52864024
  5. Kannala J, Brandt S S. A Generic Camera Model and Calibration Method for Conventional, Wide-Angle, and Fish-Eye Lenses[M]. 2006.
  6. Mei C, Rives P. Single view point omnidirectional camera calibration from planar grids[C]//Proceedings 2007 IEEE International Conference on Robotics and Automation. IEEE, 2007: 3945-3950.
  7. Kneip L, Scaramuzza D, Siegwart R. A novel parametrization of the perspective-three-point problem for a direct computation of absolute camera position and orientation[C]//CVPR 2011. IEEE, 2011: 2969-2976.
<think>嗯,用户问的是关于相机标定需要写入哪些参数的问题。首先,我需要回忆一下相机标定的基本知识。相机标定主要是为了确定相机的内部参数外部参数,这样可以将三维世界中的点映射到维图像上。内部参数包括焦距、主点坐标、畸变系数这些,而外部参数则是相机的位置方向,相对于某个世界坐标系。 用户可能是在进行计算机视觉项目,比如三维重建、机器人导航或者增强现实应用,这时候准确的标定参数非常重要。他们可能遇到了图像畸变或者测量不准确的问题,所以想知道哪些参数必须写入相机或者配置文件里,以确保后续处理的正确性。 接下来要考虑用户可能的身份。可能是学生、研究人员或者工程师,对相机标定有一定了解,但需要更详细的参数列表应用场景。他们可能已经使用过OpenCV、MATLAB的相机标定工具或者ROS中的相关包,但不确定具体哪些参数需要保存下来。 需要区分内部参数外部参数,内部参数是相机固有的,而外部参数会根据相机的位置变化而变化。所以用户可能需要知道哪些参数是每次标定后都需要保存的,哪些是安装后固定不变的。例如,内部参数一旦标定,只要镜头不变,就可以重复使用,而外部参数可能需要根据不同的安装位置重新标定。 然后需要具体列出各个参数,比如焦距fx、fy,主点坐标cx、cy,这些是内参矩阵的重要组成部分。畸变系数也是关键,尤其是径向畸变切向畸变参数,用于校正图像变形。另外,像传感器尺寸、像素尺寸、分辨率这些可能在某些应用中也需记录,尤其是当需要物理尺寸测量时。 还要考虑不同相机模型,比如是否使用鱼眼镜头,这时候畸变模型可能不同,参数也会有所变化。用户可能需要知道标定工具输出的不同参数对应的模型,比如OpenCV中有不同的畸变模型,如plumb_bob或rational_polynomial。 此外,外部参数中的旋转矩阵平移向量是否需要保存,可能取决于应用场景。如果是多相机系统,或者需要将相机坐标系转换到世界坐标系,这些参数就很重要。但如果是单相机应用,可能外部参数不需要长期保存,每次安装后重新标定即可。 还要注意参数的单位,比如焦距是以像素为单位还是物理单位(如毫米),这会影响后续的计算。确保用户了解参数的具体含义单位,避免使用时出现错误。 最后,可能需要提醒用户标定时的注意事项,比如使用高质量的标定板、覆盖整个视野、不同角度距离的图片采集,以及如何验证标定结果的准确性,比如重投影误差等。这些虽然不是参数本身,但影响标定参数的质量。 总结下来,需要明确列出需要写入相机标定参数,解释每个参数的意义,并给出应用场景注意事项,帮助用户正确理解使用这些参数。</think>相机标定参数可分为内参(Intrinsic Parameters)外参(Extrinsic Parameters),以下是需要写入配置文件的核心参数及其技术细节: --- ### **一、内参矩阵(Intrinsic Matrix)** $$ K = \begin{bmatrix} f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} $$ - **$f_x, f_y$**:x/y方向等效焦距(像素单位),反映传感器与镜头的比例关系 - **$c_x, c_y$**:主点坐标(图像中心偏移量),单位像素 - **$s$**:轴间倾斜因子(现代相机通常为0) --- ### **、畸变系数(Distortion Coefficients)** #### 1. Brown-Conrady模型(OpenCV默认) ```python # OpenCV格式:[k1,k2,p1,p2,k3] dist_coeffs = [-0.25, 0.03, 0.001, -0.002, 0.15] ``` - **径向畸变**:$k_1, k_2, k_3$(桶形/枕形失真修正) - **切向畸变**:$p_1, p_2$(镜头安装误差修正) #### 2. Kannala-Brandt鱼眼模型 $$ \theta_d = \theta (1 + k_1 \theta^2 + k_2 \theta^4 + k_3 \theta^6 + k_4 \theta^8) $$ 适用于广角镜头(如180° FOV) --- ### **三、外参矩阵(Extrinsic Parameters)** $$ \begin{cases} R &: 3\times3\ 旋转矩阵 \\ t &: 3\times1\ 平移向量 \end{cases} $$ 描述相机坐标系到世界坐标系的变换: $$ X_{world} = R \cdot X_{cam} + t $$ --- ### **四、传感器物理参数** | 参数名称 | 典型值 | 单位 | |-------------------|---------------------|--------| | 像素尺寸 | 3.45μm × 3.45μm | 毫米 | | 传感器尺寸 | 1/2.3" (6.17×4.55mm)| 毫米 | | 分辨率 | 1920×1080 | 像素 | --- ### **五、标定验证参数** - **重投影误差**:RMS误差应 < 0.5像素(优秀标定) - **有效标定区域**:例如`validPixROI = (x,y,width,height)` --- ### **六、特殊参数** 1. **双目相机**: - 基线距离 $B$(毫米) - 极线约束矩阵 $F$ 2. **RGB-D相机**: - 深度标定表(Depth LUT) - 深度-彩色对齐参数 --- ### **参数存储格式示例** ```yaml # YAML格式示例(ROS标准) image_width: 640 image_height: 480 camera_matrix: rows: 3 cols: 3 data: [615.3, 0, 319.5, 0, 615.8, 239.5, 0, 0, 1] distortion_model: plumb_bob distortion_coefficients: rows: 1 cols: 5 data: [-0.15, 0.02, 0.001, -0.003, 0.0] rectification_matrix: # 单目相机通常为单位矩阵 rows: 3 cols: 3 data: [1,0,0, 0,1,0, 0,0,1] projection_matrix: # 用于三维重建 rows: 3 cols: 4 data: [615.3,0,319.5,0, 0,615.8,239.5,0, 0,0,1,0] ``` --- ### **选择建议** - **工业检测**:必须记录内参+畸变参数 - **SLAM/VIO**:需额外保存IMU-相机外参 - **多相机系统**:需存储各相机间的外参变换链 - **热像仪**:需包含非均匀性校正(NUC)参数 标定参数的有效性需定期验证(推荐使用AprilTag标定板),当镜头对焦改变或机械冲击后必须重新标定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值