cvarithm.cpp.svn-base

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

SVN-BASE
1,439
字号
                                                                                \
            t0 = __op__( (dst)[k], t0 );                                        \
            t1 = __op__( (dst)[k+(cn)], t1 );                                   \
                                                                                \
            (dst)[k] = cast_macro( t0 );                                        \
            (dst)[k+(cn)] = cast_macro( t1 );                                   \
                                                                                \
            t0 = _process_mask_((mask)[i+2]);                                   \
            t1 = _process_mask_((mask)[i+3]);                                   \
                                                                                \
            t0 = _mask_op_( t0, (src)[k+2*(cn)]);                               \
            t1 = _mask_op_( t1, (src)[k+3*(cn)]);                               \
                                                                                \
            t0 = __op__( (dst)[k+2*(cn)], t0 );                                 \
            t1 = __op__( (dst)[k+3*(cn)], t1 );                                 \
                                                                                \
            (dst)[k+2*(cn)] = cast_macro( t0 );                                 \
            (dst)[k+3*(cn)] = cast_macro( t1 );                                 \
        }                                                                       \
        while( k-- && (m || (m = (mask[i]|mask[i+1]|mask[i+2]|mask[i+3])) != 0));\
    }                                                                           \
                                                                                \
    for( ; i < (len); i++, src += cn, dst += cn )                               \
    {                                                                           \
        int k = cn - 1;                                                         \
        do                                                                      \
        {                                                                       \
            worktype t = _process_mask_((mask)[i]);                             \
            t = _mask_op_( t, (src)[k] );                                       \
            t = __op__( (dst)[k], t );                                          \
            (dst)[k] = cast_macro( t );                                         \
        }                                                                       \
        while( k-- && mask[i] != 0 );                                           \
    }                                                                           \
}


// dst = src - dst
#define ICV_DEF_BIN_ARI_OP_REV_MASK( __op__, _mask_op_, _process_mask_,         \
                                 cast_macro,worktype,                           \
                                 src, dst, mask, len, cn )                      \
{                                                                               \
    int i;                                                                      \
    for( i = 0; i <= (len) - 4; i += 4, src += 4*cn, dst += 4*cn )              \
    {                                                                           \
        int k = cn - 1;                                                         \
        int m = 0;                                                              \
                                                                                \
        do                                                                      \
        {                                                                       \
            worktype t0 = _process_mask_( (mask)[i] );                          \
            worktype t1 = _process_mask_( (mask)[i+1] );                        \
            worktype t2 = (dst)[k];                                             \
            worktype t3 = (dst)[k+(cn)];                                        \
                                                                                \
            t2 += _mask_op_( t0, (src)[k] - t2 - t2 );                          \
            t3 += _mask_op_( t1, (src)[k+(cn)] - t3 - t3 );                     \
                                                                                \
            (dst)[k] = cast_macro(t2);                                          \
            (dst)[k+(cn)] = cast_macro(t3);                                     \
                                                                                \
            t0 = _process_mask_( (mask)[i+2] );                                 \
            t1 = _process_mask_( (mask)[i+3] );                                 \
            t2 = (dst)[k+(cn)*2];                                               \
            t3 = (dst)[k+(cn)*3];                                               \
                                                                                \
            t2 += _mask_op_( t0, (src)[k+(cn)*2] - t2 - t2 );                   \
            t3 += _mask_op_( t1, (src)[k+(cn)*3] - t3 - t3 );                   \
                                                                                \
            (dst)[k+(cn)*2] = cast_macro(t2);                                   \
            (dst)[k+(cn)*3] = cast_macro(t3);                                   \
        }                                                                       \
        while( k-- && (m || (m = (mask[i]|mask[i+1]|mask[i+2]|mask[i+3])) != 0));\
    }                                                                           \
                                                                                \
    for( ; i < (len); i++, src += cn, dst += cn )                               \
    {                                                                           \
        int k = cn - 1;                                                         \
        do                                                                      \
        {                                                                       \
            worktype t0 = _process_mask_( (mask)[i] );                          \
            worktype t1 = (dst)[k];                                             \
                                                                                \
            t1 += _mask_op_( t0, (src)[k] - t1 - t1 );                          \
            (dst)[k] = cast_macro(t1);                                          \
        }                                                                       \
        while( k-- && mask[i] != 0 );                                           \
    }                                                                           \
}


#define ICV_DEF_BIN_ARI_OP_MASK_2D( __op__, name, _mask_op_, _process_mask_,\
                              entry, arrtype, worktype, cast_macro, flag )  \
                                                                            \
IPCVAPI_IMPL( CvStatus,                                                     \
name,( const arrtype* src, int srcstep, const uchar* mask, int maskstep,    \
       arrtype* dst, int dststep, CvSize size, int cn ))                    \
{                                                                           \
    entry;                                                                  \
                                                                            \
    for( ; size.height--; (char*&)src += srcstep,                           \
                          (char*&)dst += dststep,                           \
                          mask += maskstep )                                \
    {                                                                       \
        const arrtype* tsrc = src;                                          \
        arrtype* tdst = dst;                                                \
                                                                            \
        ICV_DEF_BIN_ARI_OP_##flag( __op__, _mask_op_, _process_mask_,       \
                 cast_macro, worktype, tsrc, tdst, mask, size.width, cn );  \
    }                                                                       \
                                                                            \
    return CV_OK;                                                           \
}


/////////////////////////// Unary operations ////////////////////////////////


#define ICV_DEF_UN_ARI_OP_MASK( __op__, _mask_op_, _process_mask_,              \
                                cast_macro, worktype,                           \
                                dst, mask, len, cn )                            \
{                                                                               \
    int i;                                                                      \
    for( i = 0; i <= (len) - 4; i += 4, dst += 4*(cn) )                         \
    {                                                                           \
        int k = cn - 1;                                                         \
        int m = 0;                                                              \
                                                                                \
        do                                                                      \
        {                                                                       \
            worktype value = scalar[k];                                         \
            worktype t0 = _process_mask_((mask)[i]);                            \
            worktype t1 = _process_mask_((mask)[i+1]);                          \
                                                                                \
            t0 = _mask_op_( t0, value );                                        \
            t1 = _mask_op_( t1, value );                                        \
                                                                                \
            t0 = __op__( (dst)[k], t0 );                                        \
            t1 = __op__( (dst)[k+(cn)], t1 );                                   \
                                                                                \
            (dst)[k] = cast_macro( t0 );                                        \
            (dst)[k+(cn)] = cast_macro( t1 );                                   \
                                                                                \
            t0 = _process_mask_((mask)[i+2]);                                   \
            t1 = _process_mask_((mask)[i+3]);                                   \
                                                                                \
            t0 = _mask_op_( t0, value );                                        \
            t1 = _mask_op_( t1, value );                                        \
                                                                                \
            t0 = __op__( (dst)[k+2*(cn)], t0 );                                 \
            t1 = __op__( (dst)[k+3*(cn)], t1 );                                 \
                                                                                \
            (dst)[k+2*(cn)] = cast_macro( t0 );                                 \
            (dst)[k+3*(cn)] = cast_macro( t1 );                                 \
        }                                                                       \
        while( k-- && (m || (m = (mask[i]|mask[i+1]|mask[i+2]|mask[i+3])) != 0));\
    }                                                                           \
                                                                                \
    for( ; i < (len); i++, dst += cn )                                          \
    {                                                                           \
        int k = cn - 1;                                                         \
        do                                                                      \
        {                                                                       \
            worktype t = _process_mask_((mask)[i]);                             \
            t = _mask_op_( t, scalar[k] );                                      \
            t = __op__( (dst)[k], t );                                          \
            (dst)[k] = cast_macro( t );                                         \
        }                                                                       \
        while( k-- && mask[i] != 0 );                                           \
    }                                                                           \
}


// dst = src - dst
#define ICV_DEF_UN_ARI_OP_REV_MASK( __op__, _mask_op_, _process_mask_,          \
                                    cast_macro,worktype,                        \
                                    dst, mask, len, cn )                        \
{                                                                               \
    int i;                                                                      \
    for( i = 0; i <= (len) - 4; i += 4, dst += 4*cn )                           \
    {                                                                           \
        int k = cn - 1;                                                         \
        int m = 0;                                                              \
                                                                                \
        do                                                                      \
        {                                                                       \
            worktype value = scalar[k];                                         \
            worktype t0 = _process_mask_( (mask)[i] );                          \
            worktype t1 = _process_mask_( (mask)[i+1] );                        \
            worktype t2 = (dst)[k];                                             \
            worktype t3 = (dst)[k+(cn)];                                        \
                                                                                \
            t2 += _mask_op_( t0, value - t2 - t2 );                             \
            t3 += _mask_op_( t1, value - t3 - t3 );                             \
                                                                                \
            (dst)[k] = cast_macro(t2);                                          \
            (dst)[k+(cn)] = cast_macro(t3);                                     \
                                                                                \
            t0 = _process_mask_( (mask)[i+2] );                                 \
            t1 = _process_mask_( (mask)[i+3] );                                 \
            t2 = (dst)[k+(cn)*2];                                               \
            t3 = (dst)[k+(cn)*3];                                               \
                                                                                \
            t2 += _mask_op_( t0, value - t2 - t2 );                             \
            t3 += _mask_op_( t1, value - t3 - t3 );                             \
                                                                                \
            (dst)[k+(cn)*2] = cast_macro(t2);                                   \
            (dst)[k+(cn)*3] = cast_macro(t3);                                   \
        }                                                                       \
        while( k-- && (m || (m = (mask[i]|mask[i+1]|mask[i+2]|mask[i+3])) != 0));\
    }                                                                           \
                                                                                \
    for( ; i < (len); i++, dst += cn )                                          \
    {                                                                           \
        int k = cn - 1;                                                         \
        do                                                                      \
        {                                                                       \
            worktype t0 = _process_mask_( (mask)[i] );                          \
            worktype t1 = (dst)[k];                                             \
                                                                                \
            t1 += _mask_op_( t0, scalar[k] - t1 - t1 );                         \
            (dst)[k] = cast_macro(t1);                                          \
        }                                                                       \
        while( k-- && mask[i] != 0 );                                           \
    }                                                                           \
}

