基于Matlab和OpenCV的双目测距(标定和代码教程)

news2024/11/15 3:38:26

基于Matlab和OpenCV的双目测距研究

*摘要*:双目测距的原理是利用左右两个摄像机拍摄同一物体形成的视差来确定物体距摄像机的距离。这其中需要通过标定得出的参数包括内参(焦距fc, 主点Principal point, 径向畸变Radial Distortion, 切向畸变Tangential Distortion、 歪曲畸变skew)和外参(都是以Camera2相对于Camera1的描述,包括旋转矩阵Rotation 、平移矩阵Translation、基础矩阵Fundamental、特征矩阵Essential)。标定完成之后,先使用标定得到的畸变参数构建畸变矩阵并使用cv::stereoRectify()进行立体校正,最后再用立体匹配,获得图像视差图。整个过程最大的问题在于如何有效校正误差和提高效率上。

*一、双目测距概述*

在这里插入图片描述

该公式中f、T通过标定过得,xl-xr通过立体匹配获得。由于该公式忽略了实际测量中可能产生的一切误差,包括正向畸变、切向畸变、图形畸变,所以实际操作中,在标定结束了还需要做立体匹配,使两相机的极线真正平行,减少误差。

*二、关于器材*

\1. 为了保证双目相机左右镜头帧率同步,不建议购买单独的网络摄像机。应购买使用同一主板上的两镜头,比如https://item.taobao.com/item.htm?spm=a1z09.2.0.0.lO4pVl&id=526168710243&_u=g1qsbvok3189

\2. 使用90度及以下的无畸变镜头,可以使skew误差降低至0。

在这里插入图片描述

\3. 该镜头不能使用普通的单接口usb数据线连接,否则在Opencv下会导致镜头无法正常打开。应使用类似于移动硬盘数据线的数据线连接。

\4. 棋盘纸

下载地址:http://docs.opencv.org/2.4/_downloads/pattern.png

注意A4打印时由于打印机会缩放,所以需要自己再实际测量一遍格子之间的间隔。

*三、相机标定*

*3.1基于Matlab标定和参数解读

*3.11 Matab标定步骤*

Matlab(2016a)下的标定比较简单。依次选择 应用程序->Stereo Camera Calibrator ->Add Image->Calibrate(如下图)。

在这里插入图片描述

标定结果如下:

在这里插入图片描述

再点击Export Camera Parameters,将所有数据导出到Matlab工作区间。

图片如下:

在这里插入图片描述

*3**.12* *参数解读*

此处只解读对本项目有意义的参数,关于所有参数的解释可以参考官方文档:

http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html

我们需要所有的误差参数来做立体校正

\1. 内参

在这里插入图片描述

内参矩阵:

在这里插入图片描述

M与Matlab中的IntrinsicMatrix为转置关系,如图:在这里插入图片描述

其中fc(1)为FocalLength0,fc(2) FocalLength1, alph_c为skew值, cc为Principal point(主点)。

畸变系数矩阵:在这里插入图片描述

径向畸变3个(k1,k2,k3)和切向畸变2个(p1,p2)

distCoeffs向量 = [RadialDistortion[0], RadialDistortion[1], TangentialDistoration[0], TangentiaDistoration[1], 0]

\2. 外参

在这里插入图片描述

旋转矩阵(RotationOfCamera2):

在这里插入图片描述

旋转矩阵在理想状态下就是单位矩阵,若不是,则表明有误差,需要进行极线校正。

平移矩阵(TranslationOfCamera2):

相机2在相机1的坐标系中的位置,理想状态下应该是(x,0,0)的形式,若y,z不为0,则两相机极线不平行,需要极线校正。

在这里插入图片描述

