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

2024-04-30 12:52

本文主要是介绍双目深度估计原理立体视觉,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

  • 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.chinasem.cn/article/948922

相关文章

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4

MySQL中Next-Key Lock底层原理实现

《MySQL中Next-KeyLock底层原理实现》Next-KeyLock是MySQLInnoDB存储引擎中的一种锁机制,结合记录锁和间隙锁,用于高效并发控制并避免幻读,本文主要介绍了MySQL中... 目录一、Next-Key Lock 的定义与作用二、底层原理三、源代码解析四、总结Next-Key L