#define ICV_DEF_UN_ARI_OP_MASK_2D( __op__, name, _mask_op_, _process_mask_, \
                                entry, arrtype, worktype, cast_macro, flag )\
                                                                            \
IPCVAPI_IMPL( CvStatus,                                                     \
name, ( arrtype* dst, int dststep, const uchar* mask, int maskstep,         \
        CvSize size, const worktype* scalar, int cn ))                      \
{                                                                           \
    entry;                                                                  \
                                                                            \
    for( ; size.height--; (char*&)dst += dststep,                           \
                          mask += maskstep )                                \
    {                                                                       \
        arrtype* tdst = dst;                                                \
                                                                            \
        ICV_DEF_UN_ARI_OP_##flag( __op__, _mask_op_, _process_mask_,        \
                       cast_macro, worktype, tdst, mask, size.width, cn );  \
    }                                                                       \
                                                                            \
    return CV_OK;                                                           \
}


#define  ICV_STUB_ENTRY      dst = dst
#define  ICV_BIN_ENTRY_FLT   CV_DEFINE_MASK


#define ICV_DEF_ALL_BIN_MASK( __op__, name, flag )                                  \
ICV_DEF_BIN_ARI_OP_MASK_2D( __op__, icv##name##_8u_CnMR, CV_AND, ICV_INT_MASK,      \
                            ICV_STUB_ENTRY, uchar, int, CV_FAST_CAST_8U, flag )     \
ICV_DEF_BIN_ARI_OP_MASK_2D( __op__, icv##name##_16s_CnMR, CV_AND, ICV_INT_MASK,     \
                            ICV_STUB_ENTRY, short, int, CV_CAST_16S, flag )         \
ICV_DEF_BIN_ARI_OP_MASK_2D( __op__, icv##name##_32s_CnMR, CV_AND, ICV_INT_MASK,     \
                            ICV_STUB_ENTRY, int, int, CV_CAST_32S, flag )           \
ICV_DEF_BIN_ARI_OP_MASK_2D( __op__, icv##name##_32f_CnMR, CV_MUL, ICV_FLT_MASK,     \
                            ICV_BIN_ENTRY_FLT, float, float, CV_CAST_32F, flag )    \
ICV_DEF_BIN_ARI_OP_MASK_2D( __op__, icv##name##_64f_CnMR, CV_MUL, ICV_FLT_MASK,     \
                            ICV_BIN_ENTRY_FLT, double, double, CV_CAST_64F, flag )

#define ICV_DEF_ALL_UN_MASK( __op__, name, flag )                                   \
ICV_DEF_UN_ARI_OP_MASK_2D( __op__, icv##name##_8u_CnMR, CV_AND, ICV_INT_MASK,       \
                            ICV_STUB_ENTRY, uchar, int, CV_CAST_8U, flag )          \
ICV_DEF_UN_ARI_OP_MASK_2D( __op__, icv##name##_16s_CnMR, CV_AND, ICV_INT_MASK,      \
                            ICV_STUB_ENTRY, short, int, CV_CAST_16S, flag )         \
ICV_DEF_UN_ARI_OP_MASK_2D( __op__, icv##name##_32s_CnMR, CV_AND, ICV_INT_MASK,      \
                            ICV_STUB_ENTRY, int, int, CV_CAST_32S, flag )           \
ICV_DEF_UN_ARI_OP_MASK_2D( __op__, icv##name##_32f_CnMR, CV_MUL, ICV_FLT_MASK,      \
                            CV_DEFINE_MASK, float, float, CV_CAST_32F, flag )       \
ICV_DEF_UN_ARI_OP_MASK_2D( __op__, icv##name##_64f_CnMR, CV_MUL, ICV_FLT_MASK,      \
                            CV_DEFINE_MASK, double, double, CV_CAST_64F, flag )


ICV_DEF_ALL_BIN_MASK( CV_ADD, Add, MASK )
ICV_DEF_ALL_BIN_MASK( CV_SUB, Sub, MASK )
ICV_DEF_ALL_BIN_MASK( CV_SUB, SubR, REV_MASK )

ICV_DEF_ALL_UN_MASK( CV_ADD, AddC, MASK )
ICV_DEF_ALL_UN_MASK( CV_SUB, SubRC, REV_MASK )


#define ICV_DEF_INIT_ARITHM_MASK_FUNC_TAB( FUNCNAME, FLAG )     \
static  void  icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab )\

⌨️ 快捷键说明

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