双目立体三维重建原理及介绍

本文概述了双目立体视觉深度相机的工作流程,包括相机标定、图像校正、像素点匹配及深度计算。双目测距适用于近距离高精度测量,其精度与基线长度有关。尽管受光照和相机稳定性影响,但经过标定后可使用OpenCV进行三维重建和测距。
摘要由CSDN通过智能技术生成

1、双目立体视觉深度相机简化流程

下面简单的总结一下双目立体视觉深度相机的深度测量过程,如下:

1)、首先需要对双目相机进行标定,得到两个相机的内外参数、单应矩阵。

2)、根据标定结果对原始图像校正,校正后的两张图像位于同一平面且互相平行。

3)、对校正后的两张图像进行像素点匹配。

4)、根据匹配结果计算每个像素的深度,从而获得深度图

2、应用场景

双目测距的精度和基线长度(两台相机之间的距离)有关,两台相机布放的距离越远,测距精度越高。
但问题是:往往在实际应用中,相机的布放空间是有限的,最多也只有几米或几十米的基线长度,这就导致双目测距在远距离条件下的精度大打折扣。

所以,双目测距一般用于近距离的高精度测量,而远距离测距一般用脉冲式的激光测距机。
图像测量方法的优点是近距离精度高,但是图像质量受外界光照等条件制约太大,且由于相机性能往往不够稳定,加上算法相对复杂些,这些都会限制它的应用。


在相机标定后,我们就可以用得到的相机内参矩阵、畸变矩阵、两相机相对位置变换矩阵进行三维重建了。用数学方法进行空间变换很容易得到图像坐标(在两相机拍摄的同一帧图像上对应点坐标)与三维坐标(相对某一相机建模的三维坐标)之间的关系,原理参考https://blog.csdn.net/tiemaxiaosu/article/details/51734667#commentsedit

OpenCV goodFeaturesToTrack()函数得到角点坐标,取得左右相机同一帧图像对应点AB的像素坐标。

再计算得到空间两点AB双目三维空间计算距离和实际测量距离,得到三维建模测距误差,三维建模代码如下:

3、代码实现
Point2f xyz2uv(Point3f worldPoint,float intrinsic[3][3],float translation[1][3],float rotation[3][3]);
Point3f uv2xyz(Point2f uvLeft,Point2f uvRight);
 
//左相机内参数矩阵
float leftIntrinsic[3][3] = {
   294.0911635717881,	 0,		310.6171586702577,
                             0,	295.3905526589596,		256.4320568139868,
                             0,			 0,				1};
 
//左相机旋转矩阵
float leftRotation[3][3] = {
   1,	        0,		0,
                            0,		1,		0,
                            0,		0,		1};
//左相机平移向量
float leftTranslation[1][3] = {
   0, 0, 0};
 
//右相机内参数矩阵
float rightIntrinsic[3][3] = {
   293.27225104276044,0,335.4364278875495,
                              0, 295.1891754871827, 263.677364491931,
                              0,		0,		  1};
//右相机旋转矩阵
float rightRotation[3][3] = 
                {
   0.9997690293617348,-0.015539793483491028,0.014845967384545062,
                 0.01554105039759545,0.99987923011213,3.070686448984299e-05,
                 -0.014844651617061421,0.00020002215521852068,0.9998897920818591};
//右相机平移向量
float rightTranslation[1][3] = {
   0.05875655764200672, -0.0013795019307868321, -0.00044022562044059466};
 
int main(int argc, char *argv[]) {
   
 
    //左相机图像坐标
    Point2f left(236,153);
    //对应点右相机坐标
    Point2f right(281,162);
    Point3f worldPoint;
    worldPoint = uv2xyz(left,right);
    cout<<"A点空间坐标为:"<<endl<<uv2xyz(left,right
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值