cvdistransform.cpp.svn-base

来自「非结构化路识别」· SVN-BASE 代码 · 共 1,028 行 · 第 1/3 页

SVN-BASE
1,028
字号
    int mask0, mask1, mask2;
    float scale;

    /* Test input data for validness */
    if( !pSrc || !pDst || !pMetrics )
        return CV_NULLPTR_ERR;
    if( roiSize.width < 0 || roiSize.height < 0 ||
        srcStep < roiSize.width || dstStep < roiSize.width * sizeof_float ||
        (dstStep & (sizeof_float - 1)) != 0 )
        return CV_BADSIZE_ERR;

    dstStep /= sizeof_float;

    mask0 = cvRound( pMetrics[0] * (1 << _CV_DIST_SHIFT) );
    mask1 = cvRound( pMetrics[1] * (1 << _CV_DIST_SHIFT) );
    mask2 = cvRound( pMetrics[2] * (1 << _CV_DIST_SHIFT) );
    scale = (float) (1. / (1 << _CV_DIST_SHIFT));

    init_distances_8uC1( pSrc, srcStep, (int *) pDst, dstStep, roiSize );

    if( w < 4 || h < 4 )
    {
        /*  ____________ Forward mask _______________ */

        for( ri = 0; ri < h; ri++ )
        {
            for( ci = 0; ci < w; ci++ )
            {
                length = 1;
                offset = ri * dstStep + ci;
                d = (int *) pDst + offset;
                buffer[0] = d[0];

                if( ri == 0 )
                {
                    if( ci == 1 )
                    {
                        _ADD_POINT( ri, ci - 1, mask0 );
                    }
                    else if( ci > 1 )
                    {
                        _ADD_POINT( ri, ci - 1, mask0 );
                        _ADD_POINT( ri, ci - 2, 2 * mask0 );
                    }
                }
                else if( ri == 1 )
                {
                    if( ci == 0 )
                    {
                        _ADD_POINT( ri - 1, ci, mask0 );
                    }
                    else if( ci == 1 )
                    {
                        _ADD_POINT( ri, ci - 1, mask0 );
                        _ADD_POINT( ri - 1, ci, mask0 );
                        _ADD_POINT( ri - 1, ci - 1, mask1 );
                    }
                    else
                    {
                        _ADD_POINT( ri, ci - 1, mask0 );
                        _ADD_POINT( ri, ci - 2, 2 * mask0 );
                        _ADD_POINT( ri - 1, ci, mask0 );
                        _ADD_POINT( ri - 1, ci - 1, mask1 );
                        _ADD_POINT( ri - 1, ci - 2, mask2 );
                    }

                    if( ci == w - 2 )
                    {
                        _ADD_POINT( ri - 1, ci + 1, mask1 );
                    }
                    else if( ci < w - 2 )
                    {
                        _ADD_POINT( ri - 1, ci + 1, mask1 );
                        _ADD_POINT( ri - 1, ci + 2, mask2 );
                    }
                }
                else
                {
                    if( ci == 0 )
                    {
                        _ADD_POINT( ri - 1, ci, mask0 );
                        _ADD_POINT( ri - 2, ci, 2 * mask0 );
                    }
                    else if( ci == 1 )
                    {
                        _ADD_POINT( ri, ci - 1, mask0 );
                        _ADD_POINT( ri - 1, ci, mask0 );
                        _ADD_POINT( ri - 1, ci - 1, mask1 );
                        _ADD_POINT( ri - 2, ci, 2 * mask0 );
                        _ADD_POINT( ri - 2, ci - 1, mask2 );
                    }
                    else
                    {
                        _ADD_POINT( ri, ci - 1, mask0 );
                        _ADD_POINT( ri, ci - 2, 2 * mask0 );
                        _ADD_POINT( ri - 1, ci, mask0 );
                        _ADD_POINT( ri - 1, ci - 1, mask1 );
                        _ADD_POINT( ri - 1, ci - 2, mask2 );
                        _ADD_POINT( ri - 2, ci, 2 * mask0 );
                        _ADD_POINT( ri - 2, ci - 1, mask2 );
                        _ADD_POINT( ri - 2, ci - 2, 2 * mask1 );
                    }

                    if( ci == w - 2 )
                    {
                        _ADD_POINT( ri - 1, ci + 1, mask1 );
                        _ADD_POINT( ri - 2, ci + 1, mask2 );
                    }
                    else if( ci < w - 2 )
                    {
                        _ADD_POINT( ri - 1, ci + 1, mask1 );
                        _ADD_POINT( ri - 1, ci + 2, mask2 );
                        _ADD_POINT( ri - 2, ci + 1, mask2 );
                        _ADD_POINT( ri - 2, ci + 2, 2 * mask1 );
                    }
                }

                d[0] = _MINn( buffer, length );
            }
        }

        /*  ____________ Backward mask _______________ */

        for( ri = h - 1; ri >= 0; ri-- )
        {
            for( ci = w - 1; ci >= 0; ci-- )
            {
                length = 1;
                offset = ri * dstStep + ci;
                d = (int *) pDst + offset;
                buffer[0] = d[0];

                if( ri == h - 1 )
                {
                    if( ci == w - 2 )
                    {
                        _ADD_POINT( ri, ci + 1, mask0 );
                    }
                    else if( ci < w - 2 )
                    {
                        _ADD_POINT( ri, ci + 1, mask0 );
                        _ADD_POINT( ri, ci + 2, 2 * mask0 );
                    }
                }
                else if( ri == h - 2 )
                {
                    if( ci == w - 1 )
                    {
                        _ADD_POINT( ri + 1, ci, mask0 );
                    }
                    else if( ci == w - 2 )
                    {
                        _ADD_POINT( ri, ci + 1, mask0 );
                        _ADD_POINT( ri + 1, ci, mask0 );
                        _ADD_POINT( ri + 1, ci + 1, mask1 );
                    }
                    else
                    {
                        _ADD_POINT( ri, ci + 1, mask0 );
                        _ADD_POINT( ri, ci + 2, 2 * mask0 );
                        _ADD_POINT( ri + 1, ci, mask0 );
                        _ADD_POINT( ri + 1, ci + 1, mask1 );
                        _ADD_POINT( ri + 1, ci + 2, mask2 );
                    }

                    if( ci == 1 )
                    {
                        _ADD_POINT( ri + 1, ci - 1, mask1 );
                    }
                    else if( ci > 1 )
                    {
                        _ADD_POINT( ri + 1, ci - 1, mask1 );
                        _ADD_POINT( ri + 1, ci - 2, mask2 );
                    }
                }
                else
                {
                    if( ci == w - 1 )
                    {
                        _ADD_POINT( ri + 1, ci, mask0 );
                        _ADD_POINT( ri + 2, ci, 2 * mask0 );
                    }
                    else if( ci == w - 2 )
                    {
                        _ADD_POINT( ri, ci + 1, mask0 );
                        _ADD_POINT( ri + 1, ci, mask0 );
                        _ADD_POINT( ri + 1, ci + 1, mask1 );
                        _ADD_POINT( ri + 2, ci, 2 * mask0 );
                        _ADD_POINT( ri + 2, ci + 1, mask2 );
                    }
                    else
                    {
                        _ADD_POINT( ri, ci + 1, mask0 );
                        _ADD_POINT( ri, ci + 2, 2 * mask0 );
                        _ADD_POINT( ri + 1, ci, mask0 );
                        _ADD_POINT( ri + 1, ci + 1, mask1 );
                        _ADD_POINT( ri + 1, ci + 2, mask2 );
                        _ADD_POINT( ri + 2, ci, 2 * mask0 );
                        _ADD_POINT( ri + 2, ci + 1, mask2 );
                        _ADD_POINT( ri + 2, ci + 2, 2 * mask1 );
                    }

                    if( ci == 1 )
                    {
                        _ADD_POINT( ri + 1, ci - 1, mask1 );
                        _ADD_POINT( ri + 2, ci - 1, mask2 );
                    }
                    else if( ci > 1 )
                    {
                        _ADD_POINT( ri + 1, ci - 1, mask1 );
                        _ADD_POINT( ri + 1, ci - 2, mask2 );
                        _ADD_POINT( ri + 2, ci - 1, mask2 );
                        _ADD_POINT( ri + 2, ci - 2, 2 * mask1 );
                    }
                }

                d[0] = _MINn( buffer, length );
            }
        }

        goto func_exit;
    }

