目录
一、理论基础
1.1 相机标定理论基础
1.2 matlab仿真
二、核心程序
相机标定是计算机视觉领域中一项重要的工作,它通过数学建模实现摄像机内部和外部参数的准确测量。在这个过程中,toolbox_calib工具箱被广泛应用于相机标定和相机姿态估计。下面将介绍使用toolbox_calib工具箱进行相机标定的原理和数学公式。
相机标定主要分为两个步骤:相机内部参数标定和相机外部参数标定。
相机内部参数标定主要是通过已知尺寸的三维标定板来实现。我们需要在不同位置摆设这些三维标定板,并从不同角度拍摄这些标定板,从而获取足够多的图像数据。
假设我们有一组包含n个图像的数据集,每个图像中都有m个三维标定板的特征点。那么,我们可以通过最小二乘法求解相机内部参数的优化问题,使得这些特征点在图像坐标系中的位置与在三维空间坐标系中的位置之间的误差最小。
具体来说,我们可以用一个线性方程组来表示这个优化问题,其中包含n个方程和m个未知数。我们可以通过奇异值分解(SVD)求解这个线性方程组,得到相机内部参数的最优解。这些参数包括相机的焦距、光心、畸变系数等。
相机外部参数标定主要是通过已知位置和姿态的机器人或立体视觉系统来实现。我们需要在不同的位置和姿态下拍摄目标物体或场景,并获取图像数据。
假设我们有一组包含n个图像的数据集,每个图像中都有m个对应的三维空间点。那么,我们可以通过最小二乘法求解相机外部参数的优化问题,使得这些三维空间点在图像坐标系中的位置与在真实世界坐标系中的位置之间的误差最小。
具体来说,我们可以用一个线性方程组来表示这个优化问题,其中包含n个方程和m个未知数。我们可以通过奇异值分解(SVD)求解这个线性方程组,得到相机外部参数的最优解。这些参数包括相机的旋转和平移矩阵等。
在实际应用中,我们通常会使用toolbox_calib工具箱来完成相机标定的所有步骤。这个工具箱提供了一系列函数和工具,可以方便地对相机的内部和外部参数进行标定,并能够生成相应的标定报告。
总的来说,使用toolbox_calib工具箱进行相机标定是一个高效、准确的方法,可以为我们提供精确的相机参数,为后续的计算机视觉任务提供有力的支持。
相机标定是三 维 重 构 的前期关键技术之 一 ,标 定内容 包 括确 定 相 机 的 内部 参数 和外 部参 数.内部 参 数包 括相 机 的焦 距 和 成 像 的 大 小 ,用 于建 立 相 机 模 型 ;外 部 参 数 包 含 相 对 于 场 景 的 相 机 位 置 和 姿 态.参数 的精度 直接影 响 三维 重构 结 果 的 准确 性 .
许 多 学 者 对 相 机 参 数 的 获 取 方 法 进 行 了 研 究 , HARTLEY_2提 出通 过控 制摄像 机绕 光 心作纯 旋 转 运 动标 定摄 像 机 的算 法 ,优 点 是 线 性 求 解 摄 像 机 的 内部 参数 ,处 理速 度较 快 ,缺 点是 标定 过 程 中人 们 无 法 知道 摄 像机 光 心 的 具 体 位置 ,在 实 际 应 用 中很 难 控 制摄 像机 作绕 光 心 的旋 转 ;w ONG 等 _3提 出物 体 作 圆周 运 动捕 获 物 体 轮廓 视 角 进 行 标 定 的方 法 ,这 种 方 法必须 手 动调 节视 角提供 近 似 的位 置 和方 向参 数 ,然后通 过 迭代优 化 改进 ,不仅 增加 操 作人 员 的工 作量 ,而且 在 测量 过程 中引入 人 为误 差 ,标定 的结果 不精 确.
打开toolbox_calib,然后运行calib_gui:(注意,工具箱在有些电脑中可能会报错,如果保存就用matlab2013b)
然后点第一个standard
点:
输入如下,DSC,j
再点:
然后一直点回车,直到出现如下效果:
用鼠标在上面点击四个角
然后点:
然后点就出现如下结果:
点击save保存标定结果
这个mat里面,有如下数据:
function show_window(cell_list,fig_number,title_figure,x_size,y_size,gap_x,font_name,font_size)
if ~exist('cell_list'),
error('No description of the functions');
end;
if ~exist('fig_number'),
fig_number = 1;
end;
if ~exist('title_figure'),
title_figure = '';
end;
if ~exist('x_size'),
x_size = 85;
end;
if ~exist('y_size'),
y_size = 14;
end;
if ~exist('gap_x'),
gap_x = 0;
end;
if ~exist('font_name'),
font_name = 'clean';
end;
if ~exist('font_size'),
font_size = 8;
end;
figure(fig_number); clf;
pos = get(fig_number,'Position');
[n_row,n_col] = size(cell_list);
fig_size_x = x_size*n_col+(n_col+1)*gap_x;
fig_size_y = y_size*n_row+(n_row+1)*gap_x;
set(fig_number,'Units','points', ...
'BackingStore','off', ...
'Color',[0.8 0.8 0.8], ...
'MenuBar','none', ...
'Resize','off', ...
'Name',title_figure, ...
'Position',[pos(1) pos(2) fig_size_x fig_size_y], ...
'NumberTitle','off'); %,'WindowButtonMotionFcn',['figure(' num2str(fig_number) ');']);
h_mat = zeros(n_row,n_col);
posx = zeros(n_row,n_col);
posy = zeros(n_row,n_col);
for i=n_row:-1:1,
for j = n_col:-1:1,
posx(i,j) = gap_x+(j-1)*(x_size+gap_x);
posy(i,j) = fig_size_y - i*(gap_x+y_size);
end;
end;
for i=n_row:-1:1,
for j = n_col:-1:1,
if ~isempty(cell_list{i,j}),
if ~isempty(cell_list{i,j}{1}) & ~isempty(cell_list{i,j}{2}),
h_mat(i,j) = uicontrol('Parent',fig_number, ...
'Units','points', ...
'Callback',cell_list{i,j}{2}, ...
'ListboxTop',0, ...
'Position',[posx(i,j) posy(i,j) x_size y_size], ...
'String',cell_list{i,j}{1}, ...
'fontsize',font_size,...
'fontname',font_name,...
'Tag','Pushbutton1');
end;
end;
end;
end;
%------ END PROTECTED REGION ----------------%
A19-13