cvnorm.cpp.svn-base

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

SVN-BASE
943
字号
                                                                    \
    return CV_OK;                                                   \
}


#define  ICV_DEF_NORM_MASK_FUNC_2D_COI( _mask_op_, _op_, _update_op_,\
                                        _entry_, _case_, _exit_,    \
                                        name, srctype, normtype,    \
                                        temptype )                  \
IPCVAPI_IMPL( CvStatus, name, ( const srctype* src, int step,       \
                       const uchar* mask, int maskStep,             \
                       CvSize size, int cn, int coi, double* _norm))\
{                                                                   \
    _entry_( normtype );                                            \
                                                                    \
    src += coi - 1;                                                 \
    for( ; size.height--; (char*&)src += step, mask += maskStep )   \
    {                                                               \
        _case_( _mask_op_, _op_, _update_op_,                       \
                temptype, size.width, cn );                         \
    }                                                               \
                                                                    \
    _exit_(1);                                                      \
                                                                    \
    return CV_OK;                                                   \
}



#define  ICV_DEF_NORM_DIFF_MASK_FUNC_2D( _mask_op_, _op_, _diff_op_, _update_op_,   \
                                         _entry_, _case_, _exit_, name,             \
                                         srctype, normtype, temptype )              \
IPCVAPI_IMPL( CvStatus, name, ( const srctype* src1, int step1,                     \
                       const srctype* src2, int step2,                              \
                       const uchar* mask, int maskStep,                             \
                       CvSize size, double* _norm ))                                \
{                                                                                   \
    _entry_( normtype );                                                            \
                                                                                    \
    for( ; size.height--; (char*&)src1 += step1, (char*&)src2 += step2, mask += maskStep )\
    {                                                                               \
        _case_( _mask_op_, _op_, _diff_op_, _update_op_, temptype, size.width, 1 ); \
    }                                                                               \
                                                                                    \
    _exit_(1);                                                                      \
                                                                                    \
    return CV_OK;                                                                   \
}


#define  ICV_DEF_NORM_DIFF_MASK_FUNC_2D_COI(_mask_op_, _op_, _diff_op_, _update_op_,\
                                            _entry_, _case_, _exit_, name,          \
                                             srctype, normtype, temptype )          \
IPCVAPI_IMPL( CvStatus,  name, ( const srctype* src1, int step1,                    \
                                 const srctype* src2, int step2,                    \
                                 const uchar* mask, int maskStep,                   \
                                 CvSize size, int cn, int coi, double* _norm ))     \
{                                                                                   \
    _entry_( normtype );                                                            \
                                                                                    \
    src1 += coi - 1;                                                                \
    src2 += coi - 1;                                                                \
    for( ; size.height--; (char*&)src1 += step1, (char*&)src2 += step2, mask += maskStep )\
    {                                                                               \
        _case_( _mask_op_, _op_, _diff_op_, _update_op_, temptype, size.width, cn );\
    }                                                                               \
                                                                                    \
    _exit_(1);                                                                      \
                                                                                    \
    return CV_OK;                                                                   \
}


#define ICV_DEF_NORM_MASK_FUNC_ALL( _mask_op_, _abs_macro_, _abs_diff_macro_, _entry_,      \
                                    flavor, srctype, c_normtype, l_normtype, temptype )     \
                                                                                            \
