0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

双目测距系列(二):鱼眼镜头双目标定及测距

电子设计 来源:电子设计 作者:电子设计 2020-12-08 22:11 次阅读
转载自:双目测距系列(二)鱼眼镜头双目标定及测距
作者:ltshan139

前言

这几天把基于opencv C++ api将鱼眼镜头的双目标定以及测距功能实现完毕,效果还可以,至少对齐得非常棒。 这里把其流程及其关键函数在这里总结一下。
对于双目标定而言,opencv一共支持两种模型:普通针孔相机模型和鱼眼相机模型fisheye。后者是opencv3.0后才开始支持的。从使用角度讲,它俩主要差别就在于畸变系数不一样。
双目测距流程一共分为四大步:标定,对齐,匹配以及测距。这点对于普通摄像头模型和鱼眼模型都适用。下面就基于鱼眼摄像头模型来讲解各个步骤具体内容。

标定

标定Calibration包括单目标定和双目标定,前者的输出结果主要是内参(3x3矩阵,包括fx,fy以及cx和cy)和畸变系数(1x4矩阵 K1,K2,K3,K4);后者输出的主要是是外参,即右摄像头基于左摄像头的姿态,包括R和T两个矩阵。
标定一个主要工作就是对着标定板拍图,标定板最好遍布整个图像区域,一般20~30张就足够了。 opencv目前可以对三种pattern的标定板:棋盘格,圆以及非对称圆来找角点,其API如下所示:

    case Settings::CHESSBOARD:
        found = findChessboardCorners( view, s.boardSize, pointBuf, chessBoardFlags);
        break;
    case Settings::CIRCLES_GRID:
        found = findCirclesGrid( view, s.boardSize, pointBuf );
        break;
    case Settings::ASYMMETRIC_CIRCLES_GRID:
        found = findCirclesGrid( view, s.boardSize, pointBuf, CALIB_CB_ASYMMETRIC_GRID );

角点正确找到后,就可以开始单目标定,其对应API为:

CV_EXPORTS_W double calibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, const Size& image_size,
    InputOutputArray K, InputOutputArray D, OutputArrayOfArrays rvecs, OutputArrayOfArrays tvecs, int flags = 0,
        TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 100, DBL_EPSILON));

单目标定结束后,接下来就是双目标定:

CV_EXPORTS_W double stereoCalibrate(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints1, InputArrayOfArrays imagePoints2,
                              InputOutputArray K1, InputOutputArray D1, InputOutputArray K2, InputOutputArray D2, Size imageSize,
                              OutputArray R, OutputArray T, int flags = fisheye::CALIB_FIX_INTRINSIC,
                              TermCriteria criteria = TermCriteria(TermCriteria::COUNT + TermCriteria::EPS, 100, DBL_EPSILON));

这里需要注意的是,双目标定可以基于前面单目标定出来的内参来直接算R和T,也可以将单目内参作为一个初始值来重新迭代计算出新的内参和R以及T。

对齐

摄像头内参和外参都有了之后,就可以开始调用下面的API来分别获得左、右摄像头新的旋转矩阵R和内参投影矩阵P。

CV_EXPORTS_W void stereoRectify(InputArray K1, InputArray D1, InputArray K2, InputArray D2, const Size &imageSize, InputArray R, InputArray tvec,
    OutputArray R1, OutputArray R2, OutputArray P1, OutputArray P2, OutputArray Q, int flags, const Size &newImageSize = Size(),
    double balance = 0.0, double fov_scale = 1.0);

紧接着是基于新的矩阵来生成左右摄像头的映射表left_mapx, left_mapy, right_mapx以及right_mapy。

CV_EXPORTS_W void initUndistortRectifyMap(InputArray K, InputArray D, InputArray R, InputArray P,
    const cv::Size& size, int m1type, OutputArray map1, OutputArray map2);

有了映射表mapx和mapy,在后面测距的时候就可以调用remap()来对新的测试图片进行校正。

