关于双目摄像头测距原理,最近在看关于双目摄像机成像的项目,找关于双目摄像头标定的c++代码,但是发现自己对双目摄像机的成像原理不清楚,所以看代码和看天书一样。这篇就写给零基础接触双目摄像机成像原理的小伙伴,等看完这篇之后再去找类似的c++、python标定代码,就简单很多。
当然,之后也会介绍,关于几个坐标系(世界坐标系、像素坐标系、图片坐标系)的转化。

**视差的概念:**是指从两个不同位置观察同一个物体时,此物体在视野中的位置变化与差异。从两个观察点看目标,两条视线之间的夹角叫做这两个点的视差角,两点之间的距离称作视差基线。

为什么单目摄像机不能测深度?
下图从物理原理上展示了为什么单目相机不能测量深度值而双目可以。我们看到红色线条上三个不同远近的黑色的点在下方相机上投影在同一个位置,因此单目相机无法分辨成的像到底是远的那个还是近的那个。

双目立体视觉深度相机测距流程:
(1)需要对双目相机进行标定,得到两个相机的内外参数、单应矩阵。
(2) 根据标定结果对原始图像进行校正,校正后的两张图像位于同一平面且互相平行。
(3)对校正后的两张图像进行像素点匹配。
(4)根据匹配结果计算每个像素的深度,从而获得深度图

理想双目相机成像模型:
首先我们从理想的情况开始分析:假设左右两个相机位于同一平面(光轴平行),且相机参数(焦距f)一致。那么深度值的推到原理和公式如下:

根据上述推导,空间点p离相机的距离(深度)z=f*b/d,可以发现如果要计算深度z,必须要知道:
(1)相机焦距f,左右相机基线b。这些参数可以通过先验信息或者相机标定得到。
(2)视差b。需要知道左相机的每个像素点(Xl, Yl)和右相机中对应点(Xr,Yr)的对应关系。这是双目视觉的核心问题。
极限约束
那么问题来了,对于左图中的一个像素点,如何确定该点在右图中的位置,可以通过极限约束。
什么是极线呢?如下图所示,C1,C2是两个相机,p是空间中一点,P和两个相机中心点C1、C2形成了三维空间中的一个平面PC1C2,称为极平面。极平面和两幅图像相交于两条直线,这两条直线为极线。p在相机C1中的成像点是P1,在相机C2中的成像点是P2,但p的位置事先是未知的。
我们的目标是:对于左图中的P1点,寻找它在右图中的对应点P2,这样就能确定P点的空间位置,也就是我们想要的空间物体和相机的距离。

所谓极线约束,就是指当同一个空间点在两幅图像上分别成像时,已知左图投影点P1,那么对应右图投影点P2一定在相对于P1的极线上,这样可以极大的缩小匹配范围。


细心的朋友会发现上述过程考虑的情况(两相机共面且光轴平行,参数相同)非常理想,相机C1、C2如果不在同一直线上怎么办?

非理想双目相机成像模型
事实上,这种情况非常常见,因为有些场景下两个相机需要独立固定,很难保证光心C1、C2完全水平,即使是固定在同一基板上也会因为装配的原因导致光心不水平。

有办法哟!

我们先来看看这种情况下拍摄的两张左右图片,左图中三个十字标志的点,在右图中对应的极线是右图中的三条白线,也就是对应的搜索区域。我们看到这三条线并不是水平的,如果进行逐点搜索效率非常低。
怎么办呢?
把不理想的转化为理想情况就好了。这就是图像矫正技术。
图像校正技术是通过分别对两张图片用单应矩阵变换得到的,目的就是把两个不同方向的图下个平面重新投影到同一平面且光周相互平行,下图中的黄色平面,这样就可以用前面理想情况下的模型了,两个相机的极线也变成水平的了。


经过校正后,从上图中我们可以看到越近的物体视差越小,越近的物体视差越大,和我们的常识一致。
上面讲到的对于左图的一个点,沿着它在右图水平极线方向寻找和它最匹配的像素点,说起来简单,但实际操作起来并不容易。
(1)实际上要保证两个相机完全共面且参数一致是非常困难的,而且在计算中会产生误差积累,因此对于左图中的一个点,其右图的对应点不一定恰好在极线上。应该是在极线附近,所以搜索范围需要适当放宽。
(2)单个像素点进行比较鲁棒性很差,很容易受到光照变化和视角不同的影响。
(3)基于滑动窗口的图像匹配
上述问题的解决办法是:使用滑动窗口。对于左图中一个像素点(左图中的红色方框中心),在右图中从左到右用一个尺寸滑动窗口内的像素和它计算相似程度,相似度的度量有很多方法,比如误差平方法,ssd。ssd越小的位置对应的像素点就是最佳匹配结果。

具体操作中还有很多实际问题,比如滑动窗口的尺寸。
基于能量优化的图像匹配
目前比较主流的方法都是基于能量优化的方法来实现匹配。能量优化通常会定义一个能量函数。比如对于两张图中像素点的匹配问题来说,我们定义的能量函数如下图公式1.
(1)在左图中所有的像素点和右图中对应的像素点越近似越好,反映在图像里就是灰度值越接近越好,也就是下图公式2的描述。
(2)在 同一张图片里,两个相邻的像素点视差(深度值)也应该相近。也就是下图公式3的描述。

上述公式1代表的能量函数就是著名的马尔科夫随机场(Markov Random Field)模型。通过对能量函数最小化,我们最后得到了一个最佳的匹配结果。有了左右图的每个像素的匹配结果,根据前面的深度计算公式就可以得到每个像素点的深度值,最终得到一幅深度图。

