Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

SGBM pixAdd pixSub

I'm trying to port SGBM to the GPU using this library.

The results are very good but not as sharp as OpenCV's StereoBinarySGBM from the contrib repository (using CV_CS_CENSUS descriptor)

I've looked through the code and noticed that in the main function computeDisparityBinarySGBM in the part of computing the cost for each pixel, the cost is not simply popcount(left^right) (the result of the previous function hammingDistanceBlockMatching) but the cost contains a bit more elaborate formulas, depending on the pixel. For example,

if (y > 0)
{
    const CostType* hsumSub = hsumBuf + ((std::max)(y - SH2 - 1, 0) % hsumBufNRows)*costBufSize;
    const CostType* Cprev = !fullDP || y == 0 ? C : C - costBufSize;

    for (x = D; x < width1*D; x += D)
    {
        const CostType* pixAdd = pixDiff + (std::min)(x + SW2*D, (width1 - 1)*D);
        const CostType* pixSub = pixDiff + (std::max)(x - (SW2 + 1)*D, 0);

        for (d = 0; d < D; d++)
        {
            int hv = hsumAdd[x + d] = (CostType)(hsumAdd[x - D + d] + pixAdd[d] - pixSub[d]);
            C[x + d] = (CostType)(Cprev[x + d] + hv - hsumSub[x + d]);
        }
    }
}

(SIMD part omitted for brevity)

Where C[x + d] is the final cost which will be used in the dynamic programming part of the SGM algorithm.

I couldn't find any explanation to these addition and subtraction and was wondering if someone could provide an explanation or a reference for it

Thanks