特征矩阵(EssentialMatrix)和基础矩阵(FundamentalMatrix

特征矩阵包含了两个摄像头相对位置关系,基础矩阵包含了两个摄像头相对位置关系和各自内参信息。它们的解法如下:

在这里插入图片描述

实现原理可以参考以下博客:

http://blog.csdn.net/chenyusiyuan/article/details/5963256

*3**.13 注意事项*

\1. 由于双目相机拍摄到的照片已经将左右照片合在一起了,但是Matlab只能识别单一的左照片或右照片。因此需要做裁剪,并且裁剪得到的左右图片必须大小完全一致。建议使用Adobe Lightroom做批量裁剪(此教程自行百度),也可以使用Opencv做裁剪(后面叙述)。

\2. 若在Reprojection Errors窗口中发现某一列的误差值太大,应删除该图片重新标定,但为保证精确,总图片不应少于10张。

\3. 不建议使用另一个Matlab的标定工具箱,Calib_gui(calib),因为我在使用中总是出错,错误原因未知。

****3.2基于OpenCV的双目标定

*3.2**1 裁剪图像*

因为我们使用的相机将左右图片都合成一张了,所以需要在标定前将其裁剪,裁剪代码如下:

在这里插入图片描述

其中rawImg是读取的图片,imgSize是类型为Size的变量,比如:

Size imgSize(1280, 720);

*3.22* *图像预处理*

此步骤可以省略,图像预处理的目的是使得白色棋盘格及其边缘在整个图像上更为突出。代码如下
在这里插入图片描述
关于预处理前后的误差大小有待进一步讨论,但是无疑的是做了预处理比没做的效果要好。

3.23 寻找角点

角点坐标是标定函数cameraCalibrate()的第2个输入参数。角点是指黑白方块相接的方块定点部分,主要由函数findChessboardCorners()完成查找,值得注意的是,该函数传入的图像矩阵必须是8-bit灰度图,所以必须做灰度转换。
寻找角点函数部分代码如下:

未完待续.......,

3.24 寻找物点

物点,世界坐标系中的点。该坐标类型为vector<vector>, 是标定函数calibrateCamera的第一个参数。其实就是将chessboard中的二维坐标乘以棋盘间隔并加上Z坐标(通常为0)。
代码如下:

未完待续.......,

3.25标定CalibrateCamera
先对左右镜头分别标定,获得矩阵内参矩阵cameraMatrix、畸变矩阵distCoeffs, 再双目标定,获得旋转矩阵(R),平移矩阵(T),特征矩阵(E),基础矩阵(F)。TermCriteria表示迭代终止的条件。

至此,相机标定完成。

四、立体校正

未完待续.......,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

828华为云征文 | 使用Flexus云服务器X实例部署Kubernetes图形化管理平台

828华为云征文 | 使用Flexus云服务器X实例部署Kubernetes图形化管理平台 1. 基础部署环境说明2. 部署Kubernetes环境3. 部署Kubernetes Dashboard4. 创建登录账号token5. 访问Kubernetes Dashboard 1. 基础部署环境说明 Kubernetes作为当今最流行的容器编排平台&#xff0c;随着…

【Kubernetes】常见面试题汇总(七)

目录 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; 21.简述 Kubernetes 中 Pod 的重启策略&#xff1f; 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; Kubernetes 中创建一个 Pod 涉及多个组件之间联动&#xff0c;主要流程如下&#xff1a; &#…

如何让Google收录我的网站?

其实仅仅只是收录&#xff0c;只要在GSC提交网址&#xff0c;等个两三天&#xff0c;一般就能收录&#xff0c;但收录是否会掉&#xff0c;这篇内容收录了是否有展现&#xff0c;排名&#xff0c;就是另外一个课题了&#xff0c;如果不收录&#xff0c;除了说明你的网站有问题&…

人工智能赋能千行百业

人工智能将赋能千行百业 人工智能&#xff08;AI&#xff09;作为当今科技领域的核心驱动力之一&#xff0c;正以前所未有的速度和广度赋能千行百业&#xff0c;深刻改变着我们的生产、生活方式以及社会经济的运行模式。以下是人工智能在多个行业中的赋能作用的几个关键方面&am…

QT多个界面

主函数 #include "widget.h" #include "second.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;Second s;QObject::connect(&w,&Widget::my_signals,&s,&Second::my_slots);w.…

全面质量管理知识竞赛题库

全面质量管理知识竞赛题库 第 1 章 质量 三、单项选择题 1.根据 ISO9000 标准的定义&#xff0c;“质量”是指“客体的一组固有特性满足要求的程度”&#xff0c;以下&#xff08; B &#xff09;不属于产 品的“固有特性”。 A.产品的寿命 B.产品的价格 C.产品制造和使用的…

民宿|基于java的民宿推荐系统(源码+数据库+文档)

民宿推荐系统 目录 基于java的民宿推荐系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 前台&#xff1a; 后台&#xff1a; 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌…

react-问卷星项目(1)

学习的一位MOOC老师的经验&#xff0c;记录一下学习的过程 本项目技术栈&#xff1a;React18TS4AntDesign5Next.js13 项目&#xff1a;低代码&#xff0c;B/C react官方文档 核心价值&#xff1a; 组件化&#xff1a;不是React原创&#xff0c;但在React中流行开来 数据驱…

怎么用python打开文件

python文件读写文件是最常见的IO操作。Python内置了读写文件的函数&#xff0c;用法和C是兼容的。 读写文件前&#xff0c;我们先必须了解一下&#xff0c;在磁盘上读写文件的功能都是由操作系统提供的&#xff0c;现代操作系统不允许普通的程序直接操作磁盘。 读写文件就是请…

使用java对栅格数据的处理,对栅格文件进行导入导出

需求背景&#xff1a; 对栅格文件进行导入导出&#xff08;使用代码的方式&#xff0c;非命令方式&#xff09;&#xff1b; 当然也可以使用代码和GDAL的方式进行&#xff0c;但是GDAL配置部署不便捷&#xff0c;故选用GeoTools方式来实现。 ps&#xff1a;若是使用命令方式&am…

大模型api谁家更便宜

1 openai 可点此链接查询价格&#xff1a;https://openai.com/api/pricing/ 2 百度 可点此链接查询价格&#xff1a;https://console.bce.baidu.com/qianfan/chargemanage/list 需要注意&#xff0c;百度千帆平台上还提供其他家的模型调用服务&#xff0c; 如llama, yi-34b等…

IDE快速复制文件名

在很多情况下我们需要复制IDE中文件的名称&#xff0c;习惯性的F2却不能重命名 如图操作又比较繁琐 解决方法⭐⭐⭐ 其实直接CtrlC可以复制文件名&#x1f921;&#x1f921;&#x1f921;

7-Zip压缩包如何添加密码,加密后如何取消

压缩包文件大家经常使用&#xff0c;最熟悉的肯定是RAR、ZIP格式压缩文件&#xff0c;但是7z压缩文件格式也很好用&#xff0c;它是三种压缩文件格式中压缩率最大的。想要将文件压缩到最小&#xff0c;使用7z格式可以达到最大化。那么在使用7z压缩格式的时候&#xff0c;我们可…

银河麒麟V10系统软件商店手动更新方法

银河麒麟桌面操作系统V10重新安装之后&#xff0c;有些软件商店未能及时的自动更新&#xff0c;从而软件商店里无法获取最新的软件应用&#xff0c;这个时候就需要我们手动的进行升级更新一下软件商店了&#xff0c;更新之后软件商店里的内容就会增加不少&#xff0c;那么&…

阿尔泰科技案例解析-炼钢厂设备监测解决方案!

案例背景 在一家大型钢铁冶炼厂中&#xff0c;熔炉是生产过程的核心设备&#xff0c;广泛应用于金属冶炼、铸造和加工步骤&#xff0c;如钢铁的冶炼和精炼。为了确保熔炉在最佳状态下运行&#xff0c;并防止潜在的故障或事故&#xff0c;该厂需要对熔炉及厂房内相关设备的多个…

开发模型例题

答案&#xff1a;A 解析&#xff1a;瀑布模型是跟对需求明确的项目 增量模型是将需求分为多个阶段&#xff0c;适合一开始需求不明确的 演化模型适合用户需求不清&#xff0c;需求经常变化的情况 螺旋模型适合庞大&#xff0c;复杂且具有高风险的系统

F12抓包07:Network界面功能详细介绍

课程大纲 ​ 本课介绍F12“网络”&#xff08;Network&#xff09;tab菜单界面的功能区域和使用。 8.1 录制与清空 8.2 过滤与搜索 1、url过滤 2、全局搜索 8.3 保留日志 勾选“保留日志”&#xff1a;刷新界面后请求记录不清空&#xff1b;否则&#xff0c;清空历史请求记录…

西门子博途PLC跑马灯的简单编程方式

新手必学的PLC程序&#xff0c;老电工转型电气工程师必看&#xff01;#自动化##PLC##电工##电气##学习##编程##跑马灯##西门子##外企# 工控人加入PLC工业自动化精英社群 工控人加入PLC工业自动化精英社群

AutoIT:强大的RPA自动化脚本神器,安装到使用的保姆级教程!

作为一个经常需要在Windows上处理各种繁琐任务的“码农”&#xff0c;我对各种自动化工具有着深厚的兴趣。尤其是AutoIT这种工具&#xff0c;让人简直爱不释手。 我有时候需要写一大堆技术文档&#xff0c;里面各种表格、数据&#xff0c;手动操作简直让人头大。那时候&#x…

5款AI头像生成神器,独特头像不是梦!

在各种应用程序和社交媒体平台上&#xff0c;头像几乎无处不在。它不仅仅是个人的标识&#xff0c;更是展现个性和特征的一种方式。随着人工智能技术的不断进步&#xff0c;各种头像生成器应运而生&#xff0c;让我们能够创造出更加独特和个性化的头像。使用这些AI头像生成器非…