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 + -
显示快捷键?