利用matlab进行双目相机标定
采集图像
- 命令行窗口输入
cameraCalibrator
打开相机标定工具箱。 - 单击
Add Images
后的小三角,选择from camera
。
- 选择相机,设置相机属性。
设置分辨率
设置保存路径和拍照总数。总数尽量多些,因为不一定每张图像都能用。之后点击capture开始拍照。
分割图像
运行分割图像的程序。左相机图像被保存在camera1中,右相机图像被保存在camera2中。
clc; clear all; path = ['H:/calibration/',datestr(now,'yyyy-mm-dd'),'/']; dirOutput=dir(fullfile(path,'*.png')); fileNames={dirOutput.name}; sz = size(fileNames); mkdir([path,'/camera1']);mkdir([path,'/camera2']);mkdir([path,'result']); for i = 1:sz(2) img = imread([path,fileNames{i}]); szImg = size(img); % 480 1280 3 imgLeft = img(:,1:szImg(2)/2,:); imgRight = img(:,szImg(2)/2+1:szImg(2),:); imwrite(imgLeft,[path,'/camera1/',fileNames{i}]); imwrite(imgRight,[path,'/camera2/',fileNames{i}]); end
标定双目相机
- 在命令行窗口输入
stereoCameraCalibrator
,点击Add Images
,选择图像属性。
- 选择属性
compute intrinsics:计算相机内参。
use fixed intrinsics:加载工作空间中预先训练好的相机内参。
相机的畸变参数有径向畸变K1,K2,K3,切向畸变P1,P2
选择2Coefficients选项代表默认将K3视为0(K3通常在鱼眼镜头中使用,普通镜头一般不考虑),那么标定得到的径向畸变只有K1和K2两个值。如果选择3Coefficients则标定后也会得到K3值。
Skew值和我们得到的内参矩阵有关,如果未选中Skew,得到的内参就是下面式1,选中得到的内参便是式2,两者的区别就是有没有考虑到Skew偏斜系数
式1
式2
Tangential Distortion就是问你考不考虑切向畸变,不选中则切向畸变P1=P2=0;
在Opencv中,畸变系数使用时顺序为K1、K2、P1、P2、K3。
需要注意的是,
1.opencv使用这些参数时,内参矩阵IntrinsicMatrix和旋转矩阵RotationOfCamera2需要转置后再使用。这点非常重要,否则你立体校正的结果都是错的,何况立体匹配。
2.在更改相机分辨率进行测距时,需要使用相应分辨率的图片进行重新标定,否则得到的距离结果是错误的。双目测距注意事项(Matlab+Opencv)
左右相机的内参数矩阵、畸变参数以及旋转矩阵、平移矩阵都可以得出。
TranslationOfCamera2:相机2相对于相机1的偏移矩阵,可以直接使用。
RotationOfCamera2:相机2相对于相机1的旋转矩阵,需要转置之后才能使用。
CameraParameters1与CameraParameters2为左右摄像头的单独标定参数。
IntrinsicMatrix存放的是摄像头的内参,只与摄像机的内部结构有关,需要先转置再使用。
RadialDistortion:径向畸变,摄像头由于光学透镜的特性使得成像存在着径向畸变,可由K1,K2,K3确定。
TangentialDistortion:切向畸变,由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数P1,P2确定。
使用时,需要注意参数的排放顺序,即K1,K2,P1,P2,K3。切记不可弄错,否则后续的立体匹配会出现很大的偏差。
- 点击calibrate开始标定。
选择导出标定参数或者导出标定程序
本文作者:榴红八色鸫
本文链接:https://www.cnblogs.com/hezexian/p/16610113.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步