目录
一、研究背景与意义
人类对其周边环境信息的判断主要依靠视觉,通过人眼与大脑的协调工作, 人类实现了对环境信息的识别和判断。计算机视觉是机器设备对生物视觉系统的 模仿,其工作目的是将机器视觉中的图片和视频等信息恢复为三维场景信息,并 由此重建和识别物体。从尽可能多的实现仿生和实用的观点来看,双目视觉最能 够实现机器视觉向人类视觉的仿生。我们身处于一个具有三维立体结构的世界中, 视觉功能可以帮助我们对周边环境中所有物体的三维结构加以辨识,然而大多数 的摄像机其获取的仅仅只是物体的表象信息。计算机视觉的主旨工作就是对终像、 视频等二维信息进行分析和理解,从而使机器能够像人类一样可以识别三维结构 的物体。计算机识别三维结构物体的关键问题就是终像的三维重建,而研究如何 能够恢复一维表象信息的三维场景坐标便是实现三维重建的重中之重。所谓双目 立体视觉就是利用摄像机从不同位置采集同一场景的双目图像,通过三维重构过 程,还原物体的三维信息,从而使人感到真实三维场景的立体感。 双目视觉测量是计算机视觉的一个重要分支,它以计算机视觉理论为基础, 涉及光学、光电子学、图像处理、模式识别、信号与数据处理及计算机技术等诸 多学科。双目视觉测量的原理,是基于人眼双目视差,从两个摄像机获取不同视 角下的同一场景下的图像,通过图像处理分析两幅图像中目标点的对应关系,从 而得到物体的三维信息。计算机双目视觉直接模拟了人眼处理景物的方式,可在 多种条件下灵活地测量景物的立体信息,是其它计算机视觉方法所不能取代的, 对它的研究,无论是从视觉生理的角度还是在工程应用中都具有十分重要的意义。
二、课题内容
(一)双目视觉标定
1.原理
双目摄像机需要标定的参数:摄像机内参数矩阵,畸变系数,两相机之间的 旋转矩阵 R
和平移矩阵
T (
其中摄像机内参数矩阵和畸变系数矩阵可以通过单 目标定的方法标定出来)
。 双目摄像机标定和单目摄像机标定最主要的区别就是双目摄像机需要标定 出左右摄像机坐标系之间的相对关系。我们用旋转矩阵 R 和平移矩阵
T
来描 述左右两个摄像机坐标系的相对关系,具体为:在左相机上建立世界坐标系。假 设空间中有一点 P,其在世界坐标系下的坐标为
Pw
,其在左右摄像机坐标系下 的坐标可以表示为:
Pl=RlPw+Tl
Pr=RrPw+Tr
2. 流程
①选择
matlab
中的双目标定工具箱;

图 1.2.1 选择工具箱

图
1.2.2
进入工具箱
②导入图片并设置棋盘格尺寸:导入左相机、右相机拍摄的图片文件夹,同 时设置好棋盘格的宽度数值;

图
1.2.3
导入图片并设置棋盘格尺寸

图
1.2.4
导入成功
③设置校正参数:
A.
径向畸变:
径向畸变是相机镜头中常见的一种畸变类型。它会导致图像中心部分的物体 形状变形。径向畸变可以用畸变参数来描述,其中常用的是 k1
和
k2
两个参数。 选择计算 2
个畸变参数即可满足大多数情况。当计算
3
个畸变参数时,
k3
值通 常很小,可以忽略。在计算 3
个畸变参数时,需要注意畸变参数的排列顺序为
[k1, k2, p1, p2, k3]
B.
切向畸变:
切向畸变是相机镜头的另一种畸变类型。在现代相机质量较高的情况下,一 般不需要考虑切向畸变。
C.
可选参数设置:
在畸变矫正模块中,你可以选择输入一些初始参数。这些参数将被用于迭代 计算,以减少计算量。如果你不输入这些参数,MATLAB
会自动进行迭代计算。
D.
计算模块:
点击计算按钮后,
MATLAB
将执行畸变矫正的计算过程。 总结来说,畸变矫正模块用于处理相机镜头的畸变问题。它包括径向畸变和 切向畸变的计算和矫正。你可以选择计算 2
个或
3
个径向畸变参数,并可以设置 一些可选的参数。完成设置后,点击计算按钮开始执行畸变矫正计算。

