opencv双目测距代码矫正

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

假设目标点在左视图中的坐标为(x,y),在左右视图上形成的视差为d目标點在以左摄像头光心为原点的世界坐标系中的坐标为(X,Y,Z),则存在上图所示的变换矩阵Q使得 Q*[x y d 1]’ = [X Y Z W]’。

“ :为了精确地求得某个点在三维空間里的距离Z我们需要获得的参数有焦距f、视差d、摄像头中心距Tx。如果还需要获得X坐标和Y坐标的话那么还需要额外知道左右像平面的坐標系与立体坐标系中原点的偏移cx和cy。其中f, Tx, cx和cy可以通过立体标定获得初始值并通过立体校准优化,使得两个摄像头在数学上完全平行放置并且左右摄像头的cx, cy和f相同(也就是实现图2中左右视图完全平行对准的理想形式)。而立体匹配所做的工作就是在之前的基础上,求取最后┅个变量:视差d(这个d一般需要达到亚像素精度)从而最终完成求一个点三维坐标所需要的准备工作。在清楚了上述原理之后我们也就知噵了,所有的这几步:标定、校准和匹配都是围绕着如何更精确地获得 f,

1. 如何打开两个或多个摄像头?

同时读取两个摄像头不过后来┅位研友来信讨论说只要把摄像头指针的创建代码按照摄像头序号降序执行,就可以顺利打开多个摄像头 例如:

这样就可以同时采集两個摄像头。我也验证过这种方法确实有效而且还解决了我遇到的cvSetCaptureProperty调整帧画面大小速度过慢的问题。当摄像头的打开或创建代码按照摄像頭序号从0开始以升序编写执行时使用cvSetCaptureProperty就会出现第一个摄像头(序号为0)的显示窗口为灰色(即无图像)、且程序运行速度缓慢的现象。洏改为降序编写执行后则能正常、实时地显示各摄像头的画面。具体原因有待分析讨论

2. 如何实现多个摄像头帧画面的同步抓取?

OpenCV第103頁)cvGrabFrame将摄像头帧画面即时复制到内部缓存中,然后通过cvRetrieveFrame把我们预定义的一个IplImage型空指针指向缓存内的帧数据注意这时我们并没有真正把幀数据取出来,它还保存在OpenCV的内部缓存中下一次读取操作就会被覆盖掉。所以一般我们要另外定义一个IplImage来复制所抓取的帧数据然后对這个新IplImage进行操作。

由上面的解释也可以看出cvGrabFrame的作用就是尽可能快的将摄像头画面数据复制到计算机缓存,这个功能就方便我们实现对多個摄像头的同步抓取即首先用cvGrabFrame依次抓取各个CvCapture*,然后再用cvRetrieveFrame把帧数据取出来例如:

摄像头定标一般都需要一个放在摄像头前的特制的标定參照物(棋盘纸),摄像头获取该物体的图像并由此计算摄像头的内外参数。标定参照物上的每一个特征点相对于世界坐标系的位置在淛作时应精确测定世界坐标系可选为参照物的物体坐标系。在得到这些已知点在图像上的投影位置后可计算出摄像头的内外参数。

如仩图所示摄像头由于光学透镜的特性使得成像存在着径向畸变,可由三个参数k1,k2,k3确定;由于装配方面的误差传感器与光学镜头之间并非唍全平行,因此成像存在切向畸变可由两个参数p1,p2确定。单个摄像头的定标主要是计算出摄像头的内参(焦距f和成像原点cx,cy、五个畸变参数(一般只需要计算出k1,k2,p1,p2对于鱼眼镜头等径向畸变特别大的才需要计算k3))以及外参(标定物的世界坐标)。 OpenCV 中使用的求解焦距和成像原点嘚算法是基于张正友的方法(  )而求解畸变参数是基于 Brown 的方法(  )。

1. 图像坐标系、摄像头坐标系和世界坐标系的关系

摄像头成像几何關系其中Oc 点称为摄像头(透镜)的光心,Xc 轴和Yc 轴与图像的x轴和Y轴平行Zc 轴为摄像头的光轴,它与图像平面垂直光轴与图像平面的交点O1 ,即为图像坐标系的原点由点Oc 与Xc 、Yc 、Zc 轴组成的坐标系称为摄像头坐标系,Oc O1 的距离为摄像头焦距用f表示。

图像坐标系是一个二维平面叒称为像平面,“ :实际上就是摄像头的CCD传感器的表面每个CCD传感器都有一定的尺寸,也有一定的分辨率这个就确定了毫米与像素点之間的转换关系。举个例子CCD的尺寸是8mm X 6mm,帧画面的分辨率设置为640X480那么毫米与像素点之间的转换关系就是80pixel/mm。”设CCD传感器每个像素点的物理大尛为dx*dy相应地,就有 dx=dy=1/80

2. 进行摄像头定标时,棋盘方格的实际大小 square_size (默认为 1.0f )的设置对定标参数是否有影响

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

3. 定标所得的摄像头内参数即焦距和原点坐标,其数值单位都是一致的吗怎么紦焦距数值换算为实际的物理量?

90°,是指摄像头坐标系的偏斜度(就是镜头坐标和CCD是否垂直)摄像头矩阵(内参)的目的是把图像的點从图像坐标转换成实际物理的三维坐标。因此其中的fx, fy, cx, cy 都是使用类似上面的纲量同样,Q 中的变量 fcx, cy 也应该是一样的。”

4. 棋盘图像数目應该取多少对摄像头定标比较适宜

OpenCV中文论坛上piao的帖子《 》中指出影响摄像头定标结果的准确性和稳定性的因素主要有三个:

(1) 标定板所在平面与成像平面(image plane)之间的夹角;

(2) 标定时拍摄的图片数目(棋盘图像数目);

(3) 图像上角点提取的不准确。

cvFindCornerSubPix结合可以获得很好的角點检测效果(hqhuang1在《》中给出了相关的应用范例)因此,影响定标结果较大的就是标定板与镜头的夹角和棋盘图像数目在实际定标过程Φ,我感觉棋盘图像数目应该大于20张每成功检测一次完整的棋盘角点就要变换一下标定板的姿态(包括角度、距离) 。

由于一般镜头只需要计算k1,k2,p1,p2四个参数所以我们首先要设置 CV_CALIB_FIX_K3;其次,如果所用的摄像头不是高端的、切向畸变系数非常少的则不要设置 CV_CALIB_ZERO_TANGENT_DIST,否则单目校正误差会很大;如果事先知道摄像头内参的大概数值并且cvCalibrateCamera2函数的第五个参数intrinsic_matrix非空,则也可设置

P.S. 使用OpenCV进行摄像机定标虽然方便但是定标结果往往不够准确和稳定,最好是使用  来进行定标再将定标结果取回来用于立体匹配和视差计算。工具箱的使用 有图文并茂的详细说明此外,有两篇博文也进行了不错的总结推荐阅读:

加载中,请稍候......

今年五月份开始研究双目从刚開始的无从下手到渐渐熟悉,再到中途的想放弃也算是历经波折,在此我把我自己东拼西凑的东西分享一下算是我在CSDN成长的一个见证。首先说下遇到的问题:

  1. 两个摄像头之间必须固定不然不可能标定成功。
  2. 标定板的数目尽量不要出现横排竖列相等的情况
  3. 采集图片的時候不要离摄像头太远。

标定过程直接引用opencv例程匹配的实现过程也主要参考了opencv例程,程序的实现流程参考了
本人水平较弱且是第一次寫博客,望大家批评指正

原理很简单利用了相似三角形計算距离,所以双目测距的主要任务在于前期摄像头的定标、双目图像点的特征匹配上

1.双目定标和校正,获得摄像头的参数矩阵

摄像头萣标一般都需要一个放在摄像头前的特制的标定参照物(棋盘纸)摄像头获取该物体的图像,并由此计算摄像头的内外参数标定参照粅上的每一个特征点相对于世界坐标系的位置在制作时应精确测定,世界坐标系可选为参照物的物体坐标系在得到这些已知点在图像上嘚投影位置后,可计算出摄像头的内外参数

如上公式所示,摄像头由于光学透镜的特性使得成像存在着径向畸变可由三个参数k1,k2,k3确定;甴于装配方面的误差,传感器与光学镜头之间并非完全平行因此成像存在切向畸变,可由两个参数p1,p2确定

2.立体匹配,获得视差图:

预处悝: 图像归一化减少亮度差别,增强纹理
匹配过程: 滑动sad窗口沿着水平线进行匹配搜索,由于校正后左右图片平行左图的特征可以茬右图对应行找到最佳匹配
输出视差图disparity:如果左右匹配点比较稠密,匹配点多得到的图像与原图相似度比较大, 如果匹配点比较稀疏嘚到的点与原图 相似度比较小

根据提取的特征点上用上述双目测距的相似三角算法得出距离。

  • SIFT特征提取算法对左右图像点提取特征
  • 对于剩丅的点使用相似三角形计算公式得到图片各点景深标在图上
  • 最终小车避障可根据其中少数点进行判断或者取均值。
  • 2017年无人驾驶还处于积極研发和普及期民用的测试和技术探索也主要在小型汽车方面,各大巨头都将2020年作为一个...

  • 二维摄像 + 三维重建法 = 深度视觉摄像 二维摄像 结構光方案优点:技术成熟深度图像分辨率可以做得比较高;价格...

  • 定位问题的引入 我们所熟知的机器人,可以大致分为以下四类: 1. 操作机器人: 模仿人的手和手臂的动作特点...

  • 摄像头是ADAS核心传感器,相比毫米波雷达和激光雷达最大优势在于识别(物体是车还是人、标志牌昰什么颜色)。 汽车...

我要回帖

更多关于 opencv双目测距代码 的文章

 

随机推荐