📄 cxarithm.cpp
字号:
for( ; i < size.width; i++ ) \
{ \
worktype t0 = src1[i] * src2[i]; \
dst[i] = _cast_macro2_(t0); \
} \
} \
} \
else \
{ \
for( ; size.height--; src1+=step1, src2+=step2, dst+=step ) \
{ \
int i; \
for( i = 0; i <= size.width - 4; i += 4 ) \
{ \
double ft0 = scale*_cvt_macro_(src1[i])*_cvt_macro_(src2[i]); \
double ft1 = scale*_cvt_macro_(src1[i+1])*_cvt_macro_(src2[i+1]); \
worktype t0 = _cast_macro1_(ft0); \
worktype t1 = _cast_macro1_(ft1); \
\
dst[i] = _cast_macro2_(t0); \
dst[i+1] = _cast_macro2_(t1); \
\
ft0 = scale*_cvt_macro_(src1[i+2])*_cvt_macro_(src2[i+2]); \
ft1 = scale*_cvt_macro_(src1[i+3])*_cvt_macro_(src2[i+3]); \
t0 = _cast_macro1_(ft0); \
t1 = _cast_macro1_(ft1); \
\
dst[i+2] = _cast_macro2_(t0); \
dst[i+3] = _cast_macro2_(t1); \
} \
\
for( ; i < size.width; i++ ) \
{ \
worktype t0; \
t0 = _cast_macro1_(scale*_cvt_macro_(src1[i])*_cvt_macro_(src2[i])); \
dst[i] = _cast_macro2_(t0); \
} \
} \
} \
\
return CV_OK; \
}
ICV_DEF_MUL_OP_CASE( 8u, uchar, int, cvRound, CV_CAST_8U, CV_8TO32F )
ICV_DEF_MUL_OP_CASE( 16u, ushort, int, cvRound, CV_CAST_16U, CV_NOP )
ICV_DEF_MUL_OP_CASE( 16s, short, int, cvRound, CV_CAST_16S, CV_NOP )
ICV_DEF_MUL_OP_CASE( 32s, int, int, cvRound, CV_CAST_32S, CV_NOP )
ICV_DEF_MUL_OP_CASE( 32f, float, double, CV_NOP, CV_CAST_32F, CV_NOP )
ICV_DEF_MUL_OP_CASE( 64f, double, double, CV_NOP, CV_CAST_64F, CV_NOP )
ICV_DEF_INIT_ARITHM_FUNC_TAB( Mul, C1R )
typedef CvStatus (CV_STDCALL * CvScaledElWiseFunc)( const void* src1, int step1,
const void* src2, int step2,
void* dst, int step,
CvSize size, double scale );
CV_IMPL void
cvMul( const void* srcarr1, const void* srcarr2, void* dstarr, double scale )
{
static CvFuncTable mul_tab;
static int inittab = 0;
CV_FUNCNAME( "cvMul" );
__BEGIN__;
int type, depth, coi = 0;
int src1_step, src2_step, dst_step;
int is_nd = 0;
CvMat srcstub1, *src1 = (CvMat*)srcarr1;
CvMat srcstub2, *src2 = (CvMat*)srcarr2;
CvMat dststub, *dst = (CvMat*)dstarr;
CvSize size;
CvScaledElWiseFunc func;
if( !inittab )
{
icvInitMulC1RTable( &mul_tab );
inittab = 1;
}
if( !CV_IS_MAT(src1) )
{
if( CV_IS_MATND(src1) )
is_nd = 1;
else
{
CV_CALL( src1 = cvGetMat( src1, &srcstub1, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
}
if( !CV_IS_MAT(src2) )
{
if( CV_IS_MATND(src2) )
is_nd = 1;
else
{
CV_CALL( src2 = cvGetMat( src2, &srcstub2, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
}
if( !CV_IS_MAT(dst) )
{
if( CV_IS_MATND(dst) )
is_nd = 1;
else
{
CV_CALL( dst = cvGetMat( dst, &dststub, &coi ));
if( coi != 0 )
CV_ERROR( CV_BadCOI, "" );
}
}
if( is_nd )
{
CvArr* arrs[] = { src1, src2, dst };
CvMatND stubs[3];
CvNArrayIterator iterator;
CV_CALL( cvInitNArrayIterator( 3, arrs, 0, stubs, &iterator ));
type = iterator.hdr[0]->type;
iterator.size.width *= CV_MAT_CN(type);
func = (CvScaledElWiseFunc)(mul_tab.fn_2d[CV_MAT_DEPTH(type)]);
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
do
{
IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
iterator.ptr[1], CV_STUB_STEP,
iterator.ptr[2], CV_STUB_STEP,
iterator.size, scale ));
}
while( cvNextNArraySlice( &iterator ));
EXIT;
}
if( !CV_ARE_TYPES_EQ( src1, src2 ) || !CV_ARE_TYPES_EQ( src1, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );
if( !CV_ARE_SIZES_EQ( src1, src2 ) || !CV_ARE_SIZES_EQ( src1, dst ))
CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );
type = CV_MAT_TYPE(src1->type);
size = cvGetMatSize( src1 );
depth = CV_MAT_DEPTH(type);
size.width *= CV_MAT_CN( type );
if( CV_IS_MAT_CONT( src1->type & src2->type & dst->type ))
{
size.width *= size.height;
if( size.width <= CV_MAX_INLINE_MAT_OP_SIZE && scale == 1 )
{
if( depth == CV_32F )
{
const float* src1data = (const float*)(src1->data.ptr);
const float* src2data = (const float*)(src2->data.ptr);
float* dstdata = (float*)(dst->data.ptr);
do
{
dstdata[size.width-1] = (float)
(src1data[size.width-1] * src2data[size.width-1]);
}
while( --size.width );
EXIT;
}
if( depth == CV_64F )
{
const double* src1data = (const double*)(src1->data.ptr);
const double* src2data = (const double*)(src2->data.ptr);
double* dstdata = (double*)(dst->data.ptr);
do
{
dstdata[size.width-1] =
src1data[size.width-1] * src2data[size.width-1];
}
while( --size.width );
EXIT;
}
}
src1_step = src2_step = dst_step = CV_STUB_STEP;
size.height = 1;
}
else
{
src1_step = src1->step;
src2_step = src2->step;
dst_step = dst->step;
}
func = (CvScaledElWiseFunc)(mul_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, scale ));
__END__;
}
/***************************************** D I V ****************************************/
#define ICV_DEF_DIV_OP_CASE( flavor, arrtype, worktype, checktype, _start_row_macro_, \
_cast_macro1_, _cast_macro2_, _cvt_macro_, _check_macro_, isrc ) \
\
static CvStatus CV_STDCALL \
icvDiv_##flavor##_C1R( const arrtype* src1, int step1, \
const arrtype* src2, int step2, \
arrtype* dst, int step, \
CvSize size, double scale ) \
{ \
step1 /= sizeof(src1[0]); step2 /= sizeof(src2[0]); step /= sizeof(dst[0]); \
\
for( ; size.height--; src1+=step1, src2+=step2, dst+=step ) \
{ \
_start_row_macro_(checktype, src2); \
for( i = 0; i <= size.width - 4; i += 4 ) \
{ \
if( _check_macro_(isrc[i]) && _check_macro_(isrc[i+1]) && \
_check_macro_(isrc[i+2]) && _check_macro_(isrc[i+3])) \
{ \
double a = (double)_cvt_macro_(src2[i]) * _cvt_macro_(src2[i+1]); \
double b = (double)_cvt_macro_(src2[i+2]) * _cvt_macro_(src2[i+3]); \
double d = scale/(a * b); \
\
b *= d; \
a *= d; \
\
worktype z0 = _cast_macro1_(src2[i+1] * _cvt_macro_(src1[i]) * b); \
worktype z1 = _cast_macro1_(src2[i] * _cvt_macro_(src1[i+1]) * b); \
worktype z2 = _cast_macro1_(src2[i+3] * _cvt_macro_(src1[i+2]) * a); \
worktype z3 = _cast_macro1_(src2[i+2] * _cvt_macro_(src1[i+3]) * a); \
\
dst[i] = _cast_macro2_(z0); \
dst[i+1] = _cast_macro2_(z1); \
dst[i+2] = _cast_macro2_(z2); \
dst[i+3] = _cast_macro2_(z3); \
} \
else \
{ \
worktype z0 = _check_macro_(isrc[i]) ? \
_cast_macro1_(_cvt_macro_(src1[i])*scale/_cvt_macro_(src2[i])) : 0; \
worktype z1 = _check_macro_(isrc[i+1]) ? \
_cast_macro1_(_cvt_macro_(src1[i+1])*scale/_cvt_macro_(src2[i+1])):0;\
worktype z2 = _check_macro_(isrc[i+2]) ? \
_cast_macro1_(_cvt_macro_(src1[i+2])*scale/_cvt_macro_(src2[i+2])):0;\
worktype z3 = _check_macro_(isrc[i+3]) ? \
_cast_macro1_(_cvt_macro_(src1[i+3])*scale/_cvt_macro_(src2[i+3])):0;\
\
dst[i] = _cast_macro2_(z0); \
dst[i+1] = _cast_macro2_(z1); \
dst[i+2] = _cast_macro2_(z2); \
dst[i+3] = _cast_macro2_(z3); \
} \
} \
\
for( ; i < size.width; i++ ) \
{ \
worktype z0 = _check_macro_(isrc[i]) ? \
_cast_macro1_(_cvt_macro_(src1[i])*scale/_cvt_macro_(src2[i])) : 0; \
dst[i] = _cast_macro2_(z0); \
} \
} \
\
return CV_OK; \
}
#define ICV_DEF_RECIP_OP_CASE( flavor, arrtype, worktype, checktype, \
_start_row_macro_, _cast_macro1_, _cast_macro2_, \
_cvt_macro_, _check_macro_, isrc ) \
\
static CvStatus CV_STDCALL \
icvRecip_##flavor##_C1R( const arrtype* src, int step1, \
arrtype* dst, int step, \
CvSize size, double scale ) \
{ \
step1 /= sizeof(src[0]); step /= sizeof(dst[0]); \
\
for( ; size.height--; src+=step1, dst+=step ) \
{ \
_start_row_macro_(checktype, src); \
for( i = 0; i <= size.width - 4; i += 4 ) \
{ \
if( _check_macro_(isrc[i]) && _check_macro_(isrc[i+1]) && \
_check_macro_(isrc[i+2]) && _check_macro_(isrc[i+3])) \
{ \
double a = (double)_cvt_macro_(src[i]) * _cvt_macro_(src[i+1]); \
double b = (double)_cvt_macro_(src[i+2]) * _cvt_macro_(src[i+3]);\
double d = scale/(a * b);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -