假设你有两个摄像头,一个左,一个右。这两台摄像头在同一个 Y 轴和 Z 轴上对齐。基本上,唯一的区别就是它们的 X 值(间距)。
双目视觉示意图
~~我们的目标是估计 O 点(表示图像中的任意像素)的 Z 值,即距离。(实际上像素点对应的三维坐标值都可以拿到);
·X 是对齐轴
·Y 是高度
·Z 代表深度
——两个蓝色的平面对应着每个相机拍摄的图像 ;
现在从鸟瞰的角度来考虑这个问题:
·xL 对应左摄像头图像中的点,类似的xR 对应右摄像头。
·b 是基线,是两个摄像头之间的距离。
我们得到 Z = (X - b)*f/xR. 综合起来,我们可以找到正确的视差 d = xL - xR 和一个物体的正确 X、Y、Z 位置。
通过上面的三个立体视觉方程式,可以通过预先获取的 f ,b,然后通过图像中找到对应点在两张图中的坐标X轴差值d,进而根据公式即可求出纵向距离Z以及横向距离X及高度Y;
由于立体视觉,我们可以估计任何物体的深度(假设我们已经做了正确的矩阵校准),它可以计算一个深度图或视差图:
~~
由于立体视觉,我们不仅知道图像中的障碍物,还知道它们与我们的距离!这个障碍物离我们有28.927米远!
立体视觉是使用简单的几何学和一个额外的摄像头将二维障碍物检测转化为三维障碍物检测的方法。今天,大多数新兴的“边缘”平台支持立体视觉,如新的OpenCV AI Kit或树莓派和英伟达Jetson。
在成本方面,与使用激光雷达相比,它相对便宜,并且仍然提供了很好的性能。我们称之为“伪激光雷达” ,因为它可以取代激光雷达的功能: 检测障碍物,对障碍物进行分类,并对障碍物进行三维定位。
References:
Course Visual Perception for Self-Driving Cars by University of Toronto
原文:https://medium.com/think-autonomous/pseudo-lidar-stereo-vision-for-self-driving-cars-41fa1ac42fc9
根据前面的原理介绍,我们总结一下基于双目立体视觉法深度相机的优缺点;
1.优点
1、对相机硬件要求低,成本也低。因为不需要像TOF和结构光那样使用特殊的发射器和接收器,使用普通的消费级RGB相机即可。
2、室内外都适用。由于直接根据环境光采集图像,所以在室内、室外都能使用。相比之下,
TOF和结构光基本只能在室内使用。
2.缺点
1、对环境光照非常敏感。双目立体视觉法依赖环境中的自然光线采集图像,而由于光照角度变化、光照强度变化等环境因素的影响,拍摄的两张图片亮度差别会比较大,这会对匹配算法提出很大的挑战。如下图是在不同光照条件下拍摄的图片:
另外,在光照较强(会出现过度曝光)和较暗的情况下也会导致算法效果急剧下降。
2、不适用于单调缺乏纹理的场景。由于双目立体视觉法根据视觉特征进行图像匹配,所以对于缺乏视觉特征的场景(如天空、白墙、沙漠等)会出现匹配困难,导致匹配误差较大甚至匹配失败。
3、
计算复杂度高。该方法是纯视觉的方法,需要逐像素计算匹配
;又因为上述多种因素的影响,需要保证匹配结果比较鲁棒,所以算法中会增加大量的错误剔除策略,因此对算法要求较高,想要实现可靠商用难度大,计算量较大。
4、
相机基线限制了测量范围
。测量范围和基线(两个摄像头间距)关系很大:基线越大,测量范围越远;基线越小,测量范围越近。所以基线在一定程度上限制了该深度相机的测量范围。
双目视觉
是一种通过两个摄像机(或者两个镜头)同时拍摄到同一个场景,再通过计算机算法来
获取
该场景
深度
和
三维
信息
的技术。这两个摄像机可以放置在固定的位置上,也可以通过移动来
获取
不同角度的
图像
以便更好地理解
物体
形状和结构。
双目视觉
的工作原理是,在两个摄像机之间的距离(称为基线)上拍摄到同一
物体
时,由于视差效应,看到的
物体
位置会有所不同。计算机可以通过测量这种视差来推导出
物体
深度
和
三维
信息
。这种方法类似于我们的双眼视觉,两只眼睛通过视差来协作,从而让我们能够感知
深度
和距离。
将重建得到的
三维
坐标
,重新投影回二维,进行验证。这里只需要验证右侧相机(因为重建时以左侧相机为原点,所以左侧几乎不会有误差)。1、相机的内参(fx、fy、cx、cy)和相机之间的转换矩阵(包括旋转矩阵和平移向量)重建得到 以左侧相机为原点、其位姿为
坐标
轴的
三维
空间
中
,各个关键点的
三维
坐标
。2、两个相机拍摄的图片上各个关键点的二维
坐标
(这里是21个关键点)。ps:这里没用畸变参数,可以在计算的时候再加一下畸变参数。
5.运行注意事项:
使用matlab2021a或者更高版本测试,运行里面的Runme_.m文件,不要直接运行子函数文件。运行时注意matlab左侧的当前文件夹窗口必须是当前工程所在路径。
具体可观看提供的操作录像视频跟着操作。
双目视觉
的基本原理,以及公式推导,我参考的b站上的视频,链接如下:2-线性相机模型-Linear Camera Model-Camera Calibration_哔哩哔哩_bilibili如果只学习
双目视觉
,建议阅读前五个视频。视频
中
有的翻译不太好,但是可以意会出来,哈哈哈~。视频
中
的讲解浅显易懂,但是我觉得有一处不对,下面写一份我的理解:如上图所示, (xw,yw,zw)是世界
坐标
系,(xc,yc,zc)是相机
坐标
系,(ox,oy)是光心
坐标
,(u,v)是摄像机内部影像的
坐标
系。
一、
三维
重建概述
三维
重建主要是研究如何从得到的匹配点
中
计算出相机的投影矩阵(如果是外部标定的话,就是
求
出相机的外部参数)以及如何计算出匹配点的
三维
坐标
。
目前研究的进展与之还相差较远。研究人员为了能够表达
三维
空间
信息
,目前较多地采用
三维
矢量图形来替代
三维
位图。主要的重构方法有如下几种:
(1)、空间点的重建
这是
三维
重构
中
关于双目摄像头测距原理,最近在看关于双目摄像机成像的项目,找关于双目摄像头标定的c++代码,但是发现自己对双目摄像机的成像原理不清楚,所以看代码和看天书一样。这篇就写给零基础接触双目摄像机成像原理的小伙伴,等看完这篇之后再去找类似的c++、python标定代码,就简单很多。
当然,之后也会介绍,关于几个
坐标
系(世界
坐标
系、像素
坐标
系、图片
坐标
系)的转化。
**视差的概念:**是指从两个不同位置观察...
双目视觉
测量是
计算机视觉
的一个重要分支,它以
计算机视觉
理论为基础,
涉及光学、光电子学、
图像
处理、模式识别、信号与数据处理及计算机技术等诸
多学科。
双目视觉
测量的原理,是基于人眼双目视差,从两个摄像机
获取
不同视
角下的同一场景下的
图像
,通过
图像
处理分析两幅
图像
中
目标点的对应关系,从
而得到
物体
的
三维
信息
。计算机
双目视觉
直接模拟了人眼处理景物的方式,可在
多种条件下灵活地测量景物的立体
信息
,是其它
计算机视觉
方法所不能取代的,
对它的研究,无论是从视觉生理的角度还是在工程应用
中
都具有十分重要的意义。、
4. **计算
物体
的高度**:要计算
物体
的高度,需要了解摄像头的内参和外参。)计算
物体
底部相对于摄像头的实际偏移:根据相似三角形的几何关系,可以计算
物体
底部相对于摄像头的实际偏移(ΔX, ΔY): Copy ΔX = (Δx_p * H) / f ΔY = (Δy_p * H) / f ```)计算
物体
底部相对于主点的像素偏移:使用主点
坐标
(c_x, c_y)计算
物体
底部
中
心点相对于主点的像素偏移: Copy Δx_p = x_p - c_x Δy_p = y_p - c_y ```