opencv双目测距原理与应用

双目视觉测量系统在不同纵向距离中测量精度比对实验 双目视觉测量精度比对实验 阅读详情

虽然最近注意力已经不可遏制地被神经科学、大脑记忆机制和各种毕业活动吸引过去了,但是还是觉得有必要把这段时间双目视觉方面的进展总结一下。毕竟从上一篇博文发表之后,很多同仁发E-mail来与我讨论,很多原来的疑团,也在讨论和一步步的试验中逐渐解决了。  

开篇之前,首先要感谢maxwellsdemon和wobject,没有和你们的讨论,也就没有此篇的成文。


说到双摄像头测距,首先要复习一下测距原理,把Learning OpenCV翻到416和418页,可以看到下面两幅图。


图1. 双摄像头模型俯视图


图2, 双摄像头模型立体视图




图1解释了双摄像头测距的原理,书中Z的公式如下:

 

在OpenCV中,f的量纲是像素点,Tx的量纲由定标棋盘格的实际尺寸和用户输入值确定,一般总是设成毫米,当然为了精度提高也可以设置为0.1毫米量级,d=xl-xr的量纲也是像素点。因此分子分母约去,z的量纲与Tx相同

 

图2解释了双摄像头获取空间中某点三维坐标的原理。

 

可以看到,实际的坐标计算利用的都是相似三角形的原理,其表达式就如同Q矩阵所示。

 

 

空间中某点的三维坐标就是(X/W, Y/W, Z/W)。

 

因此,为了精确地求得某个点在三维空间里的距离,我们需要获得的参数有焦距f、视差d、摄像头中心距Tx。

如果还需要获得X坐标和Y坐标的话,那么还需要额外知道左右像平面的坐标系与立体坐标系中原点的偏移cx和cy。其中f, Tx, cx和cy可以通过立体标定获得初始值,并通过立体校准优化,使得两个摄像头在数学上完全平行放置,并且左右摄像头的cx, cy和f相同(也就是实现图2中左右视图完全平行对准的理想形式)。而立体匹配所做的工作,就是在之前的基础上,求取最后一个变量:视差d(这个d一般需要达到亚像素精度)。从而最终完成求一个点三维坐标所需要的准备工作。

 

在清楚了上述原理之后,我们也就知道了,所有的这几步:标定、校准和匹配,都是围绕着如何更精确地获得f, d, Tx, cx和cy而设计的。


 

双目测距的原理就说到这里,为了避免大家看到大段纯叙述性的文字头晕,下面的行文将会以FAQ的形式围绕着实现双摄像头测距过程中碰到的几点疑惑展开。当然,其中的解答也只是我的个人理解,如有不当,敬请指正。

Q1:标定时棋盘格的大小如何设定,对最后结果有没有影响?

A:当然有。在标定时,需要指定一个棋盘方格的长度,这个长度(一般以毫米为单位,如果需要更精确可以设为0.1毫米量级)与实际长度相同,标定得出的结果才能用于实际距离测量。一般如果尺寸设定准确的话,通过立体标定得出的Translation的向量的第一个分量Tx的绝对值就是左右摄像头的中心距。一般可以用这个来验证立体标定的准确度。比如我设定的棋盘格大小为270 (27mm),最终得出的Tx大小就是602.8 (60.28mm),相当精确。

 

Q2:通过立体标定得出的Tx符号为什么是负的?

A:这个其实我也不是很清楚。个人的解释是,立体标定得出的T向量指向是从右摄像头指向左摄像头(也就是Tx为负),而在OpenCV坐标系中,坐标的原点是在左摄像头的。因此,用作校准的时候,要把这个向量的三个分量符号都要换一下,最后求出的距离才会是正的。

但是这里还有一个问题,就是Learning OpenCV中Q的表达式,第四行第三列元素是-1/Tx,而在具体实践中,求出来的实际值是1/Tx。这里我和maxwellsdemon讨论下来的结果是,估计书上Q表达式里的这个负号就是为了抵消T向量的反方向所设的,但在实际写OpenCV代码的过程中,那位朋友却没有把这个负号加进去。(一家之言,求更详细的解释)

 

Q3:cvFindStereoCorrespondenceBM的输出结果好像不是以像素点为单位的视差?

