📄 cxconvert.cpp
字号:
dst[i+1] = cast_macro(t1); \
\
t0 = scale_macro((a)*_src[i+2] + (b)); \
t1 = scale_macro((a)*_src[i+3] + (b)); \
\
dst[i+2] = cast_macro(t0); \
dst[i+3] = cast_macro(t1); \
} \
\
for( ; i < size.width; i++ ) \
{ \
worktype t0 = scale_macro((a)*_src[i] + (b)); \
dst[i] = cast_macro(t0); \
} \
} \
}
#define ICV_DEF_CVT_SCALE_FUNC_INT( flavor, dsttype, cast_macro ) \
static CvStatus CV_STDCALL \
icvCvtScaleTo_##flavor##_C1R( const uchar* src, int srcstep, \
dsttype* dst, int dststep, CvSize size, \
double scale, double shift, int param ) \
{ \
int i, srctype = param; \
dsttype lut[256]; \
dststep /= sizeof(dst[0]); \
\
switch( CV_MAT_DEPTH(srctype) ) \
{ \
case CV_8U: \
if( size.width*size.height >= 256 ) \
{ \
double val = shift; \
for( i = 0; i < 256; i++, val += scale ) \
{ \
int t = cvRound(val); \
lut[i] = cast_macro(t); \
} \
\
icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst, \
dststep*sizeof(dst[0]), size, lut ); \
} \
else if( fabs( scale ) <= 128. && \
fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT)) \
{ \
int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); \
int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT)); \
\
ICV_DEF_CVT_SCALE_CASE( uchar, int, ICV_SCALE, \
cast_macro, iscale, ishift ); \
} \
else \
{ \
ICV_DEF_CVT_SCALE_CASE( uchar, int, cvRound, \
cast_macro, scale, shift ); \
} \
break; \
case CV_8S: \
if( size.width*size.height >= 256 ) \
{ \
for( i = 0; i < 256; i++ ) \
{ \
int t = cvRound( (char)i*scale + shift ); \
lut[i] = cast_macro(t); \
} \
\
icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst, \
dststep*sizeof(dst[0]), size, lut ); \
} \
else if( fabs( scale ) <= 128. && \
fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT)) \
{ \
int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); \
int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT)); \
\
ICV_DEF_CVT_SCALE_CASE( char, int, ICV_SCALE, \
cast_macro, iscale, ishift ); \
} \
else \
{ \
ICV_DEF_CVT_SCALE_CASE( char, int, cvRound, \
cast_macro, scale, shift ); \
} \
break; \
case CV_16U: \
if( fabs( scale ) <= 1. && fabs(shift) < DBL_EPSILON ) \
{ \
int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); \
\
ICV_DEF_CVT_SCALE_CASE( ushort, int, ICV_SCALE, \
cast_macro, iscale, 0 ); \
} \
else \
{ \
ICV_DEF_CVT_SCALE_CASE( ushort, int, cvRound, \
cast_macro, scale, shift ); \
} \
break; \
case CV_16S: \
if( fabs( scale ) <= 1. && \
fabs( shift ) <= (INT_MAX*0.5)/(1 << ICV_FIX_SHIFT)) \
{ \
int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT)); \
int ishift = cvRound(shift*(1 << ICV_FIX_SHIFT)); \
\
ICV_DEF_CVT_SCALE_CASE( short, int, ICV_SCALE, \
cast_macro, iscale, ishift ); \
} \
else \
{ \
ICV_DEF_CVT_SCALE_CASE( short, int, cvRound, \
cast_macro, scale, shift ); \
} \
break; \
case CV_32S: \
ICV_DEF_CVT_SCALE_CASE( int, int, cvRound, \
cast_macro, scale, shift ); \
break; \
case CV_32F: \
ICV_DEF_CVT_SCALE_CASE( float, int, cvRound, \
cast_macro, scale, shift ); \
break; \
case CV_64F: \
ICV_DEF_CVT_SCALE_CASE( double, int, cvRound, \
cast_macro, scale, shift ); \
break; \
default: \
assert(0); \
return CV_BADFLAG_ERR; \
} \
\
return CV_OK; \
}
#define ICV_DEF_CVT_SCALE_FUNC_FLT( flavor, dsttype, cast_macro ) \
static CvStatus CV_STDCALL \
icvCvtScaleTo_##flavor##_C1R( const uchar* src, int srcstep, \
dsttype* dst, int dststep, CvSize size, \
double scale, double shift, int param ) \
{ \
int i, srctype = param; \
dsttype lut[256]; \
dststep /= sizeof(dst[0]); \
\
switch( CV_MAT_DEPTH(srctype) ) \
{ \
case CV_8U: \
if( size.width*size.height >= 256 ) \
{ \
double val = shift; \
for( i = 0; i < 256; i++, val += scale ) \
lut[i] = (dsttype)val; \
\
icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst, \
dststep*sizeof(dst[0]), size, lut ); \
} \
else \
{ \
ICV_DEF_CVT_SCALE_CASE( uchar, double, CV_NOP, \
cast_macro, scale, shift ); \
} \
break; \
case CV_8S: \
if( size.width*size.height >= 256 ) \
{ \
for( i = 0; i < 256; i++ ) \
lut[i] = (dsttype)((char)i*scale + shift); \
\
icvLUT_Transform8u_##flavor##_C1R( src, srcstep, dst, \
dststep*sizeof(dst[0]), size, lut ); \
} \
else \
{ \
ICV_DEF_CVT_SCALE_CASE( char, double, CV_NOP, \
cast_macro, scale, shift ); \
} \
break; \
case CV_16U: \
ICV_DEF_CVT_SCALE_CASE( ushort, double, CV_NOP, \
cast_macro, scale, shift ); \
break; \
case CV_16S: \
ICV_DEF_CVT_SCALE_CASE( short, double, CV_NOP, \
cast_macro, scale, shift ); \
break; \
case CV_32S: \
ICV_DEF_CVT_SCALE_CASE( int, double, CV_NOP, \
cast_macro, scale, shift ); \
break; \
case CV_32F: \
ICV_DEF_CVT_SCALE_CASE( float, double, CV_NOP, \
cast_macro, scale, shift ); \
break; \
case CV_64F: \
ICV_DEF_CVT_SCALE_CASE( double, double, CV_NOP, \
cast_macro, scale, shift ); \
break; \
default: \
assert(0); \
return CV_BADFLAG_ERR; \
} \
\
return CV_OK; \
}
ICV_DEF_CVT_SCALE_FUNC_INT( 8u, uchar, CV_CAST_8U )
ICV_DEF_CVT_SCALE_FUNC_INT( 8s, char, CV_CAST_8S )
ICV_DEF_CVT_SCALE_FUNC_INT( 16s, short, CV_CAST_16S )
ICV_DEF_CVT_SCALE_FUNC_INT( 16u, ushort, CV_CAST_16U )
ICV_DEF_CVT_SCALE_FUNC_INT( 32s, int, CV_CAST_32S )
ICV_DEF_CVT_SCALE_FUNC_FLT( 32f, float, CV_CAST_32F )
ICV_DEF_CVT_SCALE_FUNC_FLT( 64f, double, CV_CAST_64F )
CV_DEF_INIT_FUNC_TAB_2D( CvtScaleTo, C1R )
/****************************************************************************************\
* Conversion w/o scaling macros *
\****************************************************************************************/
#define ICV_DEF_CVT_CASE_2D( srctype, worktype, \
cast_macro1, cast_macro2 ) \
{ \
const srctype* _src = (const srctype*)src; \
srcstep /= sizeof(_src[0]); \
\
for( ; size.height--; _src += srcstep, dst += dststep ) \
{ \
int i; \
\
for( i = 0; i <= size.width - 4; i += 4 ) \
{ \
worktype t0 = cast_macro1(_src[i]); \
worktype t1 = cast_macro1(_src[i+1]); \
\
dst[i] = cast_macro2(t0); \
dst[i+1] = cast_macro2(t1); \
\
t0 = cast_macro1(_src[i+2]); \
t1 = cast_macro1(_src[i+3]); \
\
dst[i+2] = cast_macro2(t0); \
dst[i+3] = cast_macro2(t1); \
} \
\
for( ; i < size.width; i++ ) \
{ \
worktype t0 = cast_macro1(_src[i]); \
dst[i] = cast_macro2(t0); \
} \
} \
}
#define ICV_DEF_CVT_FUNC_2D( flavor, dsttype, worktype, cast_macro2, \
srcdepth1, srctype1, cast_macro11, \
srcdepth2, srctype2, cast_macro12, \
srcdepth3, srctype3, cast_macro13, \
srcdepth4, srctype4, cast_macro14, \
srcdepth5, srctype5, cast_macro15, \
srcdepth6, srctype6, cast_macro16 ) \
static CvStatus CV_STDCALL \
icvCvtTo_##flavor##_C1R( const uchar* src, int srcstep, \
dsttype* dst, int dststep, \
CvSize size, int param ) \
{ \
int srctype = param; \
dststep /= sizeof(dst[0]); \
\
switch( CV_MAT_DEPTH(srctype) ) \
{ \
case srcdepth1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -