📄 cxconvert.cpp
字号:
}
for( i = 0; i < pair_count; i++ )
{
for( k = 0; k < 2; k++ )
{
int cn = from_to[i*2 + k];
const int* cn_arr = k == 0 ? src_cn : dst_cn;
int a = 0, b = k == 0 ? src_count-1 : dst_count-1;
if( cn < 0 || cn >= cn_arr[b+1] )
{
if( k == 0 && cn < 0 )
{
sptr[i] = 0;
sdelta0[i] = sdelta1[i] = 0;
continue;
}
else
{
char err_str[100];
sprintf( err_str, "channel index #%d in the array of pairs is negative "
"or exceeds the total number of channels in all the %s arrays", i*2+k,
k == 0 ? "input" : "output" );
CV_ERROR( CV_StsOutOfRange, err_str );
}
}
for( ; cn >= cn_arr[a+1]; a++ )
;
if( k == 0 )
{
sptr[i] = src0[a] + (cn - cn_arr[a])*elem_size;
sdelta1[i] = cn_arr[a+1] - cn_arr[a];
sdelta0[i] = src_step[a];
}
else
{
dptr[i] = dst0[a] + (cn - cn_arr[a])*elem_size;
ddelta1[i] = cn_arr[a+1] - cn_arr[a];
ddelta0[i] = dst_step[a];
}
}
}
func = (CvMixChannelsFunc)mixcn_tab.fn_2d[depth];
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "The data type is not supported by the function" );
IPPI_CALL( func( (const void**)sptr, sdelta0, sdelta1, (void**)dptr,
ddelta0, ddelta1, pair_count, size ));
__END__;
if( buffer && heap_alloc )
cvFree( &buffer );
}
/****************************************************************************************\
* cvConvertScaleAbs *
\****************************************************************************************/
#define ICV_DEF_CVT_SCALE_ABS_CASE( srctype, worktype, \
scale_macro, abs_macro, cast_macro, a, b ) \
\
{ \
const srctype* _src = (const srctype*)src; \
srcstep /= sizeof(_src[0]); /*dststep /= sizeof(_dst[0]);*/ \
\
for( ; size.height--; _src += srcstep, dst += dststep ) \
{ \
int i; \
\
for( i = 0; i <= size.width - 4; i += 4 ) \
{ \
worktype t0 = scale_macro((a)*_src[i] + (b)); \
worktype t1 = scale_macro((a)*_src[i+1] + (b)); \
\
t0 = (worktype)abs_macro(t0); \
t1 = (worktype)abs_macro(t1); \
\
dst[i] = cast_macro(t0); \
dst[i+1] = cast_macro(t1); \
\
t0 = scale_macro((a)*_src[i+2] + (b)); \
t1 = scale_macro((a)*_src[i+3] + (b)); \
\
t0 = (worktype)abs_macro(t0); \
t1 = (worktype)abs_macro(t1); \
\
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)); \
t0 = (worktype)abs_macro(t0); \
dst[i] = cast_macro(t0); \
} \
} \
}
#define ICV_FIX_SHIFT 15
#define ICV_SCALE(x) (((x) + (1 << (ICV_FIX_SHIFT-1))) >> ICV_FIX_SHIFT)
static CvStatus CV_STDCALL
icvCvtScaleAbsTo_8u_C1R( const uchar* src, int srcstep,
uchar* dst, int dststep,
CvSize size, double scale, double shift,
int param )
{
int srctype = param;
int srcdepth = CV_MAT_DEPTH(srctype);
size.width *= CV_MAT_CN(srctype);
switch( srcdepth )
{
case CV_8S:
case CV_8U:
{
uchar lut[256];
int i;
double val = shift;
for( i = 0; i < 128; i++, val += scale )
{
int t = cvRound(fabs(val));
lut[i] = CV_CAST_8U(t);
}
if( srcdepth == CV_8S )
val = -val;
for( ; i < 256; i++, val += scale )
{
int t = cvRound(fabs(val));
lut[i] = CV_CAST_8U(t);
}
icvLUT_Transform8u_8u_C1R( src, srcstep, dst,
dststep, size, lut );
}
break;
case CV_16U:
if( fabs( scale ) <= 1. && fabs(shift) < DBL_EPSILON )
{
int iscale = cvRound(scale*(1 << ICV_FIX_SHIFT));
if( iscale == ICV_FIX_SHIFT )
{
ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, CV_NOP, CV_IABS,
CV_CAST_8U, 1, 0 );
}
else
{
ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, ICV_SCALE, CV_IABS,
CV_CAST_8U, iscale, 0 );
}
}
else
{
ICV_DEF_CVT_SCALE_ABS_CASE( ushort, int, cvRound, CV_IABS,
CV_CAST_8U, 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));
if( iscale == ICV_FIX_SHIFT && ishift == 0 )
{
ICV_DEF_CVT_SCALE_ABS_CASE( short, int, CV_NOP, CV_IABS,
CV_CAST_8U, 1, 0 );
}
else
{
ICV_DEF_CVT_SCALE_ABS_CASE( short, int, ICV_SCALE, CV_IABS,
CV_CAST_8U, iscale, ishift );
}
}
else
{
ICV_DEF_CVT_SCALE_ABS_CASE( short, int, cvRound, CV_IABS,
CV_CAST_8U, scale, shift );
}
break;
case CV_32S:
ICV_DEF_CVT_SCALE_ABS_CASE( int, int, cvRound, CV_IABS,
CV_CAST_8U, scale, shift );
break;
case CV_32F:
ICV_DEF_CVT_SCALE_ABS_CASE( float, int, cvRound, CV_IABS,
CV_CAST_8U, scale, shift );
break;
case CV_64F:
ICV_DEF_CVT_SCALE_ABS_CASE( double, int, cvRound, CV_IABS,
CV_CAST_8U, scale, shift );
break;
default:
assert(0);
return CV_BADFLAG_ERR;
}
return CV_OK;
}
CV_IMPL void
cvConvertScaleAbs( const void* srcarr, void* dstarr,
double scale, double shift )
{
CV_FUNCNAME( "cvConvertScaleAbs" );
__BEGIN__;
int coi1 = 0, coi2 = 0;
CvMat srcstub, *src = (CvMat*)srcarr;
CvMat dststub, *dst = (CvMat*)dstarr;
CvSize size;
int src_step, dst_step;
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_SIZES_EQ( src, dst ))
CV_ERROR( CV_StsUnmatchedSizes, "" );
if( !CV_ARE_CNS_EQ( src, dst ))
CV_ERROR( CV_StsUnmatchedFormats, "" );
if( CV_MAT_DEPTH( dst->type ) != CV_8U )
CV_ERROR( CV_StsUnsupportedFormat, "" );
size = cvGetMatSize( src );
src_step = src->step;
dst_step = dst->step;
if( CV_IS_MAT_CONT( src->type & dst->type ))
{
size.width *= size.height;
src_step = dst_step = CV_STUB_STEP;
size.height = 1;
}
IPPI_CALL( icvCvtScaleAbsTo_8u_C1R( src->data.ptr, src_step,
(uchar*)(dst->data.ptr), dst_step,
size, scale, shift, CV_MAT_TYPE(src->type)));
__END__;
}
/****************************************************************************************\
* cvConvertScale *
\****************************************************************************************/
#define ICV_DEF_CVT_SCALE_CASE( srctype, worktype, \
scale_macro, cast_macro, a, b ) \
\
{ \
const srctype* _src = (const srctype*)src; \
srcstep /= sizeof(_src[0]); \
\
for( ; size.height--; _src += srcstep, dst += dststep ) \
{ \
for( i = 0; i <= size.width - 4; i += 4 ) \
{ \
worktype t0 = scale_macro((a)*_src[i]+(b)); \
worktype t1 = scale_macro((a)*_src[i+1]+(b)); \
\
dst[i] = cast_macro(t0); \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -