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