【问题标题】:opencv stereobm, is it really based on SAD cost functionopencv stereobm,真的是基于 SAD 成本函数吗
【发布时间】:2014-07-01 10:21:38
【问题描述】:

我正在尝试增强 stereobm(Opencv 立体块匹配)。 他们声称该算法使用 SAD cost_function 方法。 (绝对差异的 SAD 总和)。

但是在代码中 他们以这种方式计算了 SAD:

        for( y = -dy0; y < height + dy1; y++, cbuf += ndisp, cbuf_sub += ndisp,
         hsad += ndisp, lptr += sstep, lptr_sub += sstep, rptr += sstep )
    {
        int lval = lptr[0];
        for( d = 0; d < ndisp; d++ )
        {
            int diff = std::abs(lval - rptr[d]);
            cbuf[d] = (uchar)diff;
            hsad[d] = hsad[d] + diff - cbuf_sub[d];
        }
        htext[y] += tab[lval] - tab[lptr_sub[0]];
    }
......
sad[d] = (int)(hsad0[d-ndisp*dy0]*(wsz2 + 2 - dy0));

//   *******************************
Instead of 
//....
hsad[d] = hsad[d] + diff ;  
// .....
sad[d] =  hsad[d]  

那么,为什么他们要与 *(wsz2 + 2 - dy0)) 相乘?

以及为什么他们在 (hsad[d] = hsad[d] + diff - cbuf_sub[d];) 中从 hsad[d] 中减去 cbuf_sub[d]

【问题讨论】:

  • wsz2 的值是多少?我猜这是某种标准化术语?
  • wsz2 是窗口大小的一半,dy0 来自感兴趣区域 dy0= roi.y;

标签: c++ opencv


【解决方案1】:

是的,OpenCV StereoBM 确实基于 SAD。

当你将滑动窗口在y方向滑动一行时,你不必为整个窗口重新计算SAD。相反,您将新行的 SAD 添加到窗口的 SAD。此外,您从中减去不再在窗口中的行的 SAD。

换句话说,一旦你有了初始窗口的 SAD,你就开始滑动窗口,只将窗口新的部分添加到 SAD,并减去不再在窗口中的部分,作为窗口已经通过了。

这正是 OpenCV 代码中所做的:

hsad[d] = hsad[d] + diff - cbuf_sub[d];
...
int currsad = sad[d] + hsad[d] - hsad_sub[d];

您对处理边界情况的 sad[] 初始化代码感到困惑:

    // initialize sums
    for( d = 0; d < ndisp; d++ )
        sad[d] = (int)(hsad0[d-ndisp*dy0]*(wsz2 + 2 - dy0));

这是第一个窗口的前半部分的初始化方式。这意味着第一行之前的行的 hsad 值与第一行的 hsad 值相同。在这段代码之后是初始化另一半窗口的代码,其中 hsad 值已经来自有效行。

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 2016-06-24
    • 2013-10-29
    • 2012-04-22
    • 2014-11-22
    • 2019-07-29
    • 2016-10-17
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多