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

    文章

    27436

    浏览量

    265117
  • 深度学习
    +关注

    关注

    73

    文章

    5264

    浏览量

    120173
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    新品双目测宽仪测量原理 宽厚板材在线检测

    宽厚板材在线测宽,可采用双目测宽仪,如果采用平行光检测法,有可能会因为倾斜导致测量不准,因此采用双目测宽仪进行宽度尺寸的检测。 双目测宽仪测量原理 在利用相机测量宽度时,由于单个相机在成像时存在“近
    发表于 11-20 17:25

    单目光波导AR眼镜VS双目光波导智能眼镜

    单目AR眼镜具有较小的视角,相比双目眼镜更轻便且结构更稳定,佩戴者可以持久稳定地使用,但其显示效果在沉浸感和观感上不如双目眼镜好。相比于单目
    的头像 发表于 11-17 19:44 454次阅读
    单目光波导AR<b class='flag-5'>眼镜</b>VS<b class='flag-5'>双目</b>光波导智能<b class='flag-5'>眼镜</b>

    双目立体视觉是什么?单目视觉与双目立体视觉的区别?

    双目更多的是基于物理测量,而单目视觉则是基于逻辑推理,通过大量的数据训练,先识别出目标,再根据目标的大小和高度估算距离。因此,单目视觉的漏检率高于双目立体视觉,因为客观上存在corne
    发表于 08-17 09:40 2726次阅读
    <b class='flag-5'>双目</b>立体视觉是什么?单目视觉与<b class='flag-5'>双目</b>立体视觉的区别?

    双目测距的机器视觉简单实例分享

    本实例背景较为简单,只能适用于固定场合的零件检测,水果品质检测等。基本的几何知识是必要的,例如求直线的交点,一元函数的线性回归。
    发表于 07-19 12:43 372次阅读
    <b class='flag-5'>双目测距</b>的机器视觉简单实例分享

    手眼标定的详细推导过程

    机械手搭载双目相机,手眼标定
    的头像 发表于 07-11 11:18 1476次阅读
    手眼<b class='flag-5'>标定</b>的详细推导过程

    几种经典的双目匹配的算法

      在深度相机的主流技术方案Structure Light,ToF,Stereo Dual)中,主动双目成像方案可以基于低成本的硬件,获得高分辨率、高精度的深度图像,但是立体匹配算法(stereo
    的头像 发表于 07-04 11:33 2145次阅读
    几种经典的<b class='flag-5'>双目</b>匹配的算法

    双目相机标定的原理和方法

    首先,课程介绍了双目相机标定的基础知识。我了解到双目相机是由两个相机组成的系统,通过同时拍摄目标物体的两个视角来获取三维信息。
    的头像 发表于 07-03 14:25 2466次阅读
    <b class='flag-5'>双目</b>相机<b class='flag-5'>标定</b>的原理和方法