Matlab相机标定

matlab 相机标定代码 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵的过程。 [1]基本的坐标系: 世界坐标系; 相机坐标系; 成像平面坐标系; 像素坐标系 [2]一般来说,标定的过程分为两个部分: 第一步是从世界坐标系转为相机坐标系,这一步是三维点到三维点的转换,包括R,t(相机外参,确定了相机在某个三维空间中的位置和朝向)等参数; 第二部是从相机坐标系转为成像平面坐标系(像素坐标系),这一步是三维点到二维点的转换,包括K(相机内参,是对相机物理特性的近似)等参数; 投影矩阵 : P=K [ R | t ] 是一个3×4矩阵,混合了内参和外参而成。 P=K[Rt] 二.基本知识介绍及 1、摄像机模型 Pinhole Camera模型如下图所示: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 是一个小孔成像的模型,其中: [1]O点表示camera centre,即相机的中心点,也是相机坐标系的中心点; [2]z轴表示principal axis,即相机的主轴; [3]q点所在的平面表示image plane,即相机的像平面,也就是图片坐标系所在的二维平面; [4]O1点表示principal point,即主点,主轴与像平面相交的点; [5]O点到O1点的距离,也就是右边图中的f,即相机的焦距; [6]像平面上的x和y坐标轴是与相机坐标系上的X和Y坐标轴互相平行的; [7]相机坐标系是以X,Y,Z(大写)三个轴组成的且原点在O点,度量值为米(m); [8]像平面坐标系是以x,y(小写)两个轴组成的且原点在O1点,度量值为米(m); [9]像素坐标系一般指图片相对坐标系,在这里可以认为和像平面坐标系在一个平面上,不过原点是在图片的角上,而且度量值为像素的个数(pixel); 2、相机坐标系→成像平面坐标系 [1]以O点为原点建立摄像机坐标系。点Q(X,Y,Z)为摄像机坐标系空间中的一点,该点被光线投影到图像平面上的q(x,y,f)点。 图像平面与光轴z轴垂直,和投影中心距离为f (f是相机的焦距)。按照三角比例关系可以得出: x/f = X/Z y/f = Y/Z ,即 x = fX/Z y = fY/Z 以图像平面的左上角或左下角为原点建立坐标系。假设像平面坐标系原点位于图像左下角,水平向右为u轴,垂直向上为v轴,均以像素为单位。 以图像平面与光轴的交点O1 为原点建立坐标系,水平向右为x轴,垂直向上为y轴。原点O1一般位于图像中心处,O1在以像素为单位的图像坐标系中的坐标为(u0, v0)。 像平面坐标系和像素坐标系虽然在同一个平面上,但是原点并不是同一个。 摄像机模型与标定 - 小企鹅 - 企鹅的博客 设每个像素的物理尺寸大小为 dx * dy (mm) ( 由于单个像素点投影在图像平面上是矩形而不是正方形,因此可能dx != dy), 图像平面上某点在成像平面坐标系中的坐标为(x, y),在像素坐标系中的坐标为(u, v),则二者满足如下关系:[即(x, y)→(u, v)] u = x / dx + u0 v = y / dy + v0 用齐次坐标与矩阵形式表示为: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 将等式两边都乘以点Q(X,Y,Z)坐标中的Z可得: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 将摄像机坐标系中的(1)式代入上式可得: 则右边第一个矩阵和第二个矩阵的乘积亦为摄像机的内参数矩阵(单位为像素),相乘后可得: (2) 和(1)式相比,此内参数矩阵中f/dx, f/dy, cx/dx+u0, cy/dy+v0 的单位均为像素。令内参数矩阵为K,则上式可写成: 摄像机模型与标定 - 小企鹅 - 企鹅的博客 (3) 三.相机内参K(与棋盘所在空间的3D几何相关) 在计算机视觉中,摄像机内参数矩阵 其中 f 为摄像机的焦距,单位一般是mm;dx,dy 为像元尺寸;u0,v0 为图像中心。 fx = f/dx, fy = f/dy,分别称为x轴和y轴上的归一化焦距. 为更好的理解,举个实例: 现以NiKon D700相机为例进行求解其内参数矩阵: 就算大家身边没有这款相机也无所谓,可以在网上百度一下,很方便的就知道其一些参数—— 焦距 f = 35mm 最高分辨率:4256×2832 传感器尺寸:36.0×23.9 mm 根据以上定义可以有: u0= 4256/2 = 2128 v0= 2832/2 = 1416 dx = 36.0/4256 dy = 23.9/2832 fx = f/dx = 4137.8 fy = f/dy = 4147.3 分辨率可以从显示分辨率与图像分辨率两个方向来分类。 [1]显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的, 显示器可显示的像素越多,画面就越精细,同样的屏幕区域内能显示的信息也越多,所以分辨率是个非常重要的性能指标之一。 可以把整个图像想象成是一个大型的棋盘,而分辨率的表示方式就是所有经线和纬线交叉点的数目。 显示分辨率一定的情况下,显示屏越小图像越清晰,反之,显示屏大小固定时,显示分辨率越高图像越清晰。 [2]图像分辨率则是单位英寸中所包含的像素点数,其定义更趋近于分辨率本身的定义。 四.畸变参数(与点集如何畸变的2D几何相关。) 采用理想针孔模型,由于通过针孔的光线少,摄像机曝光太慢,在实际使用中均采用透镜,可以使图像生成迅速,但代价是引入了畸变。 有两种畸变对投影图像影响较大: 径向畸变和切向畸变。 1、径向畸变 对某些透镜,光线在远离透镜中心的地方比靠近中心的地方更加弯曲,产生“筒形”或“鱼眼”现象,称为径向畸变。 一般来讲,成像仪中心的径向畸变为0,越向边缘移动,畸变越严重。不过径向畸变可以通过下面的泰勒级数展开式来校正: xcorrected = x(1+k1r2+k2r4+k3r6) ycorrected = y(1+k1r2+k2r4+k3r6) 这里(x, y)是畸变点在成像仪上的原始位置,r为该点距离成像仪中心的距离,(xcorrected ,ycorrected )是校正后的新位置。 对于一般的摄像机校正,通常使用泰勒级数中的前两项k1和k2就够了;对畸变很大的摄像机,比如鱼眼透镜,可以使用第三径向畸变项k3 2、切向畸变 当成像仪被粘贴在摄像机的时候,会存在一定的误差,使得图像平面和透镜不完全平行,从而产生切向畸变。也就是说,如果一个矩形被投影到成像仪上时, 可能会变成一个梯形。切向畸变可以通过如下公式来校正: xcorrected = x + [ 2p1y + p2 (r2 + 2x2) ] ycorrected = y + [ 2p2x + p1 (r2 + 2y2) ] 这里(x, y)是畸变点在成像仪上的原始位置,r为该点距离成像仪中心的距离,(xcorrected ,ycorrected )是校正后的新位置。 五.摄像机的外参数 旋转向量(大小为1×3的矢量或旋转矩阵3×3)和平移向量(tx,ty,tz)。 旋转向量:旋转向量是旋转矩阵紧凑的变现形式,旋转向量为1×3的行矢量。 r就是旋转向量,旋转向量的方向是旋转轴 ,旋转向量的模为围绕旋转轴旋转的角度。 通过上面的公式,我们就可以求解出旋转矩阵R。同样的已知旋转矩阵,我们也可以通过下面的公式求解得到旋转向量: 。
<think>好的,我现在需要帮用户解决在MATLAB中进行相机标定的问题,用户提到了使用Camera Calibration Toolbox。首先,我需要回忆一下MATLAB相机标定的步骤和相关函数。根据用户提供的引用,特别是引用[^1]和[^2],其中提到2005年的基于MATLAB的图形界面工具,可能是指经典的Camera Calibration Toolbox,可能由Bouguet开发的那个。 首先,用户需要教程和函数的使用方法。我应该分步骤说明如何使用这个工具箱,从准备标定板到运行标定过程,再到导出参数。同时,要确保提到的函数如detectCheckerboardPoints、estimateCameraParameters等正确无误。要注意MATLAB版本问题,可能新版中Camera Calibrator App更常用,但用户可能指的是传统的工具箱。 然后,用户可能遇到的问题包括标定板检测不准确、参数优化问题,需要给出解决建议。例如,标定图像数量、光照条件等。另外,引用[^2]中提到的LCC系列可能涉及激光雷达和相机的联合标定,但用户目前只问相机标定,可能需要简要提及后续扩展,但重点放在相机标定上。 需要检查步骤是否正确,比如启动工具箱的方式,是否通过命令行输入或App。另外,生成的参数如何保存和应用。可能还需要提到相关的函数,比如生成标定后的图像矫正使用undistortImage函数。 最后,生成相关问题需要考虑用户可能的后续需求,比如标定结果的应用、与其他传感器的联合标定,以及标定精度评估等。确保问题与用户当前的问题相关,并引导深入学习。</think>### MATLAB相机标定教程及函数详解 #### 一、标定前准备 1. **标定板选择** 建议使用棋盘格标定板(Checkerboard),尺寸需满足MATLAB检测要求(例如至少4×4角点)。标定板需覆盖图像不同区域(边缘、中心、倾斜角度)以提高精度。 2. **图像采集** - 拍摄15-30张不同位姿的标定板图像(覆盖不同距离、旋转角度) - 确保图像清晰无模糊,光照均匀无强烈反光 - 图像分辨率建议不低于1280×720 #### 二、使用Camera Calibrator App(推荐) 1. **启动工具** ```matlab % 命令行输入以下命令启动图形界面 cameraCalibrator ``` 2. **操作流程** | 步骤 | 操作 | 参数说明 | |------|------|----------| | 1 | 导入图像 | 选择标定板类型(默认棋盘格) | | 2 | 输入标定板尺寸 | 填写棋盘格实际物理尺寸(单位:mm/m) | | 3 | 自动检测角点 | 失败时可手动调整 | | 4 | 剔除误差大的图像 | 删除重投影误差>0.5像素的图片 | | 5 | 计算参数 | 勾选径向畸变(k1,k2)和切向畸变(p1,p2) | ![标定界面示意图](https://www.mathworks.com/help/vision/ug/camera_calibrator_app_zh_CN.png) 3. **关键函数** - `detectCheckerboardPoints()`:自动检测棋盘格角点 - `estimateCameraParameters()`:计算内参/外参 - `showReprojectionErrors()`:显示标定误差分布 - `undistortImage()`:应用畸变校正 #### 三、代码实现(传统方法) ```matlab % 1. 读取图像集 imageDir = fullfile(toolboxdir('vision'),'visiondata','calibration','mono'); images = imageDatastore(imageDir); % 2. 检测角点 [imagePoints,boardSize] = detectCheckerboardPoints(images.Files); % 3. 生成世界坐标 squareSize = 25; % 单位:mm worldPoints = generateCheckerboardPoints(boardSize,squareSize); % 4. 标定计算 params = estimateCameraParameters(imagePoints,worldPoints); % 5. 结果可视化 showReprojectionErrors(params); figure; showExtrinsics(params); ``` #### 四、关键参数说明 $$ \begin{align*} \text{内参矩阵} & : K = \begin{bmatrix} f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \\ \text{畸变系数} & : [k_1,k_2,p_1,p_2,k_3] \end{align*} $$ #### 五、常见问题解决 1. **角点检测失败** - 检查棋盘格对比度(建议黑白对比度>200) - 使用`calibrationErrors = imageset.FileNames(~index);`定位失败图像 2. **重投影误差过大** - 增加标定图像数量(建议>20张) - 检查标定板物理尺寸输入是否正确 3. **畸变校正异常** ```matlab % 验证畸变校正效果 I = readimage(images,1); J = undistortImage(I,params); imshowpair(I,J,'montage'); ``` #### 六、进阶应用 - 使用`stereoCameraCalibrator`进行双目标定 - 结合激光雷达标定(参考LCC系列方法[^2])
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值