
来源:https://blog.csdn.net/dulingwen/article/details/104128503
作者:dulingwen@CSDN(已授权)
编辑:3D视觉开发者社区

, 一般最小视差设置为0,最大视差需要根据所使用的场景来调整。首先对左图像采用3X3的sobel算子进行滤波,获取每一个像素点的水平和垂直响应值Gx和Gy。然后对每一个像素,从其周围5X5邻域中的水平方向响应值选取12个,垂直方向响应值选取4个,构成一个16维的特征向量: 
、
、
、
、
,进行匹配,匹配对的相似性度量值的计算方式如下:
三、立体匹配的概率生成模型
表示支持点的集合,每一个支持点
令
表示观测点的集合,每一个观测点
其中
为特征向量。令
和
表示左右图像中对应像素点。不失一般性,将左图作为参考图。在给定视差
条件下,观测对
和支持点集S是条件独立的,他们的联合分布可以被分解为:
称为先验概率,
称为似然概率。(1)先验概率建模
作者认为先验概率与均匀分布和高斯分布的组合成比例:

为观测点基于周围支持点的平均值,
为观测点
周围20X20邻域内所有支持点的视差值所构成的取值范围。为了进一步缩小取值范围,所有与均值之差大于
的视差都被排除了。
表示为一个分段线性函数,可以通过基于支持点构建的delaunay三角形来进行视差插值得到。对每一个三角形,其所在的视差平面定义如下:
所属三角形的索引,对每一个三角形,平面参数
可以由三角形的三个顶点通过求解线性方程求得。
和
为特征向量,
是一个常数。if条件保证似然概率约束在左右图像的同一行上。特征向量由观测点周围5X5邻域内像素的sobel响应值拼接而成,故其维数2X5X5=50(实际使用的特征向量依然按照上一节所引入的16维特征向量)。作者在文中特别指出基于sobel滤波的特征性能明显好于基于LoG滤波的特征。
可以根据先验概率分布,
随机采样视差
;
和
,可以根据似然概率分布
得到右图对应点
。


,
,........
表示右图中位于
对极线上的观测点。后验概率表示给定左图观测点、支持点集和右图观测点,左图观测点取视差
的概率。后验概率可以被分解为:

的视差。出于编程的考虑,实际当中应用的能量函数为:
sradius一般取2或3;
五、后处理
的视差为
,则右图的对应点
的视差为
,若
,则认为视差
是可靠的,否则将其置为-1或其他无效值。其中
一般取1或2,可适当调整。
和
考虑深度突变,则其中所有点的视差的插值公式如下:
其中
表示深度不连续的阈值。垂直方向也以同样的方法进行一次插值。
using namespace std;using namespace cv;int main(int argc, char** argv){string path1 = "C:/Users/thinkpad/Desktop/left/000003.png";string path2 = "C:/Users/thinkpad/Desktop/right/000003.png";//读取左右视图Mat left = imread(path1, -1);Mat right = imread(path2, -1);if (left.size != right.size) {cerr << "左右视图必须拥有相同的尺寸" << endl;return -1;}if (left.channels() == 3)cvtColor(left, left, COLOR_RGB2GRAY);if (right.channels() == 3)cvtColor(right, right, COLOR_RGB2GRAY);int width = left.cols;int height = left.rows;int dim[3] = { width, height, width };Mat disp_left = Mat::zeros(Size(width, height), CV_32FC1);Mat disp_right = Mat::zeros(Size(width, height), CV_32FC1);// 参数设置Elas::parameters param;param.disp_min = 0; // 最小视差param.disp_max = 256; // 最大视差param.support_threshold = 0.85; // 比率测试:最低match VS 次低matchparam.support_texture = 10; // 支持点的最小纹理param.candidate_stepsize = 5; // 用于支持点的sobel特征匹配的邻域半径param.incon_window_size = 5; // 不连续性窗口的尺寸param.incon_threshold = 5; // 不连续性窗口内的视差范围阈值param.incon_min_support = 5; // 不连续性窗口内的最低支持点数量param.add_corners = true; // 是否添加角点param.grid_size = 20; // 网格尺寸param.beta = 0.02; // 图像相似性度量的参数param.gamma = 3; // 先验概率常数param.sigma = 1; // 先验概率的标准差param.sradius = 3; // 标准差半径param.match_texture = 1; // 最低纹理param.lr_threshold = 1; // 左右一致性检验阈值param.speckle_sim_threshold = 1; // 连通域判断阈值param.speckle_size = 200; // 连通域噪声尺寸判断阈值param.ipol_gap_width = 3; // 空洞宽param.filter_median = false; // 是否中值滤波param.filter_adaptive_mean = true; // 是否自适应中值滤波param.postprocess_only_left = true; // 是否只对左视差图后处理,设置为True可以节省时间param.subsampling = false; // 每个两个像素进行视差计算,设置为True可以节省时间,但是传入的D1和D2的分辨率必须为(w/2) x (h/2)clock_t start = clock();Elas elas(param);elas.process(left.data, right.data, disp_left.ptr<float>(0), disp_right.ptr<float>(0), dim);clock_t end = clock();cout << "running time:" << (double)(1000 * (end - start) / CLOCKS_PER_SEC) << endl;disp_left = disp_left * 3;imwrite("C:/Users/thinkpad/Desktop/disparity.jpg", disp_left);}
七、实验效果



重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿 
▲长按关注公众号


▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款 
圈里有高质量教程资料、可答疑解惑、助你高效解决问题 觉得有用,麻烦给个赞和在看~

