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
    +关注

    关注

    91

    文章

    40935

    浏览量

    302512
  • 深度学习
    +关注

    关注

    73

    文章

    5603

    浏览量

    124609
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一文带你了解双目深度相机

    在如今的智能化时代,不管是工业车间里的机器人、家里的扫地机器人,还是AR眼镜、自动驾驶汽车,都需要一双能“看懂”三维世界的“眼睛”——双目深度相机就是这样一款设备。可能有人会问,这东西到底是啥?其实
    的头像 发表于 04-14 14:30 106次阅读
    一文带你了解<b class='flag-5'>双目</b>深度相机

    零碳园区光伏配套:西格防逆流系统,助力园区实现 “能源自给 + 零逆流” 双目标

    西格防逆流系统:壹.叁.柒-伍.零.零.肆-陆.贰.零.零,以“定制化调控、全链路协同、高效节能”为核心,精准打通园区光伏应用的堵点,助力园区高效实现“能源自给 + 零逆流”双目标,为零碳园区建设注入强劲动力。
    的头像 发表于 04-03 10:46 701次阅读
    零碳园区光伏配套:西格防逆流系统,助力园区实现 “能源自给 + 零逆流” <b class='flag-5'>双目标</b>

    RTK-SCAM-60 双目立体视觉相机|精准深度感知 全场景智能视觉

    RTK-SCAM-60双目相机是一款专为三维空间感知与距离测量打造的高精度双目立体视觉相机,整机采用5V低压供电模式,无需外接独立电源,真正实现即插即用,全方位简化部署与使用流程。设备搭载两组经精密
    的头像 发表于 03-27 14:28 143次阅读
    RTK-SCAM-60 <b class='flag-5'>双目</b>立体视觉相机|精准深度感知 全场景智能视觉

    ESP32驱动TFmini-S红外激光测距ToF模块进行测距

    本文介绍了TFmini-S红外激光测距ToF模块的基本特性,然后用ESP32开发板驱动TFmini-S模块进行测距,并在串口助手上显示出测距数据。
    的头像 发表于 03-06 14:43 311次阅读
    ESP32驱动TFmini-S红外激光<b class='flag-5'>测距</b>ToF模块进行<b class='flag-5'>测距</b>

    双目立体视觉相机产品介绍

    本产品是一款主打高精度感知、采用5V稳定供电的双目立体视觉相机,核心由两个经过精密同步调试与专业校准的独立相机模块组成,固定基线严格设定为60mm,专为各类场景下的三维空间感知与精准距离测量需求量
    的头像 发表于 02-28 15:08 253次阅读
    <b class='flag-5'>双目</b>立体视觉相机产品介绍

    无人机激光测距传感器使用指南

    无人机激光测距传感器(核心基于 ToF 或脉冲激光测距原理)是无人机实现定高飞行、避障导航、精准测绘、目标定位的关键部件,其使用需围绕 “选型适配→安装调试→功能配置→数据处理→场景优化” 五大核心
    的头像 发表于 01-09 13:41 1279次阅读
    无人机激光<b class='flag-5'>测距</b>传感器使用指南

    双目视觉是如何实现深度估计的?

    [首发于智驾最前沿微信公众号]自动驾驶的纯视觉方案中,单目摄像头因无法直接感知深度,在环境理解上存在根本局限,双目视觉技术在此需求下应运而生。它通过模拟人眼,利用双摄像头的视差来推算距离,将维图像
    的头像 发表于 12-31 09:45 663次阅读
    <b class='flag-5'>双目</b>视觉是如何实现深度估计的?

    自动驾驶既然有双目摄像头了,为什么还要三目摄像头?

    [首发于智驾最前沿微信公众号]在自动驾驶领域,纯视觉方案一直受到不少人的认可。双目摄像头由于模拟了人眼的工作方式,能够通过视差计算还原三维信息,在距离判断和空间感知上具有天然优势,因此被广泛应用于纯
    的头像 发表于 12-09 08:59 1227次阅读
    自动驾驶既然有<b class='flag-5'>双目</b>摄像头了,为什么还要三目摄像头?

    有没有推荐的激光测距传感器

    有推介的国内稍微头部一点的激光测距传感器品牌推介嘛,需要点对面测距
    发表于 11-13 11:54

    车载双目摄像头如何“看见”世界?

    [首发于智驾最前沿微信公众号]想要让车辆知道前方有什么、距离多远、是否可以靠近,首先要做的是让其“看”清楚环境。在众多车载感知硬件中,与人类看到世界最类似的一个感知硬件便是车载双目摄像头了。 图片
    的头像 发表于 11-13 09:17 1645次阅读
    车载<b class='flag-5'>双目</b>摄像头如何“看见”世界?

    IMU+多相机高速联合自动标定方案

    目、双目眼、长焦、TOF任意混搭,模组更换后自动识别。 标定结果可一键推送至MES/ERP,JSON/YAML/TXT格式全开放,后续OTA升级直接调用。 无需独立气源或冷却水;年维护费仅为进口设备的1/10。
    发表于 10-23 14:04

    光子精密双目3D线激光轮廓测量仪,摆脱视觉盲区,1台更比2台强!

    光子精密双目3D线激光轮廓测量仪(GL-8160D),在GL-8000系列的基础上创新升级。GL-8160D采用全新双目单线设计,突破传统3D视觉检测限制,而且不受外部拼接标定误差影响
    的头像 发表于 07-16 17:21 1535次阅读
    光子精密<b class='flag-5'>双目</b>3D线激光轮廓测量仪,摆脱视觉盲区,1台更比2台强!

    双目视觉在智能驾驶领域的应用

    围绕“双目智驾应用”,我们将推出系列文章深入解析双目视觉如何跨越技术鸿沟,在中国智驾的沃土上生根发芽,探索其赋能未来出行的无限可能。
    的头像 发表于 07-09 16:21 1455次阅读

    Nordic测距介绍

    蓝牙是目前使用最为广泛的有源物联网连接技术。 蓝牙测距有着广泛的目标市场和应用: 家庭:物品查找、宠物追踪 商业:资产跟踪,库存管理 汽车:无钥匙进入,远程遥控 目前的蓝牙定位主要使用的技术
    发表于 05-28 16:49

    UWB 定位测距

    开发板概述 核心芯片 :基于Decawave的DW3000芯片,主控为nrf52832,集成板载天线和电源管理模块。 定位性能 :支持单向测距(SWR)、双向测距(TWR)、TDOA定位方案
    发表于 05-12 09:36