双目深度估计原理立体视觉

双目深度估计原理&立体视觉

  • 0. 写在前面
  • 1. 双目估计的大致步骤
  • 2. 理想双目系统的深度估计公式推导
  • 3. 双目标定公式推导
  • 4. 极线校正理论推导

0. 写在前面

双目深度估计是通过两个相机的对同一个点的视差来得到给该点的深度。
标准系统的双目深度估计的公式推导需要满足:1)两个相机的光轴水平; 2) 两个相机焦距分辨率一致,也即内参一致;3)两个相机的成像平面水平,两个相机坐标系之间只存在x轴方向的平移关系。

但是得到的双目系统,不一定满足上述的三个条件,两个相机的坐标系之间大概率存在某个旋转平移关系,因此在使用标准系统的双目估计原理公式之前,需要首先完双目相机之间的外参标定,得到两者的旋转平移关系。

1. 双目估计的大致步骤

  • 摄像头校准: 首先需要对双目摄像头进行校准,确保两个摄像头的成像参数(如焦距、主点位置、畸变参数等)已经准确标定。
  • 立体视觉匹配: 使用立体视觉技术对左右两个摄像头捕获的图像进行匹配。这通常涉及在两个图像中找到对应的特征点或特征区域,比如角点、边缘等。
  • 视差计算: 通过匹配得到的对应点,计算它们在左右图像之间的视差(disparity)。视差是指同一物体在两个图像中对应点的像素偏移量,视差越大表示物体距离摄像头越近。
  • 三角测距: 利用视差信息和摄像头之间的几何关系,可以使用三角测量原理计算物体的距离。这通常需要知道摄像头的基线长度(两个摄像头之间的距离)和相机的内参(如焦距、主点位置等)。
  • 深度估计: 根据视差信息和摄像头参数,可以进行深度估计,得到物体到摄像头的距离信息。这通常是通过将视差转换为实际距离的公式来实现的。

如果两个相机因为安装位置或者某些原因造成了不满足理想双目系统的萨格条件,就需要一些复杂的方法,最简单的方法就是得到两者的旋转平移矩阵,完成其中一个相机的旋转和平移,构造一个虚拟的相机(安装位置姿态与另一个相机之间满足理想双目系统)。

2. 理想双目系统的深度估计公式推导

