前言

这几天把基于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<StereoSGBM> 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<double>(0,0))。

fx则为左摄像头内参矩阵的第一个值m_fisheye_intrinsicsL.val[0]

d则为每个像素在左右摄像头像素坐标系上X方向的差,由前面匹配步骤所得。

双目测距系列(二)鱼眼镜头双目标定及测距相关推荐

  1. 双目测距(二)--双目标定与矫正

    原文: http://blog.csdn.net/chenyusiyuan/article/details/5963256 双目摄像头定标不仅要得出每个摄像头的内部参数,还需要通过标定来测量两个摄像头 ...

  2. 【计算机视觉】双目测距(二)--双目标定与矫正

    原文: http://blog.csdn.NET/chenyusiyuan/article/details/5963256 双目摄像头定标不仅要得出每个摄像头的内部参数,还需要通过标定来测量两个摄像头 ...

  3. opencv与两个摄像头实现双目标定与测距

    http://download.csdn.net/detail/hysteric314/9514831 实现效果:http://v.youku.com/v_show/id_XMTU2Mzk0NjU3N ...

  4. FPGA开源项目:双目测距(二)之Matlab算法仿真以及图片转txt

    1.简述 今天完成双目测距项目的第二部分,实现Matlab算法仿真,主要包括图像二值化.计算目标坐标.目标框选以及将图片转为txt用于后面的FPGA算法仿真.Matlab代码工程关注我的公众号:芯王国 ...

  5. 双目摄像头的标定和测距(一)

    双目摄像头的标定和测距 摄像头测试 摄像头标定 图像获取 摄像头标定 摄像头测距 运行环境 Ubuntu 18.04 LTS ROS version Melodic OpenCV1 version 3 ...

  6. 自动驾驶采标系列二:车载感知与车载传感器标定

    上一篇文章对自动驾驶采标问题中的一系列法律问题进行了浅析,接下来自动驾驶采标系列里面会对自动驾驶相关技术和知识点进行进一步梳理,来帮助小伙伴深入的了解自动驾驶的架构逻辑与数据采标工作的关系. 上文中提 ...

  7. 双目视觉(二)双目匹配的困难和评判标准

    系列文章: 双目视觉(一)双目视觉系统 双目视觉(二)双目匹配的困难和评判标准 双目视觉(三)立体匹配算法 双目视觉(四)匹配代价 双目视觉(五)立体匹配算法之动态规划全局匹配 双目视觉(六)U-V视 ...

  8. ros --- 双目相机内参与外参标定

    ros --- 双目相机内参与外参标定 小觅相机直接获取参数 手动重新标定 1. 双目相机内外参标定 生成标定板 录制 stereo_calibra.bag 标定 标定结果 标定验证 2. 双目 + ...

  9. Jetson nano 上使用ROS进行双目摄像头(CSI-IMX219)操作标定

    Jetson nano 上使用ROS进行双目摄像头(CSI-IMX219)操作标定 Nvidia的Jetson nano上使用索尼的IMX219相机操作ROS CSI-IMX219简介 imx219是 ...

最新文章

  1. 什么是软件定义数据中心
  2. 阿里云蒋江伟:我们致力于为世界提供70%的算力 | 凌云时刻
  3. AESNI/XData勒索病毒来袭 目前主要在乌克兰传播 它居然还能使用硬件加速加密过程...
  4. 理解一个类里边设置两个同名函数
  5. 【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出
  6. redis中文显示问题
  7. 模板 - 数论 - 整除分块
  8. 【Jenkins】构建后生成下载二维码并邮件通知
  9. 分辨率测试靶-标定显微镜、相机等光学系统的分辨率
  10. Topaz DeNoise AI 3.7 人工智能降噪
  11. 音频硬件发展史,以及DSD是如何产生的 一起说一说音频
  12. websocket 1006错误码
  13. nginx 版本升级
  14. UEFI 模式下重新安装系统注意事项
  15. 源于旗舰大厂的设计艺术——飞利浦Fidelio L3简评
  16. 置剪辑板文本_实验背景剪辑:文本
  17. 乔布斯那些经典的激励我们的语录
  18. 水仙花数python代码多种方式_水仙花数的三种解决方法(Python实现)
  19. mysql中vlookup函数_VLOOKUP函数的使用方法(入门级)
  20. oracle修改用户system密码忘记,Oracle System密码忘记 密码修改、删除账号锁定lock (转) - mano...

热门文章

  1. 我是做地推的,一个月收入大概2W左右
  2. Dinic算法 (优化)
  3. PC端品优购注册页面 resgister.css以及web服务器学习
  4. 百度网盘秒传链接生成及提取方法
  5. linux xrdp 远程桌面,详解如何在Ubuntu 20.04上安装Xrdp服务器(远程桌面)
  6. 腾讯财经 财经资讯 专题栏目 商业人生
  7. UBTC主网已实现智能合约及混合共识机制!
  8. 戴尔INSPIRON 14-7472 DDH40 DDH50 LA-F251P r1.0笔记本图纸
  9. java:单词接龙(dfs)(重点看看:包括相同单词不包含,还有找到第一个相同的开头单词相同的字母,连接字符串重复部分删除)
  10. 10个优秀的日志分析工具