1 概述

现在有许多双目相机在出厂时就已经标定好了,用户拿到手后可以直接使用,例如Intel Realsense系列。但是有些相机出厂的时候并没有完成标定工作,因而这个时候就需要我们自己来标定。由于笔者曾改装过一个双目相机,最远可以测至50m,因此有一些心得体会想给大家分享一下。本文主要介绍双目相机标定的整个过程,以及导出标定数据的方法。

相机标定主要分为手动标定和自动标定,手动标定比较繁琐,这里主要介绍基于matlab工具箱的自动标定方式来对双目相机进行标定。具体的相关标定细节也可以参照这篇博客:matlab双目标定(详细过程),里面有详细介绍。

2 Matlab工具箱标定

首先需要准备一张棋盘,如下图所示。对于标定不同测距范围相机所用的棋盘方格宽度会有所不同。对于短焦双目相机(测距范围在20m以内),棋盘中方格的宽度达到20mm即可;对于长焦双目相机(测距范围在40m左右),棋盘中方格的宽度需要尽量大,否则会影响标定的精度,一般至少达到60mm。

笔者在标定长焦相机时方格长宽选择60mm。然后运行项目文件中photo.py脚本文件对棋盘进行多角度拍摄,每按下一次s键,会保存一组左右镜头的照片,照片保存的路径参数可以由用户自由设定,参数名为folder。

# !/usr/bin/python
# -*- coding: utf-8 -*-
import cv2
import timeAUTO = False  # 自动拍照,或手动按s键拍照
INTERVAL = 2  # 自动拍照间隔cap = cv2.VideoCapture(0 + cv2.CAP_DSHOW)  # windows下开启摄像头是采用如下语句(微软特有):cv2.VideoCapture( camera_number + cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 2560)  # 设置双目的宽度
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)  # 设置双目的高度# 显示缓存数
# print(cap.get(cv2.CAP_PROP_BUFFERSIZE))
# 设置缓存区的大小
# cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))#设置FPS
# print('setfps', cap.set(cv2.CAP_PROP_FPS, 25))
# print(cap.get(cv2.CAP_PROP_FPS))counter = 0
utc = time.time()
folder = "images/"  # 拍照文件目录def shot(pos, frame):global counterpath = folder + pos + "_" + str(counter) + ".jpg"cv2.imwrite(path, frame)print("snapshot saved into: " + path)while True:ret, frame = cap.read()if not ret:print("camera is not connected!")breakleft_frame = frame[0:720, 0:1280]right_frame = frame[0:720, 1280:2560]cv2.imshow("left", left_frame)cv2.imshow("right", right_frame)now = time.time()if AUTO and now - utc >= INTERVAL:shot("left", left_frame)shot("right", right_frame)counter += 1utc = nowkey = cv2.waitKey(1)if key == ord("q"):breakelif key & 0xFF == ord("s"):shot("left", left_frame)shot("right", right_frame)counter += 1cap.release()

注意尽量拍摄多组照片,这样可以提高标定效果,标定效果的好坏直接影响到测距的精度。对于短焦相机通常拍摄40组照片即可;长焦相机通常会需要更多组照片,笔者在标定长焦相机时拍摄了60组。

照片拍摄好后,进入matlab标定工具箱,如下图所示。注意:不要选择matlab2020b版本,笔者测试过该版本无法正常使用标定工具箱,可以使用matlab2020a版本。

其中Stero Camera Cailbrator为双目标定工具箱,Camera Cailbrator为单目相机标定工具箱,因此这里选择Stero Camera Cailbrator工具箱。进入工具箱以后,选择Add Images。然后选择左右相机照片的路径,Size of checkerboard square为棋盘中每一个方格的长度,单位为毫米,一定要准确测量方格的长度,如下图所示。

点击确定以后,Radial Distortion Compute选择3 Coefficients和Tangential Distortion,然后点击Calibrate进行校准。不过校准前需要剔除一些原点不一致的点,保证所有照片的原点一致。校准过程中可以可以Reprojection Errors曲线,降低误差,如下图所示。

3 导出标定数据

标定好后将标定数据导入到工作空间,点击Export Camera Parameters即可。此时我们已经拿到标定数据了,为了避免手工获取数据时出错,笔者写了一个脚本可以直接获取标定数据,并保存到表格文件中,之后直接复制粘贴即可。