匹配

匹配是相对最耗时的步骤,即使前面左右图像对齐后,只需要在行上来匹配。常用的匹配算法有SGBM,BM等等。相对来讲,SGBM兼顾了速度和准确度,因而用的比较多。

Ptr sgbm = StereoSGBM::create(0, 16, 3);
sgbm->setPreFilterCap(63);
sgbm->setBlockSize(pParas->sgbmWindowSize);
int channel_cnt = left_rectify_img.channels();
sgbm->setP1(8 * channel_cnt * pParas->sgbmWindowSize * pParas->sgbmWindowSize);
sgbm->setP2(32 * channel_cnt * pParas->sgbmWindowSize * pParas->sgbmWindowSize);
sgbm->setMinDisparity(0);
sgbm->setNumDisparities(pParas->NumDisparities);
sgbm->setUniquenessRatio(pParas->UniquenessRatio);
sgbm->setSpeckleWindowSize(101);
sgbm->setSpeckleRange(10);
sgbm->setDisp12MaxDiff(-1);
sgbm->setMode(StereoSGBM::MODE_SGBM);

opencv已经将匹配算法 封装的很好了,唯一需要注意的就是参数值得调节会带来不一样得匹配效果。常见的需要调节的参数有:

    paras.sgbmWindowSize = 7;
    paras.NumDisparities = 16 * 20;
    paras.UniquenessRatio = 12;

测距

匹配完成就能得到视差图disparity map。 有了视差图,每个点的Z方向上深度值获取就变得简单了。通过下面公式:
Z = B * fx / d
B是两个摄像头之间的距离,其值等于外参平移矩阵X方向上的绝对值,即abs(T.at(0,0))。
fx则为左摄像头内参矩阵的第一个值m_fisheye_intrinsicsL.val[0]
d则为每个像素在左右摄像头像素坐标系上X方向的差,由前面匹配步骤所得。



推荐阅读



更多海思AI芯片方案学习笔记欢迎关注海思AI芯片方案学习

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • AI
    AI
    +关注

    关注

    87

    文章

    30898

    浏览量

    269121
  • 深度学习
    +关注

    关注

    73

    文章

    5503

    浏览量

    121172
