双目测距中生成的一点总结

双目测量过程大致如下:

1 获取原始图片,用remap矩阵对原始图片进行处理,形成对极图片。

2 在左右图中找到同样的目标点,因为我们remap后就是做了对极处理,所以在右边图中找左边对应点的时候集中在对应行上下浮动一点范围内找,而不需要全图搜索。

3 计算同样点的x坐标差值,形成disparity,并调用reprojectImageTo3D获得三维坐标,进而获得距离。

在整个处理过程中对极点的寻找直接影响测量结果,如果你仅仅需要测量指定目标,可以直接利用图像的特征点来找对应点而不需要使用BM,SGBM这样的通用的算法,比如我想仅仅检测棋盘格的距离,那么我就可以直接利用对极图中检测的棋盘格角点的x位置相减作为视差来进行运算。

一  disparity   双目测距直接信息就是左右摄像头看到的两幅画,直接描述的就是同一个物体在两个摄像头里面的坐标,比如该物体的同一个点在左边摄像头拍摄的图片像素位置为(Lx,Ly),在右边为(Rx,Ry)。一般而言,这两个像素横坐标和纵坐标坐标数值基本都是不同的,进而形成视差。坐标的差值可以理解为disparity。

二  空间点坐标(点云) 我们的目标就是从坐标差值(disparity)中推导出空间距离(点云)。

有一个公式可以完成这个运算:

3D坐标=Disparity*Q (opencv提供了reprojectImageTo3D函数帮助我们做这个计算)

上面的Q叫投影矩阵,他长这样:

 

虽然Q矩阵里面的数据是通过矫正自动计算出来的,也可以人为的大致看出这些值是否靠谱,Cx 和Cy可以粗略的认为就是相机的中心(在数量上接近),比如对于640x480的图像Cx和Cy 可能就在320x240附近,Tx为两个摄像头中心之间的物理距离,我们可以用尺子测量一下两个相机中心间距然后和自动推导的值做下对比也好大致评估出Q值是否正常,比如我的摄像头间距为50mm,那么这个值应该就在0.02附近。评估时可以认为Cx’和Cx相等,这样最终如果知道一个点的disparity,那么你就可以手动推算出这点相对于左相机的空间坐标。

单目相机矫正完后形成的参数cameraMatrix

 

Cx 和Cy也差不多等于图像分辨率的一半,因为一般相机中心和sensor的中心不会差距太大。

fx和fy 可以通过相机已知参数估算:比如相机3.6mm镜头,sensor面积是1/4英寸(对角线为16*1/4=4mm),长宽分别为:3.2x2.4mm,分辨率是640x480,那么

Fx=3.6/(3.2/640)=720  Fy=3.6/(2.4/480)=720

我们知道利用单目相机的参数结合棋盘格的像点和实际物理位置就可以获得到双目相机之间的相关参数,opencv 提供了stereoCalibrate函数完成该动作,可以简单的理解这个函数可以算出两个相机之间的相对位置(rotation 和translation),同时算出本质矩阵和基本矩阵,translation矩阵里面的内容实际体现了相机相对位置的平移部分,比如我的右边相机大致距离左边相机50mm,在我的标定的结果里面就是这个样子:

-5.5528042426453368e+01

-3.4447262489610064e-01

-4.5605141900646129e-01

55.5mm就是横向x的偏移。

立体标定后的参数通过 opencv提供了stereoRectify可以生成上面的Q矩阵,通过initUndistortRectifyMap生成对极需要的remap矩阵。

参考文档:

投影矩阵和空间点的转换

https://blog.csdn.net/Gordon_Wei/article/details/86319058 

相机坐标系和世界坐标系变换:

https://blog.csdn.net/Hei_1993/article/details/85049363

本质矩阵和基础矩阵:

https://blog.csdn.net/tanmengwen/article/details/7409886?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

opencv的函数说明:

https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#void%20stereoRectify(InputArray%20cameraMatrix1,%20InputArray%20distCoeffs1,%20InputArray%20cameraMatrix2,%20InputArray%20distCoeffs2,%20Size%20imageSize,%20InputArray%20R,%20InputArray%20T,%20OutputArray%20R1,%20OutputArray%20R2,%20OutputArray%20P1,%20OutputArray%20P2,%20OutputArray%20Q,%20int%20flags,%20double%20alpha,%20Size%20newImageSize,%20Rect*%20validPixROI1,%20Rect*%20validPixROI2)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值