A:在OpenCV2.0中,BM函数得出的结果是以16位符号数的形式的存储的,出于精度需要,所有的视差在输出时都扩大了16倍(2^4)。其具体代码表示如下:

dptr[y*dstep] = (short)(((ndisp - mind - 1 + mindisp)*256 + (d != 0 ? (p-n)*128/d : 0) + 15) >> 4);

可以看到,原始视差在左移8位(256)并且加上一个修正值之后又右移了4位,最终的结果就是左移4位

因此,在实际求距离时,cvReprojectTo3D出来的X/W,Y/W,Z/W都要乘以16 (也就是W除以16),才能得到正确的三维坐标信息


Q4:利用双摄像头进行测距的时候世界坐标的原点究竟在哪里? 

A:世界坐标系的原点是左摄像头凸透镜的光心。

说起这个,就不得不提到针孔模型。如图3所示,针孔模型是凸透镜成像的一种简化模型。当物距足够远时(远大于两倍焦距),凸透镜成像可以看作是在焦距处的小孔成像。(ref: http://bak1.beareyes.com.cn/2/lib/200110/04/20011004006.htm)


图3. 针孔模型


在实际计算过程中,为了计算方便,我们将像平面翻转平移到针孔前,从而得到一种数学上更为简单的等价形式(方便相似三角形的计算),如图4所示。

图4. 针孔模型的数学等价形式

 

 

因此,对应图2就可以知道,世界坐标系原点就是左摄像头针孔模型的针孔,也就是左摄像头凸透镜的光心

 

Q5:f和d的单位是像素,那这个像素到底表示什么,它与毫米之间又是怎样换算的?

A:这个问题也与针孔模型相关。在针孔模型中,光线穿过针孔(也就是凸透镜中心)在焦距处上成像,因此,图3的像平面就是摄像头的CCD传感器的表面。每个CCD传感器都有一定的尺寸,也有一定的分辨率,这个就确定了毫米与像素点之间的转换关系。举个例子,CCD的尺寸是8mm X 6mm,分辨率是640X480,那么毫米与像素点之间的转换关系就是80pixel/mm。

在实际运用中,我们在数学上将这个像平面等效到小孔前(图4),这样就相当于将在透镜中心点之前假设了一块虚拟的CCD传感器。

 

Q6:为什么cvStereoRectify求出的Q矩阵cx, cy, f都与原来的不同?

A:这个在前文有提到过。在实际测量中,由于摄像头摆放的关系,左右摄像头的f, cx, cy都是不相同的。而为了使左右视图达到完全平行对准的理想形式从而达到数学上运算的方便,立体 校准所做的工作事实上就是在左右像重合区域最大的情况下,让两个摄像头光轴的前向平行,并且让左右摄像头的f, cx, cy相同。因此,Q矩阵中的值与两个instrinsic矩阵的值不一样就可以理解了。

 

实验结果:

实验下来,虽然Block Matching算法本身对精度有所限制,但测距基本能达到能让人接受的精度,结果如下图5所示

 

图5. OpenCV双摄像头测距结果


上图中,中、左、右三个物体分别被放在离摄像头50cm, 75cm和90cm的位置。可以看出测距的结果相当不错。当然,上面这幅图是比较好的结果。由于BM算法的限制,同一点云中相同距离的点一般会有正负2厘米之内的误差。


图6是利用双目摄像头测物体长宽的结果,可以看出结果似乎不太准确。。。

图6. OpenCV双摄像头测边长结果


其中,物体宽为117-88=29mm,但实际宽度为5.2cm,物体高位71-13=58mm,但实际高度为13cm。这方面的误差还是比较难以理解

此外,还有一个问题至今尚未完全理解,就是双目摄像头的中心距,为什么采用Tx而不是T向量的长度。因为如果要左右视图重合区域最大化的话两个摄像头的光轴都要与T垂直才是(如图7),这样的话,校正后两个摄像头的中心距应该是T才对。不知道我这样的理解对不对?


图7. 双摄像头立体校准俯视图

双目视觉不同基线长度测量精度比对实验 增大基线,提高精度 阅读详情

相关推荐

用普通摄像头测量距离

近年来,由于无人机、无人车等技术的不断成熟,需要用到实时测距的场所也越来越多,如定位,避障,测速等,相比于其他测距方法,单目测距是利用一个摄像头进行视频拍摄,在图像中找到待测物体。这一系列动作,涉及到了物体的识别,相机的结构,坐标变换的一些知识,距离的获取是一个很广泛的课题,用摄像头来测距是其中一个方向,包括单目测距、双目测距、结构光测距等方法。 在这里,我们主要用一个摄像头通过建立一定的模型来解决测距的问题。 1. 安装包 python 3.7 或以上 pip install cvzone pip ins

@bangbang的博客 1万+

双摄像头测距的OpenCV实现

虽然最近注意力已经不可遏制地被神经科学、大脑记忆机制和各种毕业活动吸引过去了,但是还是觉得有必要把这段时间双目视觉方面的进展总结一下。毕竟从上一篇博文发表之后,很多同仁发E-mail来与我讨论,很多原来的疑团,也在讨论和一步步的试验中逐渐解决了。  开篇之前,首先要感谢maxwellsdemon和wobject,没有和你们的讨论,也就没有此篇的成文。说到双摄像头测距,首先要复习一下测距

Footprint:Chengyao's Technical Blog 7万+

学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距).