收藏 人收藏

    评论

    相关推荐

    毫米波雷达如何提高测距精度

    毫米波雷达提高测距精度的方法可以从多个方面入手,以下是一些主要的方法: 一、改进信号处理威廉希尔官方网站 采用高级计算机算法 : 在目标检测和跟踪等方面,高级的计算机算法可以实现目标的精确定位、精准跟踪,并且
    的头像 发表于 12-03 17:33 418次阅读

    UWB模块的测距精度分析

    随着物联网(IoT)和工业4.0的发展,对精确测距和定位的需求日益增长。超宽带(UWB)威廉希尔官方网站 因其独特的优势,成为实现高精度测距的关键威廉希尔官方网站 之一。 超宽带威廉希尔官方网站 概述 超宽带威廉希尔官方网站 是一种无线通信威廉希尔官方网站 ,其特点是
    的头像 发表于 10-31 13:52 352次阅读

    激光测距传感器怎么接线

    物体反射后,被接收器接收。通过测量激光发射和接收的时间差,可以计算出传感器与目标物体之间的距离。激光测距传感器的测量精度高、响应速度快、抗干扰能力强,是一种非常实用的测量工具。 、激光测距
    的头像 发表于 08-29 16:13 809次阅读

    激光测距传感器输出什么信号

    基于激光束的时间飞行原理(TOF, Time of Flight)。通过发射激光脉冲并接收其反射回来的信号,传感器能够计算激光脉冲的飞行时间,进而确定目标物体与传感器之间的距离。这种测距方式具有高度的精确性和分辨率,广泛应用于工业自动化、机
    的头像 发表于 08-29 16:08 595次阅读

    测距模组

    我想找寻做测距模组开发的方案商,合适:2898201328
    发表于 07-04 11:24

    UWB测距典型应用:人车测距防撞

    UWB测距相较UWB定位结构更为简单:测距基站、测距标签、声光报警器(非必选)就构成了一组测距单元,无需调试校准,只需预先在后台设置好距离阈值就能够便捷部署应用。典型应用:人车
    的头像 发表于 06-28 10:36 462次阅读
    UWB<b class='flag-5'>测距</b>典型应用:人车<b class='flag-5'>测距</b>防撞

    XL5300 dTOF测距模块简单介绍,加镜头后可达7.6米测距距离,±4%测距精度

    的ToF 采集与处理威廉希尔官方网站 ,XL5300模块可实现最大 4 米的精确距离测量,加上配套光学镜头后可实现最大7.6M测量距离,测距精度可以达到±4%,最大90 Hz快速测距频率 。 XL5300 dTOF
    的头像 发表于 06-19 17:18 522次阅读

    激光测距仪真的好用吗?

    回来的时间,精确计算出目标物体的距离。 一、精准测量 鼎跃激光测距仪(DY-DZE-CJY)利用激光的特性,可以精准的测量出动态或静态目标物体的距离。测量距离可达600米,测速范围覆盖0-300公里/小时。与传统的测量工具相比,
    的头像 发表于 06-13 18:23 1153次阅读
    激光<b class='flag-5'>测距</b>仪真的好用吗?

    奥比中光正式发布全新Gemini 330系列双目3D相机

    4月29日,奥比中光正式发布全新Gemini 330系列双目3D相机,首发产品包括Gemini 335、Gemini 335L两款通用型高性能双目3D相机。
    的头像 发表于 04-30 10:41 646次阅读
    奥比中光正式发布全新Gemini 330<b class='flag-5'>系列</b><b class='flag-5'>双目</b>3D相机

    工业相机单目和双目的区别

    工业相机标定的方法根据工业相机的数目可分为单目标定双目标定Q以及多目标定
    的头像 发表于 03-26 16:26 1915次阅读
    工业相机单目和<b class='flag-5'>双目</b>的区别

    激光测距传感器的原理和应用实例

    激光测距传感器原理和应用实例 激光测距传感器是一种通过激光威廉希尔官方网站 进行距离测量的传感器。它利用激光器产生的激光束,经过目标物体后,通过接收器接收反射回来的激光束,通过计算激光的回程时间来确定目标
    的头像 发表于 03-05 16:29 1654次阅读

    激光测距仪工作原理 晶振在激光测距仪的作用

    激光测距仪工作原理 晶振在激光测距仪的作用  激光测距仪是一种利用激光威廉希尔官方网站 测量物体距离的仪器。它通过测量激光脉冲在空气中传播的时间来计算出物体到测距仪的距离。下面将详细介绍激光
    的头像 发表于 01-25 16:04 1429次阅读

    超声波测距原理 超声波测距离传感器接线方法

    超声波测距是一种常用的测距方法,通过发射超声波脉冲,利用其在空气中传播速度较快的特点,测量出从传感器到目标物体的时间差,并进而计算出距离。超声波测距具有非接触式、高精度、可靠性高等特点
    的头像 发表于 01-22 15:22 2433次阅读

    单目视觉系统检测车辆的测距方法

    以前提过单目测距的问题,检测的障碍物2-D框加上摄像头的姿态和路面假设。以下根据公开发布的论文讨论具体的算法。
    发表于 01-11 10:47 439次阅读
    单目视觉系统检测车辆的<b class='flag-5'>测距</b>方法

    激光测距模块的工作原理 激光测距模块怎么用 激光测距方法有哪几种

    激光测距模块的工作原理 激光测距模块怎么用 激光测距方法有哪几种  激光测距模块,也称为激光测距仪或激光
    的头像 发表于 01-03 15:59 1881次阅读