图
1.2.5
设置矫正参数
④计算结果再分析
在左下方是左右图像的标定误差直方图。通过点击误差较大的直方图,可以 在左侧的图像对中到对应的图像。右键点击该图像,选择"Remove and
Recalibrate"
,可以执行以下步骤:
A.
移除选定的图像对:选择
"Remove and Recalibrate"
后,系统将从标定中移 除该图像对,即不再使用该图像对进行标定。
B.
重新标定:移除图像对后,系统会重新执行标定过程,使用剩余的图像对 进行标定计算。
C.
重复步骤:如果仍然存在误差较大的直方图,你可以继续点击该直方图, 找到对应的图像,并选择"Remove and Recalibrate"
,以重复上述步骤。 通过反复移除误差较大的图像对并重新标定,直到认为误差满足标定需求为 止。这个过程可以帮助提高标定的准确性和精度。

图
1.2.7
删除选中直方图并重新标定
⑤导出计算结果:点击
Export Camera Parameters
导出校正结果,对话框中 点击确定(见图 10
),然后关闭相机校正模块,回到 matlab 主界面。

图
1.2.8
点击
Export Camera Parameters

图
1.2.9
导出校正结果
6
⑥读取参数:标定结束后,会得到如下标定参数;

图
1.2.10
标定参数
TranslationOfCamera2
:相机
2
相对于相机
1
的偏移矩阵;
RotationOfCamera2
:相机
2
相对于相机
1
的旋转矩阵;
CameraParameters1
、
CameraParameters2
为左右摄像头的单独标定参数。

图
1.2.11 RotationOfCamera2

图
1.2.12 TranslationOfCamera2

图
1.2.13
导出数据
此时标定完成,保存并导出数据。
(二)双目视觉测量
1. 对第“4”对图分析
①
写入代码
% 载入相机参数
load('D:\6.19opencv\stereoParams.mat');
CameraParameters1=stereoParams.CameraParameters1;
%load('D:\6.19opencv\cameraParams2.mat');
CameraParameters2=stereoParams.CameraParameters2;
rotationOfCamera
=
[0.961946016750214,0.00813927148687200,-0.273118313406590;-0.005604972092
34865,0.999933707257798,0.0100581000949768;0.273182073251963,-0.008144528
79788458,0.961927867100449];
translationOfCamera = [-276.724447941251
1.02241233804647
45.6465912222537];
stereoParams
=stereoParameters(CameraParameters1,
CameraParameters2,
rotationOfCamera,translationOfCamera);
% 读取图像
I1 = imread(fullfile('D:\6.19opencv\双目边长测量\camera1','4.jpg'));
I2 = imread(fullfile('D:\6.19opencv\双目边长测量\camera2','4.jpg'));
% 消除畸变
I1 = undistortImage(I1, stereoParams.CameraParameters1);
I2 = undistortImage(I2, stereoParams.CameraParameters2);
% 检测棋盘格角点
[imagePoints1, boardSize1] = detectCheckerboardPoints(I1);
[imagePoints2, boardSize2] = detectCheckerboardPoints(I2);
% 获取三维点
for i = 1:88
center1i = imagePoints1(i,:);
center1(i,1) = center1i(:,1);
center1(i,2) = center1i(:,2);
end
for j = 1:88
center2j = imagePoints2(j,:);
center2(j,1) = center2j(:,1);
center2(j,2) = center2j(:,2);
end
for k = 1:88
point3dk = triangulate(center1(k,:), center2(k,:), stereoParams);point3d(k,1) = point3dk(:,1);
point3d(k,2) = point3dk(:,2);
point3d(k,3) = point3dk(:,3);
end
X = point3d(:,1);
Y = point3d(:,2);
Z = point3d(:,3);
②得到
88
个点坐标

图
2.1.1
点坐标
③将点坐标导出并保存在
excel
中

图
2.1.2
导出并保存坐标
④
将点坐标做成散点图,方便找到角点

图
2.1.3
散点图
⑤
带入数值计算

2. 对第“5”对图分析
①写入代码
% 载入相机参数
load('D:\6.19opencv\stereoParams.mat');
CameraParameters1=stereoParams.CameraParameters1;
%load('D:\6.19opencv\cameraParams2.mat');
CameraParameters2=stereoParams.CameraParameters2;
rotationOfCamera
=
[0.961946016750214,0.00813927148687200,-0.273118313406590;-0.005604972092
34865,0.999933707257798,0.0100581000949768;0.273182073251963,-0.008144528
79788458,0.961927867100449];
translationOfCamera = [-276.724447941251
1.02241233804647
45.6465912222537];
stereoParams
=stereoParameters(CameraParameters1,
CameraParameters2,
rotationOfCamera,translationOfCamera);
% 读取图像
I1 = imread(fullfile('D:\6.19opencv\双目边长测量\camera1','5.jpg'));
I2 = imread(fullfile('D:\6.19opencv\双目边长测量\camera2','5.jpg'));
% 消除畸变
I1 = undistortImage(I1, stereoParams.CameraParameters1);
I2 = undistortImage(I2, stereoParams.CameraParameters2);
% 检测棋盘格角点
[imagePoints1, boardSize1] = detectCheckerboardPoints(I1);
[imagePoints2, boardSize2] = detectCheckerboardPoints(I2);
% 获取三维点
for i = 1:88
center1i = imagePoints1(i,:);
center1(i,1) = center1i(:,1);
center1(i,2) = center1i(:,2);
end
for j = 1:88
center2j = imagePoints2(j,:);
center2(j,1) = center2j(:,1);
center2(j,2) = center2j(:,2);
end
for k = 1:88
point3dk = triangulate(center1(k,:), center2(k,:), stereoParams);
point3d(k,1) = point3dk(:,1);
point3d(k,2) = point3dk(:,2);point3d(k,3) = point3dk(:,3);
end
X = point3d(:,1);
Y = point3d(:,2);
Z = point3d(:,3);
②得到
88
个点坐标

