1.双目立体匹配算法

左右视差
以后再细写。

1.1 立体匹配的流程

  • 摄像机标定(包括内参和外参):直接用matlab标定工具箱即可
  • 双目图像的校正(包括畸变校正和立体校正):立体校正opencv samples里给了案
  • 立体匹配算法获取视差图,以及深度图
  • SAD/SGBM/BM/GC/
  • 利用视差图,或者深度图进行虚拟视点的合成
  • 利用分水岭算法或者Grabcut算法进行分割

1.2 最新的方法

最近已经出现了使用DL做视差预测以及场景流预测的工作了,如:
Pyramid Stereo Matching Network (CVPR2018):

2.SGBM算法

SGBM(semi-global block matching,又称SGM算法)
参考SGM算法思路
该算法已经在opencv库中,函数为SGBM;并且在ROS中也有实现,并且为默认方法
SGBM详细步骤可参考:SGBM解读

2.1 算法原理

主要分为:
1)预处理 preprocessing:
先运用sobel算子获得边缘;
再用一个函数将经过水平Sobel算子处理后的图像上每个像素点
预处理实际上是得到图像的梯度信息

2)代价计算 cost
包括:

  • 经过预处理得到的图像的梯度信息经过基于采样的方法得到的梯度代价;
  • SAD(sum of absolute difference),即左右图像在一个窗口内对应像素之差的和。

3)动态规划 dynamic programming

4)后处理 postprocessing

  • 唯一性检测
  • 亚像素差值
  • 左右一致性检测
  • 连通区域检测

2.2 opencv4.0调用

如下,其中比较关键的参数有:
1)预处理
preFilterCap:水平sobel预处理后,映射滤波器大小,默认为15。
2)代价函数
minDisparity:最小视差,默认为0。此参数决定左图中的像素点在右图匹配搜索的起点。
numberOfDisparities:视差搜索范围,其值必须为16的整数倍。最大搜索边界= numberOfDisparities+ minDisparity。我通常取64。
SADWindowSize:SAD窗口大小,通常取11。
3)动态规划
有两个参数,分别是P1、P2,它们控制视差变化平滑性的参数。
P1、P2的值越大,视差越平滑。P1是相邻像素点视差增/减 1 时的惩罚系数;P2是相邻像素点视差变化值大于1时的惩罚系数。P2必须大于P1。需要指出,在动态规划时,P1和P2都是常数。
在官方例子中,
P1=8cnsgbm.SADWindowSizesgbm.SADWindowSize;
P2=32
cnsgbm.SADWindowSizesgbm.SADWindowSize;
4)后处理
uniquenessRatio:唯一性检测参数。用于判断当前像素点是否无匹配,取值在5-15之间,通常取10。
disp12MaxDiff:左右一致性检测最大容许误差阈值,通常取1。
speckleWindowSize:视差连通区域像素点个数的大小。对于每一个视差点,当其连通区域的像素点个数小于speckleWindowSize时,认为该视差值无效,是噪点。通常取100。
speckleRange:视差连通条件,在计算一个视差点的连通区域时,当下一个像素点视差变化绝对值大于speckleRange就认为下一个视差像素点和当前视差像素点是不连通的。通常取10。

     string img_nameR = img_path +img_name;string img_truename = img_name.substr(0,img_name.find_last_of('R'));string img_nameL = img_path + img_truename+"L"+suffix;Mat left = imread(img_nameL, IMREAD_GRAYSCALE);Mat right = imread(img_nameR, IMREAD_GRAYSCALE);Mat disp;int mindisparity = 0;int ndisparities = 64;int SADWindowSize = 11;cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(ndisparities, SADWindowSize);// setterbm->setPreFilterType(1);bm->setBlockSize(SADWindowSize);bm->setMinDisparity(mindisparity);bm->setNumDisparities(ndisparities);bm->setPreFilterSize(15);bm->setPreFilterCap(31);bm->setTextureThreshold(10);bm->setUniquenessRatio(5);bm->setSpeckleRange(32);bm->setSpeckleWindowSize(100);bm->setDisp12MaxDiff(1);copyMakeBorder(left, left, 0, 0, 80, 0, BORDER_REPLICATE);  //防止黑边copyMakeBorder(right, right, 0, 0, 80, 0, BORDER_REPLICATE);bm->compute(left, right, disp);disp.convertTo(disp, CV_32F, 1.0 / 16); //除以16得到真实视差值disp = disp.colRange(80, disp.cols);Mat disp8U = Mat(disp.rows, disp.cols, CV_8UC1);normalize(disp, disp8U, 0, 255, NORM_MINMAX, CV_8UC1);

