双目测距的基本公式推导

双目深度估计使用两个camera,通过双目矫正把问题从深度估计转化到特征点匹配、视差计算的问题,这样的转换将学习目标从深度变成了视差,这样做是因为视差相对于深度来说更直观一些。

双目校正是根据摄像头定标后获得的单目内参数据(焦距、成像原点、畸变系数)和双目相对位置关系(旋转矩阵和平移向量),分别对左右视图进行消除畸变和行对准,使得左右视图的成像原点坐标一致。

视差图是同一个场景在两个相机下成像的像素的位置偏差,下图中的X_{R} - X_{T}即是视差。P是待测物体上的某一点,OR与OT分别是两个相机的光心,点P在两个相机感光器上的成像点分别为P和P’(相机的成像平面经过旋转后放在了镜头前方),f为相机焦距,B为两相机中心距,Z为我们想求得的深度信息。

        

公式中,焦距f和摄像头中心距B可通过标定得到,因此,只要获得了视差d = X_{R} - X_{T},就可以计算出深度Z

双目测距主要是利用了目标点在左右两幅视图上成像的视差与目标点到成像平面的距离Z存在着反比例的关系:Z=fB/d 。

在OpenCV中,f的量纲是像素点,d的量纲也是像素点, B的量纲由定标板棋盘格的实际尺寸和用户输入值确定,一般是以毫米为单位。因此分子分母约去,Z的量纲与B相同。

 

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

 

继续阅读  双目测距与三维重建的OpenCV实现问题集锦

 

 

 

### 基于双目视觉的3D重建方法及测距原理 #### 双目测距基本原理 双目测距的核心在于利用左右相机获取的图像之间的视差推导目标物体的距离。通过立体校正,使左右两幅图像中的对应点满足共面行对准条件[^3]。一旦完成这一预处理步骤,就可以依据三角测量原理计算出空间中任意一点到摄像机系统的深度。 #### 核心算法流程 核心算法通常分为以下几个方面的工作: 1. **立体校正** 使用数学模型调整左右相机的成像平面使其平行并确保同一场景点在左右图像上处于相同扫描线上。这是后续视差估计的基础工作之一。 2. **特征提取与匹配** 对左、右两张图片分别进行特征检测(如SIFT、SURF或ORB),然后寻找每一对可能对应的特征点位置关系作为候选匹配点集合[^1]。 3. **视差图生成** 利用半全局匹配(SGM)或其他优化技术,在上述匹配基础上构建稠密视差地图表示每个像素级别的相对位移量信息[^2]。 4. **三维坐标转换** 结合已知的基线长度B以及焦距f等参数,按照如下公式重构实际世界里的XYZ坐标系下的各个顶点数据: \[ Z = f * B / d \] 其中\(d\)代表当前像素处所得到的具体视差值;而X,Y则可以通过简单的几何比例运算得出相应数值。 ```cpp // 示例代码片段展示如何从视差映射至真实世界的3D点云 std::vector<cv::Point3f> reconstruct3D(const cv::Mat& disparityMap, float baseline, int focalLength){ std::vector<cv::Point3f> points; for(int v=0;v<disparityMap.rows;++v){ const ushort* Drow = disparityMap.ptr<ushort>(v); for(int u=0;u<disparityMap.cols;++u){ if(Drow[u]!=0){ // 非零视差点才有效果 double z = (baseline*focalLength)/double(Drow[u]); double x = z*(u-cx)/fx; double y = z*(v-cy)/fy; points.emplace_back(cv::Point3f((float)x,(float)y,(float)z)); } } } return points; } ``` 以上函数展示了怎样把二维平面上具有不同灰度等级反映出来的视差矩阵转化为一系列离散分布的真实环境内的实体对象的空间定位描述形式——即所谓的“点云”。 #### 总结说明 综上所述,整个过程涉及到了多个环节紧密相连的操作序列,包括但不限于前期准备阶段所做的精确标定作业以获得必要的内部参量设定值(比如光学中心cx,cy还有镜头本身的聚焦能力体现指标fx,fy),中期执行高效的区域间相似性比较策略从而达成精准配对效果最后再借助基础物理学规律完成最终的目标量化评估任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值