最近在做双目测距,觉得有必要记录点东西,所以我的第一篇博客就这么诞生啦~ 双目测距属于立体视觉这一块,我觉得应该有很多人踩过这个坑了,但网上的资料依旧是云里雾里的,要么是理论讲一大堆,最后发现还不知道怎么做,要么就是直接代码一贴,让你懵逼。 所以今天我想做的,是尽量给大家一个明确的阐述,并且能够上手做出来。 一、 标定 首先我们要对摄像头做标定,具体的公式推导在l...

weixin_30823001的博客 3108

python opencv双目测距_OpenCV实现双目测距

原理图示原理很简单,利用了相似三角形计算距离,所以双目测距的主要任务在于前期摄像头的定标、双目图像点的特征匹配上。常用做法具体步骤1.双目定标和校正,获得摄像头的参数矩阵摄像头定标一般都需要一个放在摄像头前的特制的标定参照物(棋盘纸),摄像头获取该物体的图像,并由此计算摄像头的内外参数。标定参照物上的每一个特征点相对于世界坐标系的位置在制作时应精确测定,世界坐标系可选为参照物的物体坐标系。在得到这...

weixin_32396347的博客 2197

双目测距-原理及代码实现

需求:使用双目摄像头得出物体3D坐标,本质就是利用双目来得到深度信息。 github代码 0 知识扫盲 相机模型 四大坐标关系及其关系 1 相机标定 Q1:用MATLAB标定还是opencv标定? A1:两种我都试了。总结来说,直接影响标定结果的好坏的因素是图片质量,在图片质量较好的情况下,两者结果基本一样。 Q2:是两个相机一起标定还是单独标定? A2:MATLAB 和 OPEN...

2486

基于C++和OpenCV实现双目测距系统

本文详细介绍了双目测距的基本原理及其在C++和OpenCV中的实现,通过具体的代码示例展示了如何实现一个简单的双目测距系统。本文还介绍了系统的性能优化与测量精度优化方法,并提供了两个应用实例,帮助读者更好地理解和应用双目测距技术。双目测距技术在多个领域有广泛的应用前景,通过不断学习和实践,我们可以更好地利用该技术进行复杂系统的开发与优化,推动技术的发展和应用。

m0_57781768的博客 1880

基于opencv的双目测距(代码+文章)

基于opencv的双目测距(代码+文章) 去发现同类优质开源项目:https://gitcode.com/ 本文档包含了一个关于双目视觉的文章和对应的OpenCV代码,旨在帮助读者了解双目测距的基本原理以及如何使用两个网络摄像头进行实践操作。 文章简介 文章标题:双目测距原理与实现 本文详细介绍了双目视觉系统的工作原理,重点讲解了如何利用两个普通的网络摄像头搭建一个双目视觉系统,并通过这一系统计算...

gitblog_06750的博客 283

双目测距与立体相机:机器视觉中的立体视觉技术详细指南与Python实现

双目测距,顾名思义,是使用两个相机从不同的角度捕捉同一个场景,然后通过比较两个图像之间的差异来计算物体的深度信息。这种方法模仿了人类的双眼视觉系统,我们的大脑会自动计算出物体距离我们有多远。