ICV_DEF_NORM_MASK_FUNC_2D( _mask_op_, _abs_macro_, MAX,                                     \
                      _entry_, ICV_DEF_NORM_MASK_CASE, CV_NORM_EXIT,                        \
                      icvNorm_Inf_##flavor##_C1MR, srctype, c_normtype, temptype )          \
ICV_DEF_NORM_MASK_FUNC_2D( _mask_op_, _abs_macro_, CV_ADD,                                  \
                      _entry_, ICV_DEF_NORM_MASK_CASE, CV_NORM_EXIT,                        \
                      icvNorm_L1_##flavor##_C1MR, srctype, l_normtype, temptype )           \
ICV_DEF_NORM_MASK_FUNC_2D( _mask_op_, CV_SQR, CV_ADD,                                       \
                      _entry_, ICV_DEF_NORM_MASK_CASE, CV_NORM_L2_EXIT,                     \
                      icvNorm_L2_##flavor##_C1MR, srctype, l_normtype, temptype )           \
                                                                                            \
ICV_DEF_NORM_DIFF_MASK_FUNC_2D( _mask_op_, _abs_macro_, _abs_diff_macro_, MAX,              \
                        _entry_, ICV_DEF_NORM_DIFF_MASK_CASE, CV_NORM_EXIT,                 \
                        icvNormDiff_Inf_##flavor##_C1MR, srctype, c_normtype, temptype )    \
ICV_DEF_NORM_DIFF_MASK_FUNC_2D( _mask_op_, _abs_macro_, _abs_diff_macro_, CV_ADD,           \
                        _entry_, ICV_DEF_NORM_DIFF_MASK_CASE, CV_NORM_EXIT,                 \
                        icvNormDiff_L1_##flavor##_C1MR, srctype, l_normtype, temptype )     \
ICV_DEF_NORM_DIFF_MASK_FUNC_2D( _mask_op_, CV_SQR, CV_SQR, CV_ADD,                          \
                          _entry_, ICV_DEF_NORM_DIFF_MASK_CASE, CV_NORM_L2_EXIT,            \
                          icvNormDiff_L2_##flavor##_C1MR, srctype, l_normtype, temptype)    \
                                                                                            \
ICV_DEF_NORM_MASK_FUNC_2D_COI( _mask_op_, _abs_macro_, MAX,                                 \
                         _entry_, ICV_DEF_NORM_MASK_CASE, CV_NORM_EXIT,                     \
                         icvNorm_Inf_##flavor##_CnCMR, srctype, c_normtype, temptype )      \
ICV_DEF_NORM_MASK_FUNC_2D_COI( _mask_op_, _abs_macro_, CV_ADD,                              \
                          _entry_, ICV_DEF_NORM_MASK_CASE, CV_NORM_EXIT,                    \
                          icvNorm_L1_##flavor##_CnCMR, srctype, l_normtype, temptype )      \
ICV_DEF_NORM_MASK_FUNC_2D_COI( _mask_op_, CV_SQR, CV_ADD,                                   \
                          _entry_, ICV_DEF_NORM_MASK_CASE, CV_NORM_L2_EXIT,                 \
                          icvNorm_L2_##flavor##_CnCMR, srctype, l_normtype, temptype )      \
                                                                                            \
ICV_DEF_NORM_DIFF_MASK_FUNC_2D_COI( _mask_op_, _abs_macro_, _abs_diff_macro_, MAX,          \
                          _entry_, ICV_DEF_NORM_DIFF_MASK_CASE, CV_NORM_EXIT,               \
                          icvNormDiff_Inf_##flavor##_CnCMR, srctype, c_normtype, temptype ) \
ICV_DEF_NORM_DIFF_MASK_FUNC_2D_COI( _mask_op_, _abs_macro_, _abs_diff_macro_, CV_ADD,       \
                          _entry_, ICV_DEF_NORM_DIFF_MASK_CASE, CV_NORM_EXIT,               \
                          icvNormDiff_L1_##flavor##_CnCMR,                                  \
                          srctype, l_normtype, temptype )                                   \
ICV_DEF_NORM_DIFF_MASK_FUNC_2D_COI( _mask_op_, CV_SQR, CV_SQR, CV_ADD,                      \
                          _entry_, ICV_DEF_NORM_DIFF_MASK_CASE, CV_NORM_L2_EXIT,            \
                          icvNormDiff_L2_##flavor##_CnCMR,                                  \
                          srctype, l_normtype, temptype )


ICV_DEF_NORM_MASK_FUNC_ALL( CV_ANDMASK, CV_NOP, CV_IABS, CV_NORM_ENTRY,
                            8u, uchar, int, int64, int )
ICV_DEF_NORM_MASK_FUNC_ALL( CV_ANDMASK, CV_IABS, CV_IABS, CV_NORM_ENTRY,
                            8s, char, int, int64, int )
ICV_DEF_NORM_MASK_FUNC_ALL( CV_ANDMASK, CV_IABS, CV_IABS, CV_NORM_ENTRY,
                            16s, short, int, int64, int )
ICV_DEF_NORM_MASK_FUNC_ALL( CV_MULMASK, fabs, fabs, CV_NORM_MASK_ENTRY_FLT,
                            32s, int, double, double, double )
ICV_DEF_NORM_MASK_FUNC_ALL( CV_MULMASK, fabs, fabs, CV_NORM_MASK_ENTRY_FLT,
                            32f, float, double, double, double )
ICV_DEF_NORM_MASK_FUNC_ALL( CV_MULMASK, fabs, fabs, CV_NORM_MASK_ENTRY_FLT,
                            64f, double, double, double, double )


ICV_DEF_INIT_NORM_TAB_2D( Norm_Inf, C1MR )
ICV_DEF_INIT_NORM_TAB_2D( Norm_L1, C1MR )
ICV_DEF_INIT_NORM_TAB_2D( Norm_L2, C1MR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_Inf, C1MR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_L1, C1MR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_L2, C1MR )

ICV_DEF_INIT_NORM_TAB_2D( Norm_Inf, CnCMR )
ICV_DEF_INIT_NORM_TAB_2D( Norm_L1, CnCMR )
ICV_DEF_INIT_NORM_TAB_2D( Norm_L2, CnCMR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_Inf, CnCMR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_L1, CnCMR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_L2, CnCMR )


CV_IMPL  double
cvNorm( const void* imgA, const void* imgB, int normType, const void* mask )
{
    static  CvFuncTable norm_tab[12];
    static  CvFuncTable normmask_tab[12];
    static  int inittab = 0;

    double  norm = 0, norm_diff = 0;

    CV_FUNCNAME("cvNorm");

    __BEGIN__;

    int type, depth, cn;
    int is_nd = 0;
    int coi = 0, coi2 = 0;
    int is_relative;
    CvSize size;
    CvMat stub1, *mat1 = (CvMat*)imgB;
    CvMat stub2, *mat2 = (CvMat*)imgA;
    int mat2_flag = CV_MAT_CONT_FLAG;
    int mat1_step, mat2_step, mask_step = 0;

    if( !inittab )
    {
        icvInitNorm_InfC1RTable( &norm_tab[0] );
        icvInitNorm_L1C1RTable( &norm_tab[1] );
        icvInitNorm_L2C1RTable( &norm_tab[2] );
        icvInitNormDiff_InfC1RTable( &norm_tab[3] );
        icvInitNormDiff_L1C1RTable( &norm_tab[4] );
        icvInitNormDiff_L2C1RTable( &norm_tab[5] );

        icvInitNorm_InfCnCRTable( &norm_tab[6] );
        icvInitNorm_L1CnCRTable( &norm_tab[7] );
        icvInitNorm_L2CnCRTable( &norm_tab[8] );
        icvInitNormDiff_InfCnCRTable( &norm_tab[9] );
        icvInitNormDiff_L1CnCRTable( &norm_tab[10] );
        icvInitNormDiff_L2CnCRTable( &norm_tab[11] );

        icvInitNorm_InfC1MRTable( &normmask_tab[0] );
        icvInitNorm_L1C1MRTable( &normmask_tab[1] );
        icvInitNorm_L2C1MRTable( &normmask_tab[2] );
        icvInitNormDiff_InfC1MRTable( &normmask_tab[3] );
        icvInitNormDiff_L1C1MRTable( &normmask_tab[4] );
        icvInitNormDiff_L2C1MRTable( &normmask_tab[5] );

        icvInitNorm_InfCnCMRTable( &normmask_tab[6] );
        icvInitNorm_L1CnCMRTable( &normmask_tab[7] );
        icvInitNorm_L2CnCMRTable( &normmask_tab[8] );
        icvInitNormDiff_InfCnCMRTable( &normmask_tab[9] );
        icvInitNormDiff_L1CnCMRTable( &normmask_tab[10] );
        icvInitNormDiff_L2CnCMRTable( &normmask_tab[11] );

        inittab = 1;
    }
    
    if( !mat1 )
    {
        mat1 = mat2;
        mat2 = 0;
    }

    is_relative = mat2 && (normType & CV_RELATIVE);
    normType &= ~CV_RELATIVE;

    switch( normType )
    {
    case CV_C:
    case CV_L1:
    case CV_L2:
    case CV_DIFF_C:
    case CV_DIFF_L1:
    case CV_DIFF_L2:
        normType = (normType & 7) >> 1;
        break;
    default:
        CV_ERROR( CV_StsBadFlag, "" );
    }

    if( !CV_IS_MAT(mat1))
    {
        if( CV_IS_MATND(mat1) )
            is_nd = 1;
        else
            CV_CALL( mat1 = cvGetMat( mat1, &stub1, &coi ));
    }
    
    if( mat2 )

⌨️ 快捷键说明

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