/*  ____________ Forward mask _______________ */

    /* ri = 0, ci = 0: do nothing */

    /* ri = 0, ci = 1 */
    t1 = *(int *) &_POINT( 0, 1 );
    _F2I( t2, _POINT( 0, 0 ) + mask0 );
    CALC_MIN( t1, t2 );
    _I2F( _POINT( 0, 1 ), t1 );

    /* ri = 0, 1 < ci < w */
    for( ci = 2; ci < w; ci++ )
    {
        t1 = *(int *) &_POINT( 0, ci );
        _F2I( t2, _POINT( 0, ci - 1 ) + mask0 );
        CALC_MIN( t1, t2 );
        _I2F( _POINT( 0, ci ), t1 );
    }

    /* ri = 1, ci = 0 */
    t1 = *(int *) &_POINT( 1, 0 );
    _F2I( t2, _POINT( 0, 0 ) + mask0 );
    CALC_MIN(t1, t2);
	_F2I( t2, _POINT( 0, 1 ) + mask1 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, 2 ) + mask2 );
    CALC_MIN( t1, t2 );
    _I2F( _POINT( 1, 0 ), t1 );

    /* ri = 1, ci = 1 */
    t1 = *(int *) &_POINT( 1, 1 );
    _F2I( t2, _POINT( 0, 1 ) + mask0 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, 2 ) + mask1 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, 3 ) + mask2 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, 0 ) + mask1 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 1, 0 ) + mask0 );
    CALC_MIN( t1, t2 );
    _I2F( _POINT( 1, 1 ), t1 );


    /* ri = 1, 1 < ci < w - 2 */
    for( ci = 2; ci < w - 2; ci++ )
    {
        t1 = *(int *) &_POINT( 1, ci );
        _F2I( t2, _POINT( 0, ci ) + mask0 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( 0, ci + 1 ) + mask1 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( 0, ci + 2 ) + mask2 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( 0, ci - 1 ) + mask1 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( 1, ci - 1 ) + mask0 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( 0, ci - 2 ) + mask2 );
        CALC_MIN( t1, t2 );
        _I2F( _POINT( 1, ci ), t1 );
    }

    /* ri = 1, ci = w - 2 */
    t1 = *(int *) &_POINT( 1, w - 2 );
    _F2I( t2, _POINT( 0, w - 2 ) + mask0 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, w - 1 ) + mask1 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, w - 3 ) + mask1 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 1, w - 3 ) + mask0 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, w - 4 ) + mask2 );
    CALC_MIN( t1, t2 );
    _I2F( _POINT( 1, w - 2 ), t1 );

    /* ri = 1, ci = w - 1 */
    t1 = *(int *) &_POINT( 1, w - 1 );
    _F2I( t2, _POINT( 0, w - 1 ) + mask0 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, w - 2 ) + mask1 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 1, w - 2 ) + mask0 );
    CALC_MIN( t1, t2 );
    _F2I( t2, _POINT( 0, w - 3 ) + mask2 );
    CALC_MIN( t1, t2 );
    _I2F( _POINT( 1, w - 1 ), t1 )
        /* 1 < ri < h */
        for( ri = 2; ri < h; ri++ )
    {
        /* ci = 0 */
        t1 = *(int *) &_POINT( ri, 0 );
        _F2I( t2, _POINT( ri - 1, 0 ) + mask0 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri - 1, 1 ) + mask1 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri - 1, 2 ) + mask2 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri - 2, 1 ) + mask2 );
        CALC_MIN( t1, t2 );
        _I2F( _POINT( ri, 0 ), t1 );

        /* ci = 1 */
        t1 = *(int *) &_POINT( ri, 1 );
        _F2I( t2, _POINT( ri - 1, 1 ) + mask0 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri - 1, 2 ) + mask1 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri - 1, 3 ) + mask2 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri - 2, 2 ) + mask2 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri, 0 ) + mask0 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri - 1, 0 ) + mask1 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri - 2, 0 ) + mask2 );
        CALC_MIN( t1, t2 );
        _I2F( _POINT( ri, 1 ), t1 );

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?