参考:立体匹配
总结:

  1. blockSize(SADWindowSize) 越小,也就是匹配代价计算的窗口越小,视差图噪声越大;blockSize越大,视差图越平滑;太大的size容易导致过平滑,并且误匹配增多,体现在视差图中空洞增多;
  2. 惩罚系数控制视差图的平滑度,P2>P1,P2越大则视差图越平滑;
  3. 八方向动态规划较五方向改善效果不明显,主要在图像边缘能够找到正确的匹配;

2.2 UV视差

参考:
U-V视差1

U-V视差2

2.3 Git Repo参考

其实git上一搜一大把,还是贴几个以供参考,记录一下。

  • SGM-disparity
  • SGM(包含GPU版本实现)
  • SGM-CPU实现
  • 基于CUDA的实现:https://github.com/fixstars/libSGM.git
  • 基于ROS与CUDA的实现:https://github.com/hunterlew/stereo_matching
  • 基于ROS并生成电云的实现:https://github.com/rachillesf/stereoMagic.git
  • Some basical stereo matching methods:https://github.com/galad-loth/StereoMatching.git

参考

双目视觉立体匹配算法相关推荐

  1. 兵器工业计算机应用研究所刘培志,一种双目视觉立体匹配算法_2

    和第六伺服电机.第一伺服电机.第二伺服电机和第三伺服电机分别驱动第一摄像装置上 下运动.绕光轴运动和左右运动,第四伺服电机.第五伺服电机和第六伺服电机分别驱动第 二摄像装置上下运动.绕光轴运动和左右运 ...

  2. 双目视觉(三)立体匹配算法

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

  3. 双目视觉(五)立体匹配算法之动态规划全局匹配

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

  4. 基于深度学习算法和传统立体匹配算法的双目立体视觉

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01 立体视觉是什么? 在开始之前,我相信很多站友都会有这个疑问, ...

  5. 双目立体匹配算法SGBM

    semi-global matching(SGM)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SG ...

  6. 立体匹配算法-初步了解

    双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左.右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图.而深度图的应用范围非常广泛,由于其能够记录场景中物体距离摄像机的距离,可 ...

  7. 双目立体匹配算法:Patch Match Stereo实用详解教程

    来源:CSDN 作者:dulingwen 01 简介 我们知道,现有立体匹配算法一般被分类为局部算法.全局算法和半全局算法,其中局部算法和半全局算法是应用最为广泛的.在局部算法中,一个最简单的做法就是 ...

  8. OpenCv中实现了三种立体匹配算法:

    OpenCv中实现了三种立体匹配算法: BM算法 SGBM算法 Stereo Processing by Semiglobal Matching and Mutual Information GC算法 ...

  9. 立体匹配算法实现之:AdaptWeight

    from: http://blog.sina.com.cn/s/blog_500afcd40100lqi1.html 我的主要研究方向是立体匹配(Stereo Matching),是计算机视觉(Com ...

  10. 立体匹配十大概念综述---立体匹配算法介绍

    from:https://blog.csdn.net/wintergeng/article/details/51049596 一.概念 立体匹配算法主要是通过建立一个能量代价函数,通过此能量代价函数最 ...

最新文章

  1. XML之父从愤然亚马逊离职,放弃百万年薪,谷歌华为争抢
  2. python语言使用什么语句实现上下文管理协议_Python with语句上下文管理器两种实现方法分析...
  3. 36、Power Query-多条件合并查询
  4. .NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程
  5. LeetCode:204. 计数质数
  6. 关于爬取网易云全部评论的一些疑问
  7. [原创]java导出excel
  8. 23. PHP include and require 文件
  9. 全国java二级考试范围,全国计算机二级Java考试大纲
  10. 布客·ApacheCN 编程/大数据/数据科学/人工智能学习资源 2020.2
  11. 单基因gsea_JTO:日本Smoker基因组综合分析
  12. Interpreting visually-grounded navigation instructions in real environments论文翻译
  13. unity3d内存分析工具memory profiler
  14. Java利用接口计算立体图形的表面积和体积
  15. NLP基础知识(三)-AI应用篇
  16. 【NOIP普及组】 1945:【09NOIP普及组】多项式输出
  17. SAP 基于收货的发票校验 GR-Based IV
  18. MATLAB去读网页源码时中文乱码
  19. C语言源文件名为什么无效,scanf函数,想说输入不容易!----小话c语言(3)
  20. 登陆注册-带图片的验证码

热门文章

  1. Oracle数据库的ORA-00257故障解决过程(转载)
  2. 快递100支持的物流公司
  3. uppy JavaScript 文件上传
  4. 教你写Linux设备驱动程序:一个简短的教程
  5. 如何解决Mac使用向日葵(sunlogin)经常无法打开 connect is error
  6. javaWeb发展历史
  7. 2018CVPR:Non-local Neural Networks(自注意力机制捕获远程依赖)
  8. bode图处理----当相频特性曲线纵坐标超过正负180度
  9. 基于matlab 的电力系统潮流仿真
  10. 将两个PCB文件合并成一个文件