MATLAB实现相机标定

张友定标定法:

相机标定的目标是求出相机的内参、外参和畸变系数。这三个部分可以描述相机成像的过程:
内参:描述相机的光学特性,例如焦距和图像中心位置。
外参:描述相机相对于世界坐标系的位置和方向。
畸变系数:描述镜头的光学畸变。
公式如下:
在这里插入图片描述
其表示三维世界点 M 投影到二维图像平面上的过程。
s:一个尺度因子,用于表示从世界坐标到图像坐标的缩放比例。
𝑚:图像平面上的坐标(像素坐标),即三维点在图像中的位置。
𝐾:相机的内参矩阵,具体为:
在这里插入图片描述
fx和fy:表示相机的焦距(在 x 和 y 方向的像素单位)
cx​和cy:表示图像的中心点(主点)的像素坐标。
[RT]:相机的外参矩阵,其中包含旋转矩阵
R 和平移向量
T,描述相机相对于世界坐标系的位置和方向。
R 是一个 3x3 的旋转矩阵,表示相机坐标系相对于世界坐标系的旋转。
T 是一个 3x1 的平移向量,表示相机坐标系相对于世界坐标系的位移。
M:三维世界坐标系下的点(也称为世界坐标点),通常表示为 (X,Y,Z)。
张正友标定方法的核心即是采用平面标定板,从而可以方便的将标定点的真值Z置为0,以此方便计算。


代码解析:

棋盘格参数定义:

