opencv和matlab中相机内参标定模型

OpenCV和MATLAB都提供了强大的相机标定工具,但它们在模型细节、默认设置和适用场景上存在显著差异。总的来说,两者的基础模型相似,但在具体实现和高级模型(如鱼眼相机)上有所不同,直接混用标定结果可能导致误差。

以下将分别详细说明针孔相机模型和鱼眼相机模型在OpenCV与MATLAB中的具体情况。

一、 针孔相机模型

针孔模型是描述相机成像最基础的模型。OpenCV和MATLAB都以此为基础,但在畸变模型的选择和参数排列上有所不同。

1. OpenCV 中的针孔模型

OpenCV的标定功能(如 cv2.calibrateCamera)使用一个非常经典的模型,包含内参和畸变参数。

  • 内参矩阵(Intrinsic Matrix): 与标准模型一致,包含焦距(fx, fy)和主点(cx, cy)。

    复制代码
    [fx, 0, cx]
    [0, fy, cy]
    [0,  0,  1]
  • 畸变系数(Distortion Coefficients) : 这是与MATLAB的主要区别之一。OpenCV默认使用 Plumb Bob 模型(即 Brown-Conrady 模型) ​ 的变体,包含径向畸变和切向畸变参数。畸变系数通常以一个向量 (k1, k2, p1, p2, k3, ...)给出。

    • 径向畸变(k1, k2, k3): 校正图像点沿镜头径向的扭曲(如桶形或枕形畸变)。

    • 切向畸变(p1, p2): 校正由于镜头制造缺陷导致与成像平面不平行而产生的畸变。

2. MATLAB 中的针孔模型

MATLAB的相机标定器(Camera Calibrator App)和 cameraParameters对象也基于针孔模型,但提供了更多的模型选项。

  • 内参矩阵: 与OpenCV和标准模型完全相同。

  • 畸变模型 : MATLAB提供了两种主要的畸变模型供用户选择,这是其灵活性的体现:

    1. 'Brown'模型: 这与OpenCV使用的模型基本相同,包含三阶径向畸变(k1, k2, k3)和两阶切向畸变(p1, p2)。这是最常用的模型。

    2. 'Skew'模型 : 在'Brown'模型的基础上,增加了**轴倾斜(Skew)**​ 参数。这个参数可以补偿图像坐标轴不垂直的情况(在现代数字相机中很少见)。

针孔模型小结

  • 共性: 两者内参矩阵核心一致,且都支持包含径向和切向畸变的经典物理模型。

  • 差异 : OpenCV默认使用固定的畸变模型(Plumb Bob),而MATLAB允许用户在标定时选择更基础的'Brown'模型或更复杂的'Skew'模型。因此,如果使用相同的图像集,选择MATLAB的'Brown'模型与OpenCV标定得到的结果应该是非常接近的,但参数顺序可能不同,不能直接拷贝使用。

二、 鱼眼相机模型

当相机视场角(FOV)很大(例如超过120度)时,针孔模型配合径向和切向畸变的组合可能无法准确描述成像几何。这时就需要使用鱼眼相机模型。

1. OpenCV 中的鱼眼相机模型

OpenCV为鱼眼相机提供了专门的标定函数(如 cv2.fisheye.calibrate),它采用一个不同的、更适用于大畸变镜头的模型 ,通常是基于等距投影模型或其变体。

  • 模型特点 : 鱼眼模型使用一个不同的映射函数,将入射角(θ)与像点距光心的距离(r)直接关联,例如等距投影模型为 r = f * θ。这个模型用少数几个参数(通常是k1, k2, k3, k4)就能有效地描述鱼眼镜头的超大畸变。

  • 优势 : 对于超广角镜头,这个模型比试图用针孔模型的畸变系数去拟合大量畸变更为准确和稳定

  • 参数 : OpenCV的鱼眼标定返回的畸变系数通常是 (k1, k2, k3, k4),专门用于鱼眼投影。

2. MATLAB 中的鱼眼相机模型

MATLAB同样提供了强大的鱼眼相机标定支持,其模型更为通用和灵活。

  • 模型特点 : MATLAB主要采用 Kannala-Brandt 模型 。这是一个通用的鱼眼相机模型,它将多种经典投影模型(如等距、等立体角、正交等)统一在一个框架下。该模型通过奇次多项式将入射角θ与像高r关联:r(θ) = k1 * θ + k2 * θ^3 + k3 * θ^5 + ...

  • 优势: Kannala-Brandt模型非常灵活,能够描述各种类型的鱼眼镜头,精度很高。它同时包含了径向和离心(类似于切向)畸变。

  • 参数: 标定后返回的是一组Kannala-Brandt模型参数。

鱼眼模型小结

  • 根本区别 : OpenCV和MATLAB在鱼眼标定上使用了完全不同的数学模型。OpenCV采用基于经典投影(如等距)的模型,而MATLAB采用更通用的多项式模型(Kannala-Brandt)。

  • 结果 : 两种模型都能很好地处理鱼眼畸变,但由于模型基础不同,它们的标定参数完全不能互换。选择哪种取决于具体需求和使用习惯。

总结对比

特性 OpenCV MATLAB
针孔模型 使用固定的 Plumb Bob (Brown-Conrady) 模型,包含径向(k1,k2,k3)和切向(p1,p2)畸变。 提供可选模型:'Brown'(同OpenCV)和带轴倾斜的'Skew'模型。
鱼眼模型 使用基于等距投影等的专用鱼眼模型,畸变系数为(k1,k2,k3,k4)。 使用通用的 Kannala-Brandt 多项式模型,灵活性更高。
主要差异 模型固定,API直接,广泛应用于实际项目和嵌入式部署。 模型选择灵活,更适合研究和算法验证,与Simulink等工具链集成好。
互操作性 标定结果不能直接互换使用。必须理解模型差异,并通过重投影或模型转换来衔接。

给您的建议

在选择工具时,请考虑您的最终应用场景。如果您的研究和算法最终要在OpenCV环境中部署,建议直接使用OpenCV进行标定以确保一致性。如果您专注于算法研究和快速验证,MATLAB的标定器非常直观高效。无论如何,最重要的是在整个项目周期内保持标定工具和模型的一致性

相关推荐
CNU-ZQQ4 小时前
opencv Cmake CUDA问题
人工智能·opencv·计算机视觉
hoiii18714 小时前
MATLAB实现Canny边缘检测算法
算法·计算机视觉·matlab
fie888914 小时前
波束赋形MATLAB代码实现
开发语言·matlab
yong999017 小时前
水箱水位控制系统MATLAB实现
开发语言·matlab
chao18984420 小时前
MATLAB中的多重网格算法与计算流体动力学
开发语言·算法·matlab
小白狮ww21 小时前
Matlab 教程:基于 RFUAV 系统使用 Matlab 处理无人机信号
开发语言·人工智能·深度学习·机器学习·matlab·无人机·rfuav
listhi5201 天前
机械系统运动学与动力学在MATLAB及SimMechanics中的实现方案
人工智能·算法·matlab
gihigo19981 天前
MATLAB中进行综合孔径微波辐射成像仿真
开发语言·matlab
步达硬件1 天前
【matlab】代码库-双线性插值
开发语言·matlab