rowName = cell(1,10);
rowName{1,1} = '平移矩阵';
rowName{1,2} = '旋转矩阵';
rowName{1,3} = '相机1内参矩阵';
rowName{1,4} = '相机1径向畸变';
rowName{1,5} = '相机1切向畸变';
rowName{1,6} = '相机2内参矩阵';
rowName{1,7} = '相机2径向畸变';
rowName{1,8} = '相机2切向畸变';
rowName{1,9} = '相机1畸变向量';
rowName{1,10} = '相机2畸变向量';
xlswrite('out.xlsx',rowName(1,1),1,'A1');
xlswrite('out.xlsx',rowName(1,2),1,'A2');
xlswrite('out.xlsx',rowName(1,3),1,'A5');
xlswrite('out.xlsx',rowName(1,4),1,'A8');
xlswrite('out.xlsx',rowName(1,5),1,'A9');
xlswrite('out.xlsx',rowName(1,6),1,'A10');
xlswrite('out.xlsx',rowName(1,7),1,'A13');
xlswrite('out.xlsx',rowName(1,8),1,'A14');
xlswrite('out.xlsx',rowName(1,9),1,'A15');
xlswrite('out.xlsx',rowName(1,10),1,'A16');
xlswrite('out.xlsx',stereoParams.TranslationOfCamera2,1,'B1');  % 平移矩阵
xlswrite('out.xlsx',stereoParams.RotationOfCamera2.',1,'B2');  % 旋转矩阵
xlswrite('out.xlsx',stereoParams.CameraParameters1.IntrinsicMatrix.',1,'B5');  % 相机1内参矩阵
xlswrite('out.xlsx',stereoParams.CameraParameters1.RadialDistortion,1,'B8');  % 相机1径向畸变(1,2,5)
xlswrite('out.xlsx',stereoParams.CameraParameters1.TangentialDistortion,1,'B9');  % 相机1切向畸变(3,4)
xlswrite('out.xlsx',stereoParams.CameraParameters2.IntrinsicMatrix.',1,'B10');  % 相机2内参矩阵
xlswrite('out.xlsx',stereoParams.CameraParameters2.RadialDistortion,1,'B13');  % 相机2径向畸变(1,2,5)
xlswrite('out.xlsx',stereoParams.CameraParameters2.TangentialDistortion,1,'B14');  % 相机2切向畸变(3,4)
xlswrite('out.xlsx',[stereoParams.CameraParameters1.RadialDistortion(1:2), stereoParams.CameraParameters1.TangentialDistortion,...stereoParams.CameraParameters1.RadialDistortion(3)],1,'B15');  % 相机1畸变向量
xlswrite('out.xlsx',[stereoParams.CameraParameters2.RadialDistortion(1:2), stereoParams.CameraParameters2.TangentialDistortion,...stereoParams.CameraParameters2.RadialDistortion(3)],1,'B16');  % 相机2畸变向量

标定数据文件保存的路径即为当前程序的路径,要想保存到其他路径直接修改脚本中的路径即可,导出的参数如下图所示。

将表格中的数据复制到双目相机配置文件中,其中相机1内参复制到left_camera_matrix中,相机1畸变复制到left_distortion中,相机2内参复制到right_camera_matrix中,相机2畸变复制到right_distortion中,旋转矩阵复制到R中,转移矩阵复制到T中,如下图所示。

至此,双目标定部分就已经完成。注意:标定时照片的尺寸与测距时照片的尺寸一定要保持一致。

Matlab双目相机标定相关推荐

  1. matlab双目相机标定校正_基于双目视觉的无人机避障算法(一)

    讲述在10月到12月所做的所有工作 对于一个无人机自主避障来说,存在着以下流程: 感知:障碍物检测.行人检测.目标检测 SLAM:为无人机提供位置估计,构建稀疏环境地图 路径规划:规划一条从当前位置到 ...

  2. matlab双目相机标定校正_Matlab 单双目相机标定+畸变校正

    Matlab 单双目相机标定+畸变校正 2019年1月14日 2019年1月19日 Matlab 单双目相机标定+畸变校正 不管单目双目标定第1第2步都是必须的 第3步为单目标定,第4步为双目标定 1 ...

  3. matlab双目相机标定校正_双目相机的标定过程详解!-----MATLAB

    基于双目视觉的测距.三维重建等过程中的第一步就是要进行标定.双目相机的标定过程在网上有很多资料,但是基本都没有matlab官方网址讲的好.所以请参考MATLAB官方文档:https://ww2.mat ...

  4. OpenCV | 双目相机标定之OpenCV获取左右相机图像+MATLAB单目标定+双目标定

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 原本网上可以搜到很多关于双目相机标 ...

  5. matlab鱼眼镜头,普通镜头,单目双目相机标定校正(四)

    写这篇文章的目的,是记录相机标定过程和问题,经过试验,记录问题 1.单目相机与双目相机的标定.区别.目的 2.相机拍照时,距离标定板的距离 3.填写参数时.黑白格的大小有影响? 4.参数的设置 5.拍 ...

  6. MatLab的双目相机标定和orbslam双目参数匹配

    本文承接ROS调用USB双目摄像头模组 目录 相机标定 导出为YAML文件(也可以手动粘贴) 生成可用于ORB-SLAM2的yaml文件 生成可用于ORB-SLAM3的yaml文件 2022.5.6补 ...

  7. 双目相机标定图片拍摄规范

    双目相机标定图片拍摄规范 文章目录 双目相机标定图片拍摄规范 前言 一.双目相机的布置 二.标定板的选用 三.图片采集的规范 四.进行标定的软件(选看) 五.靶标布置(选看) 总结 前言 相机标定是进 ...

  8. 双目相机标定模型详解

    根据相机投影成像原理,相机模型包含内参模型及外参模型,可以将三维世界坐标转换为二维像素坐标,具体模型及转换关系如下所示. 其中[u, v]T为矫正后的图像中的点在像素坐标系中的坐标,[xw, yw, ...

  9. Python实现的双目相机标定系统

    Python实现的双目相机标定系统 主要是求基础矩阵来确定两个相机坐标系之间的旋转和平移,继而实现双目相机拍摄图片之间的对齐(校正). copyright@Eason 文末有代码链接. Require ...

最新文章

  1. 华为荣耀8青春版计算机在哪里,华为荣耀8青春版
  2. linux ubuntu 桌面,Ubuntu Linux 入门(三):熟悉 Ubuntu Linux 桌面环境
  3. SQL 查询逻辑处理顺序
  4. wxlogin php,wxlogin.php
  5. Linux如何查看所有用户和用户组信息(cat groups whoami)
  6. Hadoop的安装与配置——搭建完全分布式集群
  7. python删除csv某一行_用Python一步从csv中删除特定的行和列
  8. Yam Finance提案建议将YAM DAO资金库中dApp挖矿奖励的80%转移到uGAS流动性挖矿
  9. linux之service命令
  10. htmlentities和htmlspecialchars 的区别
  11. SAP系统环境整体架构设计总结
  12. 入门masm32编写简单汇编程序并做具体分析
  13. 投资组合管理之投资组合概论
  14. 高速内部总线HSIB和设备总线DB
  15. 【16.8】苹果四代蓝牙耳机+吉萌兔保温杯+小红杯拿铁黑咖啡+公务员教材真题
  16. 关于requests.exceptions.SSLError: HTTPSConnectionPool(host='XXX', port=443)问题
  17. js的slice,splice,split的使用
  18. Sparse Transformers
  19. tensorflow训练过程的日志与监控
  20. git基础(7)--打标签

热门文章

  1. python实现k均值聚类(kMeans)基于numpy
  2. 目前在国际范围内有哪些著名的区块链“独角兽企业”?
  3. 当日竟涨6000万播放,三农新号靠这一个套路爆了
  4. 满二叉树、完全二叉树、平衡二叉树、最优二叉树
  5. oracle 位图索引的创建,Oracle关于位图索引的创建与应用(2)
  6. 老少皆宜,人工智能15本必读读物,你不能错过~
  7. 最新版pycharm的 manage repositories 设置在哪里?
  8. lodash使用方法大全
  9. echarts 折线图 变的圆润
  10. 第8章 KafkaConsumer重置offset