原文转自:https://zhuanlan.zhihu.com/p/32199990

最详细的双目摄像头测距离(深度)的原理相关推荐

  1. 【OpenCV】双目相机测距及其深度恢复原理及其算法流程

    1. 数学模型 2.整体流程 获取标定与图像数据==>stereoRectify==>initUndistortRectifyMap==>remap==>bg/sgbm恢复出视 ...

  2. 【双目相机】双目摄像头测距并导出世界坐标数据进入txt【python】

    1.双目测距,通过鼠标点击像素导出像素的世界坐标 代码如下,核心是threeD,图片内所有像素对应的世界坐标都储存在threeD内 #从excel里读取数据 #144行fps帧率不准 import c ...

  3. 37、免驱动USB双目同步测距3D活体深度检测和RV1126结合V4L开发USB摄像头使用

    基本思想:需要使用红外双目摄像头在rv1126上进行活体检测,然后将画面实时返回到桌面上,记录一下,下图是红外摄像头,来自淘宝网(深圳市国迅智能科技有限公司) 本菜鸡自己的usb罗技摄像头 一:购买可 ...

  4. Android双目三维重建:Android双目摄像头实现双目测距

    Android双目三维重建:Android双目摄像头实现双目测距 目录 Android双目三维重建:Android双目摄像头实现双目测距 1.开发版本 2.Android双目摄像头 3.双目相机标定 ...

  5. zed双目摄像头 +yolo进行双目测距

    zed双目摄像头 +yolo进行双目测距 首先根据你电脑或者jetson系列中的cuda版本下载对应的zed sdk,去安装zed api 安装过程可能会出现import pyzed.sl as sl ...

  6. Mobileye采用单目摄像头做ADAS太不精确?用双目摄像头的“中科慧眼”认为双目测距算法才是最精确的

    Mobileye采用单目摄像头做ADAS太不精确?用双目摄像头的"中科慧眼"认为双目测距算法才是最精确的 时间 2016-01-05 18:53:01   36氪 原文   htt ...

  7. 前车碰撞预警——FCW,基于深度学习和单目摄像头测距的前车碰撞预警源码

    前车碰撞预警--FCW,基于深度学习和单目摄像头测距的前车碰撞预警源码. 单目测距,多目标跟踪. 车辆检测,智能adas,FCW,价格只包括源码及设计文档讲解. 我使用的版本说明: gpu版本: an ...

  8. 基于深度学习和单目摄像头测距的前车碰撞预警源码

    前车碰撞预警--FCW,基于深度学习和单目摄像头测距的前车碰撞预警源码 单目测距,多目标跟踪. 车辆检测,智能adas,FCW,编号只包括源码及设计文档讲解. 我使用的版本说明: gpu版本: ano ...

  9. 双目摄像头的标定和测距(一)

    双目摄像头的标定和测距 摄像头测试 摄像头标定 图像获取 摄像头标定 摄像头测距 运行环境 Ubuntu 18.04 LTS ROS version Melodic OpenCV1 version 3 ...

  10. 双目测距代码 python opencv 利用双目摄像头拍照,测距

    环境:ubuntu14.04 软件:opencv3.3 +pycharm 好久没有写博客了,手都感觉好生疏,最近一直在研究工控机,水下机器人等,好不容易闲下来,没办法呀,继续前行吧,前面一直说双目测距 ...

最新文章

  1. KBMMW 4.80.00 发布
  2. [PAPER-RECORD]
  3. 【APICloud系列|31】百度导航功能的实现
  4. 【架构师】【数据库基础】【笔记 01】快速了解数据库系统的重要概念02
  5. 斯坦福用普通相机和激光笔实现“穿墙透视”,连你的证件都能看清
  6. 专业的现场调音机架软件 - Deskew Technologies Gig Performer 4 Mac
  7. 远程桌面未知的用户名_电脑在远程桌面连接时出现用户名密码错误该怎么办?...
  8. 《魔鬼搭讪学》的笔记……
  9. ubuntu安装nginx详细步骤
  10. 企业为提高团队协作,一般都会使用什么办公工具?
  11. 揭秘java虚拟机 kindle_Kindle有一个java虚拟机
  12. 几种常用网页文本编辑器总结
  13. 给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和
  14. 基于git(分布式版本控制系统)的各种服务器权限工具对比 Gitlab服务器搭建 以及邮箱、LDAP配置 实现公司多人协同开发
  15. VS没有CUDA模块问题
  16. 机器视觉算法工程师试题
  17. c语言入门——三子棋(N子棋)
  18. 计算机 usb 检测,怎样检测计算机USB接口类型
  19. 中国地质调查局:汶川地震原因已有初步结论
  20. 字母和数字半角和全角的问题

热门文章

  1. 视频转换器如何将腾讯QLV格式转换成MP4视频文件
  2. 超级终端连接华为交换机_Win8系统使用超级终端连接华为交换机的方法
  3. 基于SpringBoot的社区物业管理系统(设计与实现详解)
  4. centos7 安装最新破解(awvs12)Acunetix Vulnerability Scanner12破解和批量导入和利用python删除任务
  5. 实验二:线性时间选择
  6. java 局域网广播_java UDP实现局域网广播 | 学步园
  7. 光耦驱动单向可控硅_双向晶闸管的触发用的光耦驱动mos桥,光耦
  8. win7桌面图标消失的3种解决方案
  9. oracle字典在线查字手写,在线字典手写输入
  10. 名字打架小游戏 java_闲暇极品MD5 能用名字打架的小游戏