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

    文章

    30086

    浏览量

    268348
  • 深度学习
    +关注

    关注

    73

    文章

    5491

    浏览量

    120958
收藏 人收藏

    评论

    相关推荐

    激光测距传感器怎么接线

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    LabVIEW开发自动驾驶的双目测距系统

    LabVIEW开发自动驾驶的双目测距系统 随着车辆驾驶技术的不断发展,自动驾驶技术正日益成为现实。从L2级别的辅助驾驶技术到L3级别的受条件约束的自动驾驶技术,车辆安全性和智能化水平正在不断提升
    发表于 12-19 18:02

    硅光电倍增管用于直接飞行时间测距应用(一):直接ToF测距系统的设计

    硅光电倍增管用于直接飞行时间测距应用(一):直接ToF测距系统的设计
    的头像 发表于 12-07 10:23 620次阅读
    硅光电倍增管用于直接飞行时间<b class='flag-5'>测距</b>应用(一):直接ToF<b class='flag-5'>测距</b>系统的设计

    双目光波导AR智能眼镜_显示光机模组和主板硬件设计

    双目光波导AR智能眼镜_显示光机模组和主板硬件设计。该眼镜搭载采用12纳米工艺的MT6765芯片(还有两个可选芯片:MT6877和MT6833),并配备手机端MTK6765芯片,提供强大的计算能力
    的头像 发表于 12-04 17:55 1162次阅读
    <b class='flag-5'>双目</b>光波导AR智能<b class='flag-5'>眼镜</b>_显示光机模组和主板硬件设计

    双目测宽仪高质量生产利器 测宽仪价格

    双目测宽仪是基于机器视觉原理及模拟人的双眼进行宽度尺寸自动测量的仪器,是一种高度自动化的工业实时在线宽度检测仪表。 双目测宽仪是一种智能化的全自动工业在线实时宽度检测设备,两个工业相机就像人的双眼
    发表于 12-04 17:10

    机器视觉双目测宽仪具体有什么优势?

    双目测宽仪是机器视觉原来制造而成的智能宽度检测设备,广泛应用于板材类产品的宽度检测。通过测宽仪的使用,实时了解产品宽度品质,进行超差提示,减少废品的生产。 双目测宽仪优势 测量软件界面显示:产品规格
    发表于 11-28 17:13

    AR智能眼镜双目光波导/主板硬件技术

    AR眼镜_AR智能眼镜双目光波导/主板硬件技术。光波导技术结合Micro OLED屏幕被视为AR眼镜光学方案的黄金组合,具有轻薄、高清晰度、大视角和小体积等优势。在AR
    的头像 发表于 11-25 15:43 1648次阅读
    AR智能<b class='flag-5'>眼镜</b><b class='flag-5'>双目</b>光波导/主板硬件技术