Matlab version:2017b
Matlab标定双目摄像头三步走:
利用Matlab对棋盘格进行图像采集,图片数量在15~25之间。采集代码如下:
% 代码功能:每次按下enter键,采集一次棋盘格图片,并将左右相机的图像分离,各自存到事先建好的目录下
clear all;close all;clc;
% Open the ZED
zed = webcam('ZED')
% Set video resolution=720P
zed.Resolution = zed.AvailableResolutions{1};
% Get image size
[height width channels] = size(snapshot(zed))
ok = 1;
i = 0;
% Start loop
while ok
% get key value
w = waitforbuttonpress;
if w
% Capture the current image
img = snapshot(zed);
% Split the side by side image image into two images
image_left = img(:, 1 : width/2, :);
image_right = img(:, width/2 +1: width, :);
% save images
imwrite(image_left, ['E:\zed\leftImage\',num2str(i),'.jpg']);
imwrite(image_right, ['E:\zed\rightImage\',num2str(i),'.jpg']);
% Display the left and right images
subplot(1,2,1);
imshow(image_left);
title('Image Left');
subplot(1,2,2);
imshow(image_right);
title('Image Right');
drawnow;
i = i+1;
end
end
% close the camera instance
clear zed
这里插补一下ZED相机在Matlab中的使用方法:
在Matlab命令窗口输入
>> webcamlist
ZED相机被检测到的话,会得到
ans ='ZED'
初次使用这个命令会报错
Error using webcamlist (line 20)
MATLAB Support Package for Webcams has not been installed. Open Support Package Installer to install the Webcam Support Package.
解决方法:点击错误里面的链接,注册一下Matlab的账号,下载安装一下支持包就可以了。
打开相机,输入
>> cam = webcam
Matlab会返回相机信息
cam =
webcam with properties:
Name: 'ZED'
Resolution: '2560x720'
AvailableResolutions: {1x4 cell}
WhiteBalanceMode: 'auto'
Sharpness: 4
Saturation: 5
Hue: 0
Gain: 4
WhiteBalance: 4600
Contrast: 4
Brightness: 4
Exposure: 2
ExposureMode: 'auto'
运行相机,输入
>> preview(cam)
抓取图片,输入
>> img = snapshot(cam);
关闭相机,输入
>> clear cam
这里,先标定左相机。标定主要用的是Matlab的标定工具箱插件。插件下载地址:
Camera Calibration Toolbox for Matlab
将下载好的文件夹放在Matlab的toolbox目录下,然后在Matlab命令窗口输入
>> pathtool
在弹出的Set path 窗口中,点击Add Folder,添加toolbox_calib插件目录,点击save。
将Matlab当前文件夹切换到包含左相机图片的文件夹下。
在Matlab命令窗口输入
>> calib_gui
弹出工具栏窗口
选择第一个选项,弹出标定界面
点击“Image names”,Matlab命令窗口显示如下
这里是要求输入图片命名里除了数字和后缀之外的部分,比如图片命名为“left1.jpg”,这里要输入“left”,因为我的图片命名里只有1,2,3…数字,所以直接回车。
Image format是图片的格式,按照实际情况选择。回车。图片加载成功。
然后,点击标定界面的Extract grid corners(提取角点),Matlab命令窗口如下
一路回车,默认即可。最后会跳出第一幅图棋盘图,然后按顺时针或逆时针旋转棋盘格最外面的四个格子的内角点。
之后,Matlab的命令窗口要求输入格子的大小,单位mm,我的是30*30mm,所以输入30。
然后,会弹出一个角点提取的图片。
如果对角点提取不满意,即红色十字和实际的角点不是很接近,可以通过系数kc调整,如下图
注意kc的取值范围在-1~+1之间,一般可以试试-0.1、-0.2、-0.3。调好以后,在Satisfied with distortion? ([]=no, other=yes) 后输入1。之后会进入第二张图片进行角点提取,重复上述过程,直到所有图片的角点提取完成。
所有图片的角点提取完成后,Malba命令窗口会显示左相机的内参。
标定结束后可以通过标定界面按钮进行可视化的观察,比如误差图的查看,点击Analyse error
可以点击误差较大的点,在Matlab命令窗口显示这个点的基本信息。
左相机标定结果出来后,点击标定界面的Save,这时结果文件默认保存在当前文件夹下面,默认文件名为Calib_Results.mat,将其改为Calib_Results_left.mat(双目标定用到)。至此左摄像头标定结束,右摄像头标定过程与左一样,最后保存为Calib_Results_right.mat。
Matlab命令行输入
>> stereo_gui
弹出立体标定界面,选择第一个Load
load左右相机标定结果的.mat文件,如果命名是“Calib_Results_left.mat”和“Calib_Results_right.mat”,直接回车,否则需要输入正确的文件名。
回车后,Matlab会显示左右相机的标定结果,点击一下标定界面的run,会显示优化后的标定结果。
至此,左、右相机的内参和双目相机的外参都标定好了。标定结束。
如果想将标定结果转换为opencv能用的文件,参考下面的博客。
参考博客