图
2.2.1
点坐标
③将点坐标导出并保存再
excel
中(下图为部分)

图
2.2.2
导出并保存点坐标
④
将点坐标做成散点图,方便找到角点

图
2.2.3
散点图
⑤
带入数值计算

3. 对第“6”对图分析
①
写入代码
% 载入相机参数
load('D:\6.19opencv\stereoParams.mat');
CameraParameters1=stereoParams.CameraParameters1;
%load('D:\6.19opencv\cameraParams2.mat');
CameraParameters2=stereoParams.CameraParameters2;
rotationOfCamera
=
[0.961946016750214,0.00813927148687200,-0.273118313406590;-0.005604972092
34865,0.999933707257798,0.0100581000949768;0.273182073251963,-0.008144528
79788458,0.961927867100449];
translationOfCamera = [-276.724447941251
1.02241233804647
45.6465912222537];
stereoParams
=stereoParameters(CameraParameters1,
CameraParameters2,
rotationOfCamera,translationOfCamera);
% 读取图像
I1 = imread(fullfile('D:\6.19opencv\双目边长测量\camera1','6.jpg'));
I2 = imread(fullfile('D:\6.19opencv\双目边长测量\camera2','6.jpg'));
% 消除畸变
I1 = undistortImage(I1, stereoParams.CameraParameters1);
I2 = undistortImage(I2, stereoParams.CameraParameters2);
% 检测棋盘格角点
[imagePoints1, boardSize1] = detectCheckerboardPoints(I1);
[imagePoints2, boardSize2] = detectCheckerboardPoints(I2);
% 获取三维点
for i = 1:88
center1i = imagePoints1(i,:);
center1(i,1) = center1i(:,1);
center1(i,2) = center1i(:,2);
end
for j = 1:88
center2j = imagePoints2(j,:);
center2(j,1) = center2j(:,1);
center2(j,2) = center2j(:,2);
end
for k = 1:88
point3dk = triangulate(center1(k,:), center2(k,:), stereoParams);
point3d(k,1) = point3dk(:,1);
point3d(k,2) = point3dk(:,2);point3d(k,3) = point3dk(:,3);
end
X = point3d(:,1);
Y = point3d(:,2);
Z = point3d(:,3);
②
得到 88 个点坐标

图
2.3.1
点坐标
③
将点坐标导出并保存再 excel 中(下图为部分)

图
2.3.2
导入并保存点坐标
16④将点坐标做成散点图,方便找到角点

图
2.3.3
散点图
⑤
带入数值计算

4. 将数据综合列表画图

图
2.4.1
边长折线图
(三)位移测量(0-20mm 11 对图)
1.确定拟合平面
①首先将距离为 0 的一对图导入运行
图
3.1.1
导入距离
=0
% 载入相机参数
load('D:\6.19opencv\stereoParams.mat');
CameraParameters1=stereoParams.CameraParameters1;
%load('D:\6.19opencv\cameraParams2.mat');
CameraParameters2=stereoParams.CameraParameters2;
rotationOfCamera=[0.961946016750214,0.00813927148687200,-0.27311831340659
0;-0.00560497209234865,0.999933707257798,0.0100581000949768;0.27318207325
1963,-0.00814452879788458,0.961927867100449];
translationOfCamera = [-276.724447941251
1.02241233804647
45.6465912222537];
stereoParams
=stereoParameters(CameraParameters1,
CameraParameters2,
rotationOfCamera,translationOfCamera);
% 读取图像
I1 = imread(fullfile('D:\6.19opencv\位移测量\camera1','0.jpg'));
I2 = imread(fullfile('D:\6.19opencv\位移测量\camera2','0.jpg'));
% 消除畸变
I1 = undistortImage(I1, stereoParams.CameraParameters1);
I2 = undistortImage(I2, stereoParams.CameraParameters2);
% 检测棋盘格角点
[imagePoints1, boardSize1] = detectCheckerboardPoints(I1);
[imagePoints2, boardSize2] = detectCheckerboardPoints(I2);% 获取三维点
for i = 1:88
center1i = imagePoints1(i,:);
center1(i,1) = center1i(:,1);
center1(i,2) = center1i(:,2);
end
for j = 1:88
center2j = imagePoints2(j,:);
center2(j,1) = center2j(:,1);
center2(j,2) = center2j(:,2);
end
for k = 1:88
point3dk = triangulate(center1(k,:), center2(k,:), stereoParams);
point3d(k,1) = point3dk(:,1);
point3d(k,2) = point3dk(:,2);
point3d(k,3) = point3dk(:,3);
end
X = point3d(:,1);
Y = point3d(:,2);
Z = point3d(:,3);
②可得一组
88
个点

