cvdistransform.cpp.svn-base

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

SVN-BASE
1,028
字号


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


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


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


/*  ____________ Backward mask _______________ */

    /* ri = h - 1, ci = w - 1: do nothing */

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

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


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

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

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

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

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


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

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

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

        /* ci = 1 */
        t1 = *(int *) &_POINT( ri, 1 );
        _F2I( t2, _POINT( ri, 2 ) + mask0 );
        CALC_MIN( t1, t2 );
        _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 + 1, 0 ) + mask1 );
        CALC_MIN( t1, t2 );
        _F2I( t2, _POINT( ri + 2, 0 ) + mask2 );
        CALC_MIN( t1, t2 );
        _I2F( _POINT( ri, 1 ), t1 );

        /* ci = 0 */
        t1 = *(int *) &_POINT( ri, 0 );
        _F2I( t2, _POINT( ri, 1 ) + mask0 );
        CALC_MIN( t1, t2 );
        _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 );
    }

  func_exit:

    icvCvtIntTofloat( (int *) pDst, dstStep, roiSize, scale );
    return CV_OK;
}


IPCVAPI_IMPL( CvStatus, icvGetDistanceTransformMask, (int maskType, float *pMetrics) )
{
    if( !pMetrics )
        return CV_NULLPTR_ERR;

    switch (maskType)
    {
    case 30:
        pMetrics[0] = 1.0f;
        pMetrics[1] = 1.0f;
        break;

    case 31:
        pMetrics[0] = 1.0f;
        pMetrics[1] = 2.0f;
        break;

    case 32:
        pMetrics[0] = 0.955f;
        pMetrics[1] = 1.3693f;
        break;

    case 52:
        pMetrics[0] = 1.0f;
        pMetrics[1] = 1.4f;
        pMetrics[2] = 2.1969f;
        break;
    default:
        return CV_BADRANGE_ERR;
    }
    return CV_OK;
}


/* Wrapper function for distance transform group */
CV_IMPL void
cvDistTransform( const void* srcarr, void* dstarr,
                 CvDisType distType, int maskSize,
                 const float *mask )
{
    CV_FUNCNAME( "cvDistTransform" );

    __BEGIN__;

    float _mask[5];
    CvMat srcstub, *src = (CvMat*)srcarr;
    CvMat dststub, *dst = (CvMat*)dstarr;

    CV_CALL( src = cvGetMat( src, &srcstub ));
    CV_CALL( dst = cvGetMat( dst, &dststub ));

    if( !CV_IS_MASK_ARR( src ) || CV_MAT_TYPE( dst->type ) != CV_32FC1 )
        CV_ERROR( CV_StsUnsupportedFormat, "" );

    if( !CV_ARE_SIZES_EQ( src, dst ))
        CV_ERROR( CV_StsUnmatchedSizes, "" );

    if( maskSize != CV_DIST_MASK_3 && maskSize != CV_DIST_MASK_5 )
        CV_ERROR( CV_StsBadSize, "" );

    if( distType == CV_DIST_C || distType == CV_DIST_L1 )
        maskSize = CV_DIST_MASK_3;

    if( distType == CV_DIST_C || distType == CV_DIST_L1 || distType == CV_DIST_L2 )
    {
        IPPI_CALL( icvGetDistanceTransformMask( distType == CV_DIST_C ? 30 :
                                                distType == CV_DIST_L1 ? 31 :
                                                maskSize*10 + 2, _mask ));
    }
    else if( distType == CV_DIST_USER )
    {
        if( !mask )
            CV_ERROR( CV_StsNullPtr, "" );

        memcpy( _mask, mask, (maskSize/2 + 1)*sizeof(float));
    }

    if( maskSize == CV_DIST_MASK_3 )
    {
        IPPI_CALL( icvDistanceTransform_3x3_8u32f_C1R
                   ( src->data.ptr, src->step,
                     dst->data.fl, dst->step,
                     icvGetMatSize(src), _mask ));
    }
    else
    {
        IPPI_CALL( icvDistanceTransform_5x5_8u32f_C1R
                   ( src->data.ptr, src->step,
                     dst->data.fl, dst->step,
                     icvGetMatSize(src), _mask ));
    }

    __END__;
}

⌨️ 快捷键说明

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