双目深度估计是通 过两个相机的对同一个点的视差来得到给该点的深度。只要得到某个点在两个图片中的视差,就可以得出该点的深度。
在这里插入图片描述
如图所示, B B B为基线长度, f f f为相机焦距, d d d为视差, x l , x r x_l,x_r xl,xr分别表示目标点在左右相机图像中的的像素u坐标。其中 f , B f,B f,B是固定值,深度计算步骤如下:
{ f z = x l x f z = x r x − B \begin{align} \begin{cases} {f \over z} = {x_l \over x } \\ {f \over z} = {x_r \over x-B} \end{cases} \end{align} {zf=xxlzf=xBxr
得,
z = f B x l − x r = f B d \begin{align} z = {fB \over x_l - x_r} = {fB \over d} \end{align} z=xlxrfB=dfB
因此只要知道目标点在两个图片中得像素差,就能得到深度z。

3. 双目标定公式推导

因为得到得双目系统不一定为理想状态,所以需要得到两者得位姿关系。

事先声明如下定义:
p w p_w pw: 某目标点P在世界系下的笛卡尔3D坐标
p c l p_{cl} pcl:该点在左相机坐标系中的笛卡尔3D坐标
p c r p_{cr} pcr: 该点在右相机坐标系中的笛卡尔3D坐标
R c l w R_{cl}^w Rclw: 旋转关系convert a point from left camera coordinate to world
R c r w R_{cr}^w Rcrw: 旋转关系convert a point from right camera coordinate to world
t c l w t_{cl}^w tclw: 平移关系convert a point from left camera coordinate to world
t c r w t_{cr}^w tcrw: 平移关系convert a point from right camera coordinate to world
可以得到如下的关系
{ p w = R c l w ⋅ p c l + t c l w p w = R c r w ⋅ p c r + t c r w \begin{align} \begin{cases} p_w = R_{cl}^w \cdot p_{cl} + t_{cl}^w \\ p_w = R_{cr}^w \cdot p_{cr} + t_{cr}^w \end{cases} \end{align} {pw=Rclwpcl+tclwpw=Rcrwpcr+tcrw
式(3)可得
R c l w ⋅ p c l + t c l w = R c r w ⋅ p c r + t c r w \begin{align} R_{cl}^w \cdot p_{cl} + t_{cl}^w = R_{cr}^w \cdot p_{cr} + t_{cr}^w \\ \end{align} Rclwpcl+tclw=Rcrwpcr+tcrw
同乘 R c r w − 1 {R_{cr}^w}^{-1} Rcrw1 得,

R c r w − 1 ⋅ R c l w ⋅ p c l + R c r w − 1 ⋅ t c l w = R c r w − 1 ⋅ R c r w ⋅ p c r + R c r w − 1 ⋅ t c r w R c r w − 1 ⋅ R c l w ⋅ p c l + R c r w − 1 ⋅ t c l w = p c r + R c r w − 1 ⋅ t c r w p c r = R c r w − 1 ⋅ R c l w ⋅ p c l + R c r w − 1 ⋅ t c l w − R c r w − 1 ⋅ t c r w \begin{align} {R_{cr}^w}^{-1} \cdot R_{cl}^w \cdot p_{cl} + {R_{cr}^w}^{-1} \cdot t_{cl}^w &={R_{cr}^w}^{-1} \cdot R_{cr}^w \cdot p_{cr}+ {R_{cr}^w}^{-1} \cdot t_{cr}^w \\ {R_{cr}^w}^{-1} \cdot R_{cl}^w \cdot p_{cl} + {R_{cr}^w}^{-1} \cdot t_{cl}^w &= p_{cr}+ {R_{cr}^w}^{-1} \cdot t_{cr}^w \\ p_{cr} &= {R_{cr}^w}^{-1} \cdot R_{cl}^w \cdot p_{cl} + {R_{cr}^w}^{-1} \cdot t_{cl}^w - {R_{cr}^w}^{-1} \cdot t_{cr}^w \end{align} Rcrw1Rclwpcl+Rcrw1tclwRcrw1Rclwpcl+Rcrw1tclwpcr=Rcrw1Rcrwpcr+Rcrw1tcrw=pcr+Rcrw1tcrw=Rcrw1Rclwpcl+Rcrw1tclwRcrw1tcrw
最终得,
p c r = R c l c r ⋅ p c l + t c l c r \begin{align} p_{cr} &= R_{cl}^{cr} \cdot p_{cl} + t_{cl}^{cr} \\ \end{align} pcr=Rclcrpcl+tclcr
其中,
R c l c r = R c r w − 1 ⋅ R c l w t c l c r = R c r w − 1 ⋅ t c l w − R c r w − 1 ⋅ t c r w \begin{align} R_{cl}^{cr} &= {R_{cr}^w}^{-1} \cdot R_{cl}^w \\ t_{cl}^{cr} &= {R_{cr}^w}^{-1} \cdot t_{cl}^w - {R_{cr}^w}^{-1} \cdot t_{cr}^w \end{align} Rclcrtclcr=Rcrw1Rclw=Rcrw1tclwRcrw1tcrw
注意,式(9)(10)中左右相机世界系的位姿在完成左右相机各自的标定以后,就已经得到了。所以可以直接使用。一对棋盘格位姿的左右相机照片,就可以构成式(9)(10)两个。因为拍摄了多张图片,利用最小二乘法等某种非线性优化的的方式,最小化误差,即可得到我们最佳估计的 矩阵,有了这两个矩阵,就可以进一步进行两个相机的极线修正了。式(9)为右相机成像平面到左相机成像平面的旋转矩阵(convert a point from left camera coordinate to right camera).

4. 极线校正理论推导

通过3得到的两者的位姿关系,完成两个相机的极线矫正。进而通过2的步骤完成深度估计

极线较正完成的是两个相机位置姿态的调整,使得左右相机达到理想双目系统的位置关系。下面是较正前后的位置状态对比‘极线校正的基本方法是对两幅图像做投影变换,使两幅图像上的对应匹配点所在的极线共线。本质上就是将相机固有的透视矩阵经过相应的几何变换得到新的透视矩阵,使得转换后的两幅图像的极线保持水平。最常见的校正方法就是Bouguet极线校正方法。opencv中的API名称为 cvStereoRectify

  • 校正前的双目相机位姿关系
    在这里插入图片描述
  • 校正后的双目相机位姿关系
    在这里插入图片描述
    计算某个特征点的视差是在校正后的双目相机像平面中求得,需要注意的是,校正后的相机位置姿态是一个虚拟位置姿态,与原来的位置之间存在一个旋转关系(假如较正前后的光心位置一致),这个旋转关系就是单应矩阵,也是IPM算法思想的基础。

Bouguet极线校正方法:左右相机成像平面各旋转一半,使得左右图像重投影造成的误差最小,左右视图的共同面积最大。
使用 Bouguet 算法进行其极线校正的基本原理为:首先要最大限度得降低两幅双目图像中各帧的相同投影频次,其次要使每一帧的相同投射误差最小,最后尽量增加其观测的面积。设右相机成像平面到左相机成像平面的旋转矩阵为 cR ,然后把它分解为两个子旋转矩阵 1r 和 2r 。当使用这两个左右转换矩阵分别旋转左右相机时,两相机刚好能产生 1/2 角点上的旋转量,因此主光线向量的朝向能和旋转前维持一致。

后边的过程等以后需要的时候再做研究

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

https://zhuanlan.zhihu.com/p/362018123
chrome-extension://oemmndcbldboiebfnladdacbdfmadadm/https://engineering.purdue.edu/~byao/Thesis/%E7%A1%95%E5%A3%AB%E8%AE%BA%E6%96%87-%E9%9F%A9%E4%BF%A1_ZJU16.pdf
https://blog.csdn.net/x_r_su/article/details/52683754

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法每日一练】

蛮有意思的的一道题,最后要判断能否成为一种1~n的全排列,我最这样做的: 整个数组先排序一下。假设遍历到了i,那就判断前面b和r的个数,但是有想到了后面可能还会对前面的结果产生影响,所以就抛弃了这个想法…

二、再识VUE-MVVM

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 MVVM Vue.js 专注于 MVVM 模型的 ViewModel 层。它通过双向数据绑定把 View 层和 Model 层连接了起来。实际的 DOM 封装和输出格式都被抽象为了 Directives 和 Filters。 ViewModel 一个同步 Model 和 View 的对象。在 Vue.js…

Stable Diffusion基础:ControlNet之线稿成图

今天继续给大家分享Stable Diffusiion的基础能力:ControlNet之线稿成图。 所谓线稿就是由一条条的线段组成的图形,主要用于绘画和设计领域的打底稿、表达构想和预见最终效果。 所谓线稿成图就是利用 Stable Diffusion ControlNet 的能力,依…

极目楚天 共襄星汉 | 同元软控受邀参加2024年中国航天大会

4月23日至26日,2024 年中国航天大会(CSC2024)在湖北省武汉市成功举办。大会由中国宇航学会和中国航天基金会联合主办,以“极目楚天 共襄星汉”为主题,汇聚国内外航天领域知名专家、学者、管理者,深入探讨航…

el-date-picker 禁用时分秒选择(包括禁用下拉框展示)

2024.04.26今天我学习了对el-date-picker进行禁用时分秒, 在使用el-date-picker组件的时候,我们有可能遇到需要把时分秒的时间固定,然后并且不能让他修改: 1714120999296 比如右上角的这个时间,我们要给它固定是‘08:…

C++中auto关键字的用法详解

1.简介 auto作为一个C语言就存在的关键字,在C语言和C之间却有很大区别。 在C语言中auto修饰的变量,是具有自动存储器的局部变量,但因为局部变量默认类别默认是auto修饰导致一直没有人去使用它。 C11中,标准委员会赋予了auto全新…

红魔8/8Pro/8SPro手机升级安卓14版RedMagic9.0系统+降级出厂救砖刷机

红魔8系列手机也终于引来了安卓14系统的更新,该系统为最新的RedMagic9.0,目前属于公测版本,如果你已经升级了官方UI8.0最新版系统,并且拥有公测资格,可以直接在线检测到最新版UI9.0系统。9.0系统目前对比之前的8.0的版…

记录k8s以docker方式安装Kuboard v3 过程

原本是想通过在k8s集群中安装kuboad v3的方式安装kuboard,无奈在安装过程中遇到了太多的问题,最后选择了直接采用docker安装的方式,后续有时间会补上直接采用k8s安装kuboard v3的教程。 1.kuboard安装文档地址: 安装 Kuboard v3 …

【Jenkins】持续集成与交付 (一):深入理解什么是持续集成?

🟣【Jenkins】持续集成与交付 (一):深入理解什么是持续集成? 1、软件开发生命周期与持续集成2、 持续集成的流程3、持续集成的好处4、Jenkins的应用实践5、结语💖The Begin💖点点关注,收藏不迷路💖 1、软件开发生命周期与持续集成 软件开发生命周期(SDLC)是指软…

windows11安装nginx

1.解压nginx安装包到没有中文的目录 2.双击运行nginx.exe 3.任务管理器查看是否有nginx进程 4.任务管理器->性能->资源监视器 5.网络->侦听端口,查看nginx侦听的端口,这里是90端口

MySQL怎么看死锁记录

这个结果分成三部分: (1) TRANSACTION,是第一个事务的信息; (2) TRANSACTION,是第二个事务的信息; (3)WE ROLL BACK TRANSACTION (1),是最终的处理结果,表示回滚了第一个事务。 第一个事务的信…

解决Linux CentOS 7安装了vim编辑器却vim编辑器不起作用、无任何反应

文章目录 前言一、解决vim不起作用(卸载重新安装)1.重新安装vim2.测试vim是否能正常使用 二、解决vim: error while loading shared libraries: /lib64/libgpm.so.2: file too short报错三、解决vim编辑器不能使用方向键和退格键问题 remove vim-common …

Scrapy 爬虫教程:从原理到实战

Scrapy 爬虫教程:从原理到实战 一、Scrapy框架简介 Scrapy是一个由Python开发的高效网络爬虫框架,用于从网站上抓取数据并提取结构化信息。它采用异步IO处理请求,能够同时发送多个请求,极大地提高了爬虫效率。 二、Scrapy运行原…

mysql事故复盘: 单行字节最大阈值65535字节(原创)

背景 记得还在银行做开发,投产上线时,项目发版前,要提DDL的sql工单,mysql加1个字段,因为这张表为下游数据入湖入仓用的,长度较大。在测试库加字段没问题,但生产库字段加不上。 先说结论 投产…

【AIGC调研系列】来认识一下:WebLlama

WebLlama是一个基于Meta Llama 3构建的代理,专门为了网页导航和对话进行了微调。它是由McGill University的自然语言处理团队开发的研究项目,旨在通过对话进行网页浏览的智能代理[1][2]。WebLlama的目标是构建有效的人为中心的代理,帮助用户浏…

uniapp 微信小程序 获取openid,手机号进行登录,配合后端

流程:登录注册功能,通过uni.getUserProfile获取wxcode,通过wxcode传给后端获取openid,sessionkey,unionid。 通过<u-button type="success" open-type="getPhoneNumber" @getphonenumber="decryptPhoneNumber">一键登录</u-button>…

快速构建Spring boot项目

1、Idea里新建项目 2、创建HelloController 3、运行 4、开发环境热部署 pom.xml 查看目前已有的依赖 配置properties 设置 ctrlshiftalt/ 新版本的compiler.automake.allow.when.app.running已经不在registry里面了&#xff0c;在settings里面的Advanced settings里面Allow au…

前端页面单元测试最佳策略:全面涵盖逻辑、组件、流程、UI及性能优化测试,全面保障软件应用的质量

页面级别的测试要求我们从更宏观的角度审视应用&#xff0c;不仅关注单个组件的正确性&#xff0c;还要确保组件间的协作无误&#xff0c;以及用户在应用中的完整体验。通过集成测试、E2E测试和场景测试&#xff0c;我们可以更全面地覆盖应用的各种使用情况&#xff0c;提高软件…

《HCIP-openEuler实验指导手册》1.6 Apache静态资源配置

知识点 常用用途&#xff1a; 软件仓库镜像及提供下载服务&#xff1a; 配置步骤 删除网站主目录中的文件&#xff08;本实验机目录为/home/source ip为192.168.12.137 端口为81&#xff09; cd /home/source rm -rf *在主目录中新建6个文件夹如下图 mkdir test{1..6}新建…

线性神经网络示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个线性神经网络模型pytorch程序,最后打印5个条件分别的影响力。 一 在这个场景中&#xff0c;一个线性神经网络&…