cvnorm.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 943 行 · 第 1/4 页
SVN-BASE
943 行
{ \
_entry_( normtype ); \
\
src += coi - 1; \
for( ; size.height--; (char*&)src += step ) \
{ \
_case_( _op_, _update_op_, temptype, size.width, cn ); \
} \
\
_exit_(1); \
\
return CV_OK; \
}
#define ICV_DEF_NORM_DIFF_FUNC_2D( _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, \
CvSize size, double* _norm )) \
{ \
_entry_( normtype ); \
\
for( ; size.height--; (char*&)src1 += step1, \
(char*&)src2 += step2 ) \
{ \
_case_( _op_, _diff_op_, _update_op_, temptype, size.width, 1 );\
} \
\
_exit_(1); \
\
return CV_OK; \
}
#define ICV_DEF_NORM_DIFF_FUNC_2D_COI( _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, \
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 ) \
{ \
_case_( _op_, _diff_op_, _update_op_, temptype, size.width, cn );\
} \
\
_exit_(1); \
\
return CV_OK; \
}
#define ICV_DEF_NORM_FUNC_ALL( _abs_macro_, _abs_diff_macro_, flavor, srctype, \
c_normtype, l_normtype, temptype ) \
\
ICV_DEF_NORM_FUNC_2D( _abs_macro_, MAX, \
CV_NORM_ENTRY, ICV_DEF_NORM_CASE, CV_NORM_EXIT, \
icvNorm_Inf_##flavor##_C1R, srctype, c_normtype, temptype ) \
ICV_DEF_NORM_FUNC_2D( _abs_macro_, CV_ADD, \
CV_NORM_ENTRY, ICV_DEF_NORM_CASE, CV_NORM_EXIT, \
icvNorm_L1_##flavor##_C1R, srctype, l_normtype, temptype ) \
ICV_DEF_NORM_FUNC_2D( CV_SQR, CV_ADD, \
CV_NORM_ENTRY, ICV_DEF_NORM_CASE, CV_NORM_L2_EXIT, \
icvNorm_L2_##flavor##_C1R, srctype, l_normtype, temptype ) \
\
ICV_DEF_NORM_DIFF_FUNC_2D( _abs_macro_, _abs_diff_macro_, MAX, \
CV_NORM_ENTRY, ICV_DEF_NORM_DIFF_CASE, CV_NORM_EXIT, \
icvNormDiff_Inf_##flavor##_C1R, srctype, c_normtype, temptype ) \
ICV_DEF_NORM_DIFF_FUNC_2D( _abs_macro_, _abs_diff_macro_, CV_ADD, \
CV_NORM_ENTRY, ICV_DEF_NORM_DIFF_CASE, CV_NORM_EXIT, \
icvNormDiff_L1_##flavor##_C1R, srctype, l_normtype, temptype ) \
ICV_DEF_NORM_DIFF_FUNC_2D( CV_SQR, CV_SQR, CV_ADD, \
CV_NORM_ENTRY, ICV_DEF_NORM_DIFF_CASE, CV_NORM_L2_EXIT, \
icvNormDiff_L2_##flavor##_C1R, srctype, l_normtype, temptype) \
\
ICV_DEF_NORM_FUNC_2D_COI( _abs_macro_, MAX, \
CV_NORM_ENTRY, ICV_DEF_NORM_CASE, CV_NORM_EXIT, \
icvNorm_Inf_##flavor##_CnCR, srctype, c_normtype, temptype ) \
ICV_DEF_NORM_FUNC_2D_COI( _abs_macro_, CV_ADD, \
CV_NORM_ENTRY, ICV_DEF_NORM_CASE, CV_NORM_EXIT, \
icvNorm_L1_##flavor##_CnCR, srctype, l_normtype, temptype ) \
ICV_DEF_NORM_FUNC_2D_COI( CV_SQR, CV_ADD, \
CV_NORM_ENTRY, ICV_DEF_NORM_CASE, CV_NORM_L2_EXIT, \
icvNorm_L2_##flavor##_CnCR, srctype, l_normtype, temptype ) \
\
ICV_DEF_NORM_DIFF_FUNC_2D_COI( _abs_macro_, _abs_diff_macro_, MAX, \
CV_NORM_ENTRY, ICV_DEF_NORM_DIFF_CASE, CV_NORM_EXIT, \
icvNormDiff_Inf_##flavor##_CnCR, srctype, c_normtype, temptype)\
ICV_DEF_NORM_DIFF_FUNC_2D_COI( _abs_macro_, _abs_diff_macro_, CV_ADD, \
CV_NORM_ENTRY, ICV_DEF_NORM_DIFF_CASE, CV_NORM_EXIT, \
icvNormDiff_L1_##flavor##_CnCR, \
srctype, l_normtype, temptype ) \
ICV_DEF_NORM_DIFF_FUNC_2D_COI( CV_SQR, CV_SQR, CV_ADD, \
CV_NORM_ENTRY, ICV_DEF_NORM_DIFF_CASE, CV_NORM_L2_EXIT, \
icvNormDiff_L2_##flavor##_CnCR, \
srctype, l_normtype, temptype )
ICV_DEF_NORM_FUNC_ALL( CV_NOP, CV_IABS, 8u, uchar, int, int64, int )
ICV_DEF_NORM_FUNC_ALL( CV_IABS, CV_IABS, 8s, char, int, int64, int )
ICV_DEF_NORM_FUNC_ALL( CV_IABS, CV_IABS, 16s, short, int, int64, int )
ICV_DEF_NORM_FUNC_ALL( fabs, fabs, 32s, int, double, double, double )
ICV_DEF_NORM_FUNC_ALL( fabs, fabs, 32f, float, double, double, double )
ICV_DEF_NORM_FUNC_ALL( fabs, fabs, 64f, double, double, double, double )
#define ICV_DEF_INIT_NORM_TAB_2D( FUNCNAME, FLAG ) \
static void icvInit##FUNCNAME##FLAG##Table( CvFuncTable* tab ) \
{ \
tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u_##FLAG; \
tab->fn_2d[CV_8S] = (void*)icv##FUNCNAME##_8s_##FLAG; \
tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s_##FLAG; \
tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s_##FLAG; \
tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##FLAG; \
tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f_##FLAG; \
}
ICV_DEF_INIT_NORM_TAB_2D( Norm_Inf, C1R )
ICV_DEF_INIT_NORM_TAB_2D( Norm_L1, C1R )
ICV_DEF_INIT_NORM_TAB_2D( Norm_L2, C1R )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_Inf, C1R )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_L1, C1R )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_L2, C1R )
ICV_DEF_INIT_NORM_TAB_2D( Norm_Inf, CnCR )
ICV_DEF_INIT_NORM_TAB_2D( Norm_L1, CnCR )
ICV_DEF_INIT_NORM_TAB_2D( Norm_L2, CnCR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_Inf, CnCR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_L1, CnCR )
ICV_DEF_INIT_NORM_TAB_2D( NormDiff_L2, CnCR )
/****************************************************************************************\
* N o r m with M A S K *
\****************************************************************************************/
#define ICV_DEF_NORM_MASK_CASE( _mask_op_, _op_, _update_op_,\
temptype, len, cn ) \
{ \
for( x = 0; x <= (len) - 4; x += 4 ) \
{ \
temptype t0 = _mask_op_(mask[x],(src)[x*(cn)]); \
temptype t1 = _mask_op_(mask[x+1],(src)[(x+1)*(cn)]);\
\
t0 = (temptype)_op_(t0); \
t1 = (temptype)_op_(t1); \
\
norm = _update_op_( norm, t0 ); \
norm = _update_op_( norm, t1 ); \
\
t0 = _mask_op_(mask[x+2],(src)[(x+2)*(cn)]); \
t1 = _mask_op_(mask[x+3],(src)[(x+3)*(cn)]); \
\
t0 = (temptype)_op_(t0); \
t1 = (temptype)_op_(t1); \
\
norm = _update_op_( norm, t0 ); \
norm = _update_op_( norm, t1 ); \
} \
\
for( ; x < (len); x++ ) \
{ \
temptype t0 = _mask_op_(mask[x],(src)[x*(cn)]); \
t0 = (temptype)_op_(t0); \
norm = _update_op_( norm, t0 ); \
} \
}
#define ICV_DEF_NORM_DIFF_MASK_CASE( _mask_op_, _op_, _diff_op_, \
_update_op_, temptype, len, cn )\
{ \
for( x = 0; x <= (len) - 4; x += 4 ) \
{ \
temptype t0 = _mask_op_(mask[x],(src1)[x*(cn)] - (src2)[x*(cn)]);\
temptype t1 = _mask_op_(mask[x+1],(src1)[(x+1)*(cn)] - (src2)[(x+1)*(cn)]);\
\
t0 = (temptype)_diff_op_(t0); \
t1 = (temptype)_diff_op_(t1); \
\
norm = _update_op_( norm, t0 ); \
norm = _update_op_( norm, t1 ); \
\
t0 = _mask_op_(mask[x+2],(src1)[(x+2)*(cn)] - (src2)[(x+2)*(cn)]); \
t1 = _mask_op_(mask[x+3],(src1)[(x+3)*(cn)] - (src2)[(x+3)*(cn)]); \
\
t0 = (temptype)_diff_op_(t0); \
t1 = (temptype)_diff_op_(t1); \
\
norm = _update_op_( norm, t0 ); \
norm = _update_op_( norm, t1 ); \
} \
\
for( ; x < (len); x++ ) \
{ \
temptype t0 = _mask_op_(mask[x],(src1)[x*(cn)] - (src2)[x*(cn)]);\
t0 = (temptype)_diff_op_(t0); \
norm = _update_op_( norm, t0 ); \
} \
}
#define CV_NORM_MASK_ENTRY_FLT( normtype ) \
int x; \
float maskTab[] = { 0.f, 1.f }; \
normtype norm = 0
#define ICV_DEF_NORM_MASK_FUNC_2D( _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, double* _norm )) \
{ \
_entry_( normtype ); \
\
for( ; size.height--; (char*&)src += step, mask += maskStep ) \
{ \
_case_( _mask_op_, _op_, _update_op_, \
temptype, size.width, 1 ); \
} \
\
_exit_(1); \
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?