图
3.1.2
点坐标
③再由这
88
个点通过
MATLAB
之
Curve Fitting Tool
这个工具包,先输入三
组向量
x
,
y
,
z
,再从列表中选择你想要进行拟合的方式
Polynomial
:多形式逼
近,可得如下图所示的拟合平面以及得到拟合平面方程:
Z=f(x,y) = p00 + p10*x + p01*y
p00 = 1065 (1065, 1065)
p10 = 0.2133 (0.2131, 0.2134)
p01 = 0.05098 (0.05079, 0.05116)

图
3.1.3
拟合平面方程
2.
位移测量
①通过拟合平面方程以及剩下
10
对图的
88
个点三维坐标可求出距离,注意
将剩下十对图和第一对图的
88
个点做成
excel
文件。

②从 Excel
文件读取数据分别通过更改路径和输出路径得到
11
份距离将数 据写入 Excel 文件。
基于点到平面距离公式,计算每个点的距离
下列为“
2
”图的例子

图
3.2.1
计算“
2
”图距离
function zg_save_distances_to_excel()
% 拟合的平面方程系数
a = 0.213273;
b = 0.050976;
c = -1.000000;
d = 1065.197747;
% 从 Excel 文件读取数据
q = xlsread('D:\6.19opencv\位移测量\2.xlsx', 'sheet1');
% 计算每个点相对于拟合平面的有符号距离
distances = (a * q(:, 1) + b * q(:, 2) + c * q(:, 3) + d) / sqrt(a^2 + b^2 + c^2);
% 创建包含点索引和距离的表格
data = [(1:88)', distances];
% 将数据写入 Excel 文件
xlswrite('D:\6.19opencv\位移测量\distances2.xlsx', data, 'sheet1');
fprintf('距离数据已保存到 distances2.xlsx 文件中。\n');
End
图
3.2.2
保存数据
重复上述步骤可得
11
组
88
个距离
将它们放在一起,并求出每组的平均数
表
4
求平均数

表
5
距离和平均数

图
3.2.3
折线图
参考文献
[1]
李军
,
刘震宇
,
姜宁宁
. (2020).
基于改进的立体匹配算法的双目视觉测距系统
.
中国自
动化学会控制理论专业委员会第
32
届学术年会
, 42-46.
[2]
刘洋
,
韩丰
,
朱巍
. (2015).
基于双目视觉的实时车道线检测方法
.
中国图象图形学报
,
20(6), 749-756.
[3]
陈旭
,
张爽
,
郭松泽
. (2019).
基于深度学习的立体匹配方法综述
.
电子与信息学报
, 41(4),
893-903
[4]
王凯
,
王朋
,
张雷
,
张昊
. (2020).
基于深度学习的双目视觉立体匹配算法
.
中国图象图
形学报
, 25(8), 976-984.
[5] Zhang, Z. (2000). A flexible new technique for camera calibration. IEEE Transactions on
Pattern Analysis and Machine Intelligence, 22(11), 1330-1334.
[6] Scharstein, D., & Szeliski, R. (2002). A taxonomy and evaluation of dense two-frame stereo
correspondence algorithms. In Proceedings of the 2002 IEEE Computer Society Conference on
Computer Vision and Pattern Recognition (Vol. 1, pp. I-196). IEEE.
[7] Hirschmuller, H. (2005). Accurate and Efficient Stereo Processing by Semi-Global Matching
and Mutual Information. In Proceedings of the IEEE Computer Society Conference on Computer
Vision and Pattern Recognition (Vol. 2, pp. 807-814). IEEE.
[8] Scharstein, D., & Szeliski, R. (2002). A Taxonomy and Evaluation of Dense Two-Frame Stereo
Correspondence Algorithms. International Journal of Computer Vision, 47(1-3), 7-4