checkerboardSquareSize = 21.25; %每个小方格的实际物理尺寸(mm)
numSquaresX = 7; % 棋盘格在 X 方向的内角点数(列数 - 1)
numSquaresY = 10; % 棋盘格在 Y 方向的内角点数(行数 - 1

设置棋盘格的实际尺寸(方块边长)和角点数量,用于确定棋盘格的物理世界坐标。

棋盘格角点检测

imageFileNames = fullfile(imageFolder, {imageFiles.name});
[imagePoints, boardSize, imagesUsed] = detectCheckerboardPoints(imageFileNames);

使用 detectCheckerboardPoints 函数检测每张图像中的棋盘格角点。
imagePoints 保存角点的像素坐标,boardSize 为棋盘格尺寸,imagesUsed 标记成功检测到棋盘格的图像。

去除未检测到棋盘格的图像

imageFileNames = imageFileNames(imagesUsed);

过滤掉那些未成功检测到棋盘格角点的图像文件,确保后续操作只使用检测成功的图像。

设置棋盘格的世界坐标

worldPoints = generateCheckerboardPoints(boardSize, checkerboardSquareSize);

根据棋盘格的物理尺寸,生成实际的三维世界坐标 worldPoints。这些坐标用于建立世界坐标与图像坐标之间的映射关系。

相机参数估计

cameraParams = estimateCameraParameters(imagePoints, worldPoints);

estimateCameraParameters 函数通过最小化重投影误差来计算相机的内参矩阵、畸变参数和标定误差。
常用调用方法:[cameraParams, imagesUsed, estimationErrors] = estimateCameraParameters(imagePoints, worldPoints);

重投影误差定义为:从世界坐标投影到图像坐标系的点,与实际检测到的图像坐标之间的差距(误差越小,标定越准确)。

输出标定结果

% 显示相机内参矩阵 K
fx = cameraParams.FocalLength(1);  % 焦距 fx
fy = cameraParams.FocalLength(2);  % 焦距 fy
cx = cameraParams.PrincipalPoint(1);  % 主点 cx
cy = cameraParams.PrincipalPoint(2);  % 主点 cy

K = [fx, 0, cx;
     0, fy, cy;
     0,  0,  1];

disp('相机内参矩阵 K:');
disp(K);

% 显示畸变系数
disp('畸变系数:');
disp(cameraParams.RadialDistortion);

% 显示误差均方根(RMSE)
disp('误差均方根(RMSE):');
disp(cameraParams.MeanReprojectionError);


显示计算得到的内参矩阵、径向畸变参数和均方根误差(RMSE),以评估标定的准确性。

显示重投影误差

figure;
showReprojectionErrors(cameraParams);
title('重投影误差');

showReprojectionErrors 函数生成重投影误差图,用于评估每张图像的标定误差。

可视化标定结果

figure;
imshow(imageFileNames{1});
hold on;
plot(imagePoints(:,1,1), imagePoints(:,2,1), 'go');
hold off;
title('标定结果');

显示第一个图像,并在其上绘制检测到的棋盘格角点,以可视化检测效果。


标定过程:

拍摄多张不同角度的棋盘格照片
在这里插入图片描述
这里是直接用显示器棋盘格照片进行拍摄

角点检测
在这里插入图片描述
输出标定结果
在这里插入图片描述

输出的相机内参矩阵为:在这里插入图片描述
相机内参矩阵 K:

焦距:1581.9 和 1583.3 分别是相机在 X 和 Y 方向的焦距(单位:像素)。
这表示相机的成像比例在 X 和 Y 方向上基本一致。
主点:1017.3 和 1029.6 是图像平面上主点的像素坐标。
主点坐标即相机光轴与图像平面的交点,通常接近图像中心,但实际拍摄中可能会略微偏离。
尺度因子:最后一行的 [0, 0, 1] 表示齐次坐标,通常用于标准化坐标转换。
在这里插入图片描述
在这里插入图片描述

显示的畸变系数为:

径向畸变系数:-0.1628
切向畸变系数:0.1335

畸变系数解释:
径向畸变:-0.1628 表示图像存在轻微的径向畸变,通常导致“桶形”或“枕形”变形。
畸变值越大,图像边缘的变形越明显。该数值相对较小,表明畸变较轻。
切向畸变:0.1335 表示切向畸变程度。
切向畸变是由于镜头和图像传感器不完全平行,导致图像出现轻微倾斜。

重投影误差均方根(RMSE)
输出的 RMSE 为:
RMSE=0.3675

RMSE(Root Mean Square Error) 表示标定精度,数值越小说明标定越精确。
0.3675 像素的 RMSE 表示重投影误差相对较小,说明标定过程相对精确。
RMSE 表示在标定过程中,计算的角点位置与实际检测位置之间的平均误差(单位:像素)。通常 RMSE 小于 1 像素就表示标定精度较好。

相机标定的重投影误差
在这里插入图片描述
该图显示了相机标定的重投影误差(Reprojection Error),每个柱状条表示一张标定图像的平均重投影误差。以下是详细分析:
纵轴(Mean Error in Pixels):
表示重投影误差的平均值,单位为像素。
误差越小,说明标定结果越精确。
横轴(Images):
表示用于标定的每一张图像编号,从 1 到 8,对应不同的标定图像。
蓝色柱状条:
每个柱状条表示一张标定图像的重投影误差(均值)。
重投影误差是指图像上实际检测到的角点位置与根据标定参数重新投影得到的角点位置之间的差距。
数值越小,说明该图像对于标定的误差越小,标定的精度越高。
虚线(Overall Mean Error):
图中的虚线表示总体平均重投影误差,标记为 0.37 pixels。虚线的位置表示所有图像的重投影误差的平均值。这是一个评估标定总体精度的重要指标。
图中关键点分析
大多数图像的误差集中在 0.2 到 0.5 像素范围内:这说明标定过程中,大多数图像的重投影误差较小,标定效果较为理想。
第 8 张图像的误差最高:第 8 张图像的平均重投影误差接近 0.8 像素,比其他图像的误差高出不少。可能的原因包括:角点检测受干扰、图像拍摄角度问题、光照条件变化,或棋盘格在该图像中存在畸变。这可能降低了该图像对标定精度的贡献。
第 1 张和第 6 张图像的误差较低:这些图像的重投影误差接近 0.2 像素,说明它们的标定效果非常好,有助于提升整体标定精度。


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。同样的已知旋转矩阵,我们也可以通过下面的公式求解得到旋转向量: 。
### 回答1: detectcheckerboardpoints是一个函数,用于检测棋盘格的角点。它可以在图像中自动检测出棋盘格的角点,并返回这些角点的坐标。这个函数在计算机视觉和机器人视觉中经常被使用,用于定位和姿态估计等任务。 ### 回答2: detectcheckerboardpoints是一个用于检测棋盘格角点的函数。当我们拍摄一张包含棋盘格的照片时,该函数可以帮助我们自动检测出棋盘格的角点,并返回这些角点的坐标。 这个函数通常需要传入一张包含棋盘格的图像作为输入。首先,该函数会对输入图像进行处理,去除图像中的噪声和干扰。然后,它会使用适当的算法来寻找棋盘格的角点。 在寻找角点时,该函数会根据棋盘格的特征来判断是否存在角点。棋盘格通常由一系列平行的线组成,而角点处通常有多条线交汇。通过检测线的交叉点,函数可以确定这些交汇处是否为角点。 一旦检测到棋盘格的角点,该函数会将这些角点的像素坐标返回给调用者,以便后续使用。 使用detectcheckerboardpoints函数可以简化角点检测的过程。它可以自动找到角点,而无需人工干预。这对于需要对棋盘格进行校准或测量的任务非常有用。例如,在计算机视觉领域,对相机进行标定时就需要检测棋盘格的角点,然后通过这些角点来计算相机的内参和畸变参数。 总之,detectcheckerboardpoints是一个实用的函数,可以自动检测棋盘格的角点,并返回这些角点的坐标,让我们能够轻松地进行后续的处理和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值