qq_38334677的博客 354

OpenCV学习笔记(16)双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目定标

转载地址:http://blog.youkuaiyun.com/chenyusiyuan/article/details/5961769 一:双目测距的基本原理 如上图所示,双目测距主要是利用了目标点在左右两幅视图上成像的横向坐标直接存在的差异(即视差)与目标点到成像平面的距离Z存在着反比例的关系:Z=fT/d。“@scyscyao :在OpenCV中,f的量纲是像素点,T的量纲由定标板棋

xfortius的专栏 4332

OpenCV双目测距项目源代码详解

OpenCV的主要功能包括图像处理、视频处理、特征检测、图像识别、机器学习等方面。对于图像处理,它提供了滤波、边缘检测、形态学操作等多种功能。在视频处理方面,它支持视频文件的读写、实时视频流的处理以及运动分析等。特别地,OpenCV在特征检测和图像识别方面,提供了SIFT、SURF、ORB等多种特征检测算法,极大地方便了计算机视觉研究和开发者的使用。尺度不变特征变换(Scale-Invariant Feature Transform, SIFT)是一种被广泛使用的特征检测算法。

weixin_34163588的博客 1401

SIFT算法在双目测距中的应用与实践

双目测距是一种使用两个相机从不同视角获取同一场景图像的技术,通过模拟人类的双眼立体视觉来计算物体深度信息。这项技术在自动驾驶、机器人导航、三维重建等领域有着广泛应用。它模拟了人眼的视差原理,通过对同一物体在左右相机图像上的位置差异(视差)进行计算,利用几何关系推算出物体距离相机的准确距离。尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)是一种用于图像处理的算法,它能够检测和描述图像中的局部特征点。

weixin_42160645的博客 998

OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算...

OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算 2010年10月26日   [b] OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算 [/b][b]收藏 [/b]   四、双目匹配与视差计算   立体匹配主要是通过找出每对图像间的对应关系,根据三角测量原理,得到视差图;在获得了视差信...

dmc58dmc 1165

Python实现双目视觉测距:从设计到实践

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,自2000年由Intel立项后,经历了多个版本的迭代发展,如今已经成为计算机视觉领域最为广泛的开源库之一。OpenCV的核心特点包括丰富的图像处理和计算机视觉功能、高性能计算、跨平台性以及开放源代码。

weixin_30633869的博客 1139

双目测距的基本原理(转http://blog.youkuaiyun.com/chenyusiyuan/article/details/5961769)

双目测距的基本原理 如上图所示,双目测距主要是利用了目标点在左右两幅视图上成像的横向坐标直接存在的差异(即视差)与目标点到成像平面的距离Z存在着反比例的关系:Z=fT/d。“@scyscyao:在OpenCV中,f的量纲是像素点,T的量纲由定标板棋盘格的实际尺寸和用户输入值确定,一般是以毫米为单位(当然为了精度提高也可以设置为0.1毫米量级),d=xl-xr的量纲也是像素点。因此分子分母...

weixin_30699443的博客 150

双目立体成像(一)双目图片生成点云

利用左右目图片生成点云

qq_62964142的博客 4552

SAP 分期付款,付款条件的要件定义方法

以上内容做好后,可以在F-02或者F-60里看设置后的结果。找到相关路径选择【维护支付条件】点击进入后,选择【新条目】再设置一个总的支付规则,注意这里【付款条款】一定要选择。例:默认付款条件SP00,改成刚定义好的0028即可。将刚才基础创建的付款条件,以以下方式录入,注意。028A- 30天到期,过账日期基础。028B- 60天到期,过账日期基础。028C- 90天到期,过账日期基础。目的:新建支付条款(本次以。的选择,然后保存后,完成。,【基准日期缺省值】选择。基础创建好了以后,选择【

晴天的博客分享技术知识 2936

双目测距 单目标点测距工程实践

一、双目测距原理 双目测距的原理可以简单归结为相似三角形测距法,如下图所示: 根据上面的公式,要获得距离Z,需要首先得到焦距f,两相机中心距B以及视差d。f和B可通过相机标定获得,而后面要做的大量的工作就是为了获得视差d。关于原理想要详细了解的童鞋建议去读 学习OpenCV3 中文版.pdf 中的第18、19章,里面对相机标定、三维视觉的内容作了详细讲解,此处就不再赘述。 二、基本流程 双目测距的基本流程一般包含以下几步:双目标定-->立体校正(含消除畸变)-->立体匹配...

Xll_dang的博客 4099

上交开源装甲板识别代码分析

GitHub - xinyang-go/SJTU-RM-CV-2019: 上海交通大学 RoboMaster 2019赛季 视觉代码这里着重分析主函数main.cpp与装甲板识别部分的工程文件armer文件夹。由于未完全分析,所以对于其中log.h、options.h中的函数并不清楚,在分析时会跳过这些内容。该文章重点分析的是思路,部分函数中的数学逻辑、数据处理思路这里不详细解释(没能力)所有思维导图通过 知犀知犀思维导图 - 知犀官网 (zhixi.com)原创。

qq_42104961的博客 1320

双目立体视觉匹配算法之视差图算法从理论到实践专题1

1、资源搜索 双目立体视觉匹配算法-----SAD匹配算法、BM算法、SGBM算法、GC算法 半全局块匹配(Semi-Global Block Matching)算法 基于BM算法的双目测距 opencvSGBM半全局立体匹配算法的研究(1) 2、本人总结 在讲具体实现之前,我们还是先想想为什么会此概念。我们要实现的是相机能够可以知道这个场景的深度信息,但是从计算成像角度使...

CSS360的博客 3109

Flutter 中使用蓝牙插件报错,说没有权限怎么解决

2、在build.grale里面更改一下版本号,我修改的是targetSdkVersion这个版本号,需要根据你自己的版本进行更改,记得更改之后先flutter clean一下再run。搞了一晚上,没搞出来,第二天用同事手机测试发现他手机可以,我手机还是不行,才发现是Android版本问题,需要修改两处地方。废话不多说,咱先看报错信息。

zzj17637822814的博客 2289

【STK】手把手教你利用STK进行导弹和反导仿真01 - STK/MMT模块安装部署

【STK】手把手教你利用STK进行导弹和反导仿真01 - STK/MMT模块安装部署MMT模块与STK的版本是一一对应的,比如我现在手上的版本是MMT9的,那么我使用的STK的版本也必须是9版本的,如果你现在正在使用的是更高版本的STK,比如说10、11.2、11.6、12.2,那么该怎么办呢?这个经本人尝试,目前是可以多个STK版本共存的,我们可以根据自己的需要安装多个版本的STK下面开始讲解具体的安装步骤,

weixin_44184852的博客 2919

单目测距(摄像机采集的视频流 c++)

本文处理的对象为摄像机采集到的视频流,所采用的语言为c++。双目测距的基本原理是相似三角形原理理,具体理论可以参考大佬博客。根据相似三角形原理,见图如下图所示。 假设虚线为镜头平面,左边为成像平面,右边为物体所在的平面,H为物体的长度,h为图像的像素长度,f为焦距。我们首先要确定出焦距的大小,我偷了个懒,我先测出来相机到物体之间的具体D,已知物体长度H,在opencv中测出物体长度h,我就解出了f。利用已知的f,我们就可以用图中的公式计算出相机到物体之间的距离D了。我所采用的算法步骤如下: 1.调用摄像头

lihuipengxh的博客 2778

Level 4自动驾驶系统设计0——功能与场景0

摘要:当前智能驾驶系统开发存在应试思维误区,过度依赖NCAP标准测试而忽视真实物理世界的复杂工况。随着系统进入L4大模型时代,必须从离散测试转向应对无限连续的长尾场景。关键在于解决传感器输入质量(避免"垃圾进垃圾出"问题),通过逆向定义方法论确保前端数据高置信度。同时采用影子模式收集分歧数据流,结合条件接受机制动态调整感知权重,最终实现功能释放主权(FO)的100%安全闭环。本文揭示了如何为端到端智驾大模型建立物理红线,这是确保L4系统量产的底层法则。

Godspeed_zwh的博客 307
上一篇: 第一篇文章,以后好好记录,好好学习!
下一篇: unity 获取设备的GPS信息
HFKuAng
博客等级 码龄11年 70粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值