【OpenCV】立体匹配算法SSD、NCC、ASW的基础实现

  要求:对给出的左右视图进行匹配,最后输出左右两张disparity map(视差图)

  e.g.

  左视图、右视图(两幅图像大小相同,只有水平方向上的视角变换)

   

  标准视差图如下:

   

  SSD(sum of squared differences)实现:

      

    1.把左右视图转成CV_8UC1单通道图像

      可以直接引用opencv的API实现、自己写一个对三通道取平均值或者按照下面公式转换的函数,对结果影响不大

      

    2.对每一个像素进行处理

      假设dmax=79,则有,对于每个像素的每个d值,计算patch(滑动窗口)内左右视图的像素灰度值的平方差之和,然后记录该值与其对应的d值

      此处可以用vector<pair<sum, d>>来存储结果

    3. 取最小sum值对应的d做为最终输出的disparity map对应点的灰度值

    result:5*5 窗口,坏点率分别为24,72%, 25.78%

     

  NCC(normalized cross-correlation)实现:

  

    1. 同样,先把左右视图转成单通道灰度图

    2. 然后对于每个像素做处理,对于每个对应的d值,先计算分子,在计算分母,最后把分子/分母的值与对应d值存入vector中

    3.取vector中最大值对应的d值为disparity map在该点的灰度值

    result:5*5窗口 坏点率:23.64%, 24.20% 比SSD稍微好一点

     

  ASW(Adaptive Support Weight)实现:

  

  

  

    这个就按公式实现,比较简单,如果窗口足够大的话,ASW的处理效果会比较好,但是会很慢

    但是中间计算Cpq值的时候主要要把BGR模型转换成Lab模型计算

    

    result:5*5 窗口大小,坏点率:31.33% , 31.39%

     

    33*33窗口大小,坏点率:19.44% , 20.75%(但是,跑了9242 seconds...可以自行感受一下...

     

    代码实现:https://github.com/CheerM/opencv_stereo_matching/tree/master/src

    BTW,哪位勇士跑完全部测例的ASW 33*33,能不能顺便分享一下数据给我看看,感激不尽啊>  <

    

转载于:https://www.cnblogs.com/cheermyang/p/5115354.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值