📄 cxcmp.cpp
字号:
{
IPPI_CALL( icvThreshold_LT_32f_C1R_p( src1->data.fl, src1_step, dst->data.fl,
dst_step, size, buf.f ));
EXIT;
}
}
else
{
if( type == CV_8U && icvThreshold_GT_8u_C1R_p )
{
IPPI_CALL( icvThreshold_GT_8u_C1R_p( src1->data.ptr, src1_step, dst->data.ptr,
dst_step, size, (uchar)buf.i ));
EXIT;
}
else if( type == CV_16S && icvThreshold_GT_16s_C1R_p )
{
IPPI_CALL( icvThreshold_GT_16s_C1R_p( src1->data.s, src1_step, dst->data.s,
dst_step, size, (short)buf.i ));
EXIT;
}
else if( type == CV_32F && icvThreshold_GT_32f_C1R_p )
{
IPPI_CALL( icvThreshold_GT_32f_C1R_p( src1->data.fl, src1_step, dst->data.fl,
dst_step, size, buf.f ));
EXIT;
}
}
if( type == CV_8U && size.width*size.height >= 1024 )
{
int i;
uchar tab[256];
CvMat _tab = cvMat( 1, 256, CV_8U, tab );
if( is_max )
{
for( i = 0; i < buf.i; i++ )
tab[i] = (uchar)buf.i;
for( ; i < 256; i++ )
tab[i] = (uchar)i;
}
else
{
for( i = 0; i < buf.i; i++ )
tab[i] = (uchar)i;
for( ; i < 256; i++ )
tab[i] = (uchar)buf.i;
}
cvLUT( src1, dst, &_tab );
EXIT;
}
IPPI_CALL( func( src1->data.ptr, src1_step, dst->data.ptr,
dst_step, size, &buf ));
__END__;
}
CV_IMPL void
cvMinS( const void* srcarr, double value, void* dstarr )
{
icvMinMaxS( srcarr, value, dstarr, 0 );
}
CV_IMPL void
cvMaxS( const void* srcarr, double value, void* dstarr )
{
icvMinMaxS( srcarr, value, dstarr, 1 );
}
/****************************************************************************************\
* Absolute Difference *
\****************************************************************************************/
#define ICV_DEF_BIN_ABS_DIFF_2D(name, arrtype, temptype, abs_macro, cast_macro)\
IPCVAPI_IMPL( CvStatus, \
name,( const arrtype* src1, int step1, \
const arrtype* src2, int step2, \
arrtype* dst, int step, CvSize size ), \
(src1, step1, src2, step2, dst, step, size)) \
{ \
step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]); \
step /= sizeof(dst[0]); \
\
for( ; size.height--; src1 += step1, src2 += step2, \
dst += step ) \
{ \
int i; \
\
for( i = 0; i <= size.width - 4; i += 4 ) \
{ \
temptype t0 = src1[i] - src2[i]; \
temptype t1 = src1[i+1] - src2[i+1]; \
\
t0 = (temptype)abs_macro(t0); \
t1 = (temptype)abs_macro(t1); \
\
dst[i] = cast_macro(t0); \
dst[i+1] = cast_macro(t1); \
\
t0 = src1[i+2] - src2[i+2]; \
t1 = src1[i+3] - src2[i+3]; \
\
t0 = (temptype)abs_macro(t0); \
t1 = (temptype)abs_macro(t1); \
\
dst[i+2] = cast_macro(t0); \
dst[i+3] = cast_macro(t1); \
} \
\
for( ; i < size.width; i++ ) \
{ \
temptype t0 = src1[i] - src2[i]; \
t0 = (temptype)abs_macro(t0); \
dst[i] = cast_macro(t0); \
} \
} \
\
return CV_OK; \
}
#define ICV_DEF_UN_ABS_DIFF_2D( name, arrtype, temptype, abs_macro, cast_macro)\
static CvStatus CV_STDCALL \
name( const arrtype* src0, int step1, \
arrtype* dst0, int step, \
CvSize size, const temptype* scalar ) \
{ \
step1 /= sizeof(src0[0]); step /= sizeof(dst0[0]); \
\
for( ; size.height--; src0 += step1, dst0 += step ) \
{ \
int i, len = size.width; \
const arrtype* src = src0; \
arrtype* dst = dst0; \
\
for( ; (len -= 12) >= 0; dst += 12, src += 12 ) \
{ \
temptype t0 = src[0] - scalar[0]; \
temptype t1 = src[1] - scalar[1]; \
\
t0 = (temptype)abs_macro(t0); \
t1 = (temptype)abs_macro(t1); \
\
dst[0] = cast_macro( t0 ); \
dst[1] = cast_macro( t1 ); \
\
t0 = src[2] - scalar[2]; \
t1 = src[3] - scalar[3]; \
\
t0 = (temptype)abs_macro(t0); \
t1 = (temptype)abs_macro(t1); \
\
dst[2] = cast_macro( t0 ); \
dst[3] = cast_macro( t1 ); \
\
t0 = src[4] - scalar[4]; \
t1 = src[5] - scalar[5]; \
\
t0 = (temptype)abs_macro(t0); \
t1 = (temptype)abs_macro(t1); \
\
dst[4] = cast_macro( t0 ); \
dst[5] = cast_macro( t1 ); \
\
t0 = src[6] - scalar[6]; \
t1 = src[7] - scalar[7]; \
\
t0 = (temptype)abs_macro(t0); \
t1 = (temptype)abs_macro(t1); \
\
dst[6] = cast_macro( t0 ); \
dst[7] = cast_macro( t1 ); \
\
t0 = src[8] - scalar[8]; \
t1 = src[9] - scalar[9]; \
\
t0 = (temptype)abs_macro(t0); \
t1 = (temptype)abs_macro(t1); \
\
dst[8] = cast_macro( t0 ); \
dst[9] = cast_macro( t1 ); \
\
t0 = src[10] - scalar[10]; \
t1 = src[11] - scalar[11]; \
\
t0 = (temptype)abs_macro(t0); \
t1 = (temptype)abs_macro(t1); \
\
dst[10] = cast_macro( t0 ); \
dst[11] = cast_macro( t1 ); \
} \
\
for( (len) += 12, i = 0; i < (len); i++ ) \
{ \
temptype t0 = src[i] - scalar[i]; \
t0 = (temptype)abs_macro(t0); \
dst[i] = cast_macro( t0 ); \
} \
} \
\
return CV_OK; \
}
#define ICV_TO_8U(x) ((uchar)(x))
#define ICV_TO_16U(x) ((ushort)(x))
ICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_8u_C1R, uchar, int, CV_IABS, ICV_TO_8U )
ICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_16u_C1R, ushort, int, CV_IABS, ICV_TO_16U )
ICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_16s_C1R, short, int, CV_IABS, CV_CAST_16S )
ICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_32s_C1R, int, int, CV_IABS, CV_CAST_32S )
ICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_32f_C1R, float, float, fabs, CV_CAST_32F )
ICV_DEF_BIN_ABS_DIFF_2D( icvAbsDiff_64f_C1R, double, double, fabs, CV_CAST_64F )
ICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_8u_CnR, uchar, int, CV_IABS, CV_CAST_8U )
ICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_16u_CnR, ushort, int, CV_IABS, CV_CAST_16U )
ICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_16s_CnR, short, int, CV_IABS, CV_CAST_16S )
ICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_32s_CnR, int, int, CV_IABS, CV_CAST_32S )
ICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_32f_CnR, float, float, fabs, CV_CAST_32F )
ICV_DEF_UN_ABS_DIFF_2D( icvAbsDiffC_64f_CnR, double, double, fabs, CV_CAST_64F )
#define ICV_INIT_MINI_FUNC_TAB_2D( FUNCNAME, suffix ) \
static void icvInit##FUNCNAME##Table( CvFuncTable* tab ) \
{ \
tab->fn_2d[CV_8U] = (void*)icv##FUNCNAME##_8u_##suffix; \
tab->fn_2d[CV_16U] = (void*)icv##FUNCNAME##_16u_##suffix; \
tab->fn_2d[CV_16S] = (void*)icv##FUNCNAME##_16s_##suffix; \
tab->fn_2d[CV_32S] = (void*)icv##FUNCNAME##_32s_##suffix; \
tab->fn_2d[CV_32F] = (void*)icv##FUNCNAME##_32f_##suffix; \
tab->fn_2d[CV_64F] = (void*)icv##FUNCNAME##_64f_##suffix; \
}
ICV_INIT_MINI_FUNC_TAB_2D( AbsDiff, C1R )
ICV_INIT_MINI_FUNC_TAB_2D( AbsDiffC, CnR )
CV_IMPL void
cvAbsDiff( const void* srcarr1, const void* srcarr2, void* dstarr )
{
static CvFuncTable adiff_tab;
static int inittab = 0;
CV_FUNCNAME( "cvAbsDiff" );
__BEGIN__;
int coi1 = 0, coi2 = 0, coi3 = 0;
CvMat srcstub1, *src1 = (CvMat*)srcarr1;
CvMat srcstub2, *src2 = (CvMat*)srcarr2;
CvMat dststub, *dst = (CvMat*)dstarr;
int src1_step, src2_step, dst_step;
CvSize size;
int type;
if( !inittab )
{
icvInitAbsDiffTable( &adiff_tab );
inittab = 1;
}
CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi1 ));
CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi2 ));
CV_CALL( dst = cvGetMat( dst, &dststub, &coi3 ));
if( coi1 != 0 || coi2 != 0 || coi3 != 0 )
CV_ERROR( CV_BadCOI, "" );
if( !CV_ARE_SIZES_EQ( src1, src2 ) )
CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
size = cvGetMatSize( src1 );
type = CV_MAT_TYPE(src1->type);
if( !CV_ARE_SIZES_EQ( src1, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
if( !CV_ARE_TYPES_EQ( src1, src2 ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
if( !CV_ARE_TYPES_EQ( src1, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
size.width *= CV_MAT_CN( type );
src1_step = src1->step;
src2_step = src2->step;
dst_step = dst->step;
if( CV_IS_MAT_CONT( src1->type & src2->type & dst->type ))
{
size.width *= size.height;
size.height = 1;
src1_step = src2_step = dst_step = CV_STUB_STEP;
}
{
CvFunc2D_3A func = (CvFunc2D_3A)
(adiff_tab.fn_2d[CV_MAT_DEPTH(type)]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
IPPI_CALL( func( src1->data.ptr, src1_step, src2->data.ptr, src2_step,
dst->data.ptr, dst_step, size ));
}
__END__;
}
CV_IMPL void
cvAbsDiffS( const void* srcarr, void* dstarr, CvScalar scalar )
{
static CvFuncTable adiffs_tab;
static int inittab = 0;
CV_FUNCNAME( "cvAbsDiffS" );
__BEGIN__;
int coi1 = 0, coi2 = 0;
int type, sctype;
CvMat srcstub, *src = (CvMat*)srcarr;
CvMat dststub, *dst = (CvMat*)dstarr;
int src_step, dst_step;
double buf[12];
CvSize size;
if( !inittab )
{
icvInitAbsDiffCTable( &adiffs_tab );
inittab = 1;
}
CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));
if( coi1 != 0 || coi2 != 0 )
CV_ERROR( CV_BadCOI, "" );
if( !CV_ARE_TYPES_EQ(src, dst) )
CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
if( !CV_ARE_SIZES_EQ(src, dst) )
CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
sctype = type = CV_MAT_TYPE( src->type );
if( CV_MAT_DEPTH(type) < CV_32S )
sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
size = cvGetMatSize( src );
size.width *= CV_MAT_CN( type );
src_step = src->step;
dst_step = dst->step;
if( CV_IS_MAT_CONT( src->type & dst->type ))
{
size.width *= size.height;
size.height = 1;
src_step = dst_step = CV_STUB_STEP;
}
CV_CALL( cvScalarToRawData( &scalar, buf, sctype, 1 ));
{
CvFunc2D_2A1P func = (CvFunc2D_2A1P)
(adiffs_tab.fn_2d[CV_MAT_DEPTH(type)]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
IPPI_CALL( func( src->data.ptr, src_step, dst->data.ptr,
dst_step, size, buf ));
}
__END__;
}
/* End of file. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -