cvmean.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 381 行 · 第 1/2 页
SVN-BASE
381 行
#define ICV_MEAN_ENTRY_FLT( sumtype ) \
float maskTab[] = { 1.f, 0.f }; \
sumtype sum[4] = {0,0,0,0}; \
int pix = 0
#define ICV_MEAN_EXIT(cn) \
{ \
double scale = pix ? 1./pix : 0; \
for( int k = 0; k < cn; k++ ) \
mean[k] = sum[k]*scale; \
} \
return CV_OK;
#define ICV_IMPL_MEAN_FUNC_2D( _mask_op_, _entry_, _exit_, \
flavor, cn, srctype, sumtype, acctype)\
IPCVAPI_IMPL( CvStatus, icvMean_##flavor##_C##cn##MR, \
( const srctype* src, int step, \
const uchar* mask, int maskStep, \
CvSize size, double* mean )) \
{ \
_entry_( sumtype ); \
\
for( ; size.height--; \
(char*&)src += step, (char*&)mask += maskStep ) \
{ \
ICV_IMPL_MEAN_1D_CASE_C##cn( _mask_op_, acctype, src, mask, \
size.width, sum, pix ); \
} \
\
_exit_(cn); \
}
#define ICV_IMPL_MEAN_FUNC_2D_COI( _mask_op_, _entry_, _exit_, \
flavor, srctype, sumtype, acctype)\
IPCVAPI_IMPL( CvStatus, icvMean_##flavor##_CnCMR, \
( const srctype* src, int step, \
const uchar* mask, int maskStep, \
CvSize size, int cn, int coi, double* mean))\
{ \
_entry_( sumtype ); \
(src) += coi - 1; \
\
for( ; size.height--; \
(char*&)src += step, (char*&)mask += maskStep ) \
{ \
ICV_IMPL_MEAN_1D_CASE_COI( _mask_op_, acctype, src, mask, \
size.width, sum, pix, cn ); \
} \
\
mean[0] = sum[0]*(pix ? 1./pix : 0); \
\
return CV_OK; \
}
#define ICV_IMPL_MEAN_ALL( flavor, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D( CV_AND, ICV_MEAN_ENTRY, ICV_MEAN_EXIT, \
flavor, 1, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D( CV_AND, ICV_MEAN_ENTRY, ICV_MEAN_EXIT, \
flavor, 2, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D( CV_AND, ICV_MEAN_ENTRY, ICV_MEAN_EXIT, \
flavor, 3, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D( CV_AND, ICV_MEAN_ENTRY, ICV_MEAN_EXIT, \
flavor, 4, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D_COI( CV_AND, ICV_MEAN_ENTRY, ICV_MEAN_EXIT, \
flavor, srctype, sumtype, acctype )
#define ICV_IMPL_MEAN_ALL_FLT( flavor, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D( CV_MULMASK1, ICV_MEAN_ENTRY_FLT, ICV_MEAN_EXIT, \
flavor, 1, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D( CV_MULMASK1, ICV_MEAN_ENTRY_FLT, ICV_MEAN_EXIT, \
flavor, 2, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D( CV_MULMASK1, ICV_MEAN_ENTRY_FLT, ICV_MEAN_EXIT, \
flavor, 3, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D( CV_MULMASK1, ICV_MEAN_ENTRY_FLT, ICV_MEAN_EXIT, \
flavor, 4, srctype, sumtype, acctype ) \
ICV_IMPL_MEAN_FUNC_2D_COI( CV_MULMASK1, ICV_MEAN_ENTRY_FLT, ICV_MEAN_EXIT, \
flavor, srctype, sumtype, acctype )
ICV_IMPL_MEAN_ALL( 8u, uchar, int64, int )
ICV_IMPL_MEAN_ALL( 8s, char, int64, int )
ICV_IMPL_MEAN_ALL( 16s, short, int64, int )
ICV_IMPL_MEAN_ALL( 32s, int, int64, int64 )
ICV_IMPL_MEAN_ALL_FLT( 32f, float, double, double )
ICV_IMPL_MEAN_ALL_FLT( 64f, double, double, double )
CV_DEF_INIT_BIG_FUNC_TAB_2D( Mean, MR )
CV_DEF_INIT_FUNC_TAB_2D( Mean, CnCMR )
CV_IMPL CvScalar
cvAvg( const void* img, const void* mask )
{
CvScalar mean = {{0,0,0,0}};
static CvBigFuncTable mean_tab;
static CvFuncTable meancoi_tab;
static int inittab = 0;
CV_FUNCNAME("cvAvg");
__BEGIN__;
CvSize size;
double scale;
if( !mask )
{
CV_CALL( mean = cvSum(img));
cvGetRawData( img, 0, 0, &size );
size.width *= size.height;
scale = size.width ? 1./size.width : 0;
mean.val[0] *= scale;
mean.val[1] *= scale;
mean.val[2] *= scale;
mean.val[3] *= scale;
}
else
{
int type, coi = 0;
int mat_step, mask_step;
CvMat stub, maskstub, *mat = (CvMat*)img, *matmask = (CvMat*)mask;
if( !inittab )
{
icvInitMeanMRTable( &mean_tab );
icvInitMeanCnCMRTable( &meancoi_tab );
inittab = 1;
}
CV_CALL( mat = cvGetMat( mat, &stub, &coi ));
CV_CALL( matmask = cvGetMat( matmask, &maskstub ));
if( !CV_IS_MASK_ARR( matmask) )
CV_ERROR( CV_StsBadMask, "" );
if( !CV_ARE_SIZES_EQ( mat, matmask ) )
CV_ERROR( CV_StsUnmatchedSizes, "" );
type = CV_MAT_TYPE( mat->type );
size = icvGetMatSize( mat );
mat_step = mat->step;
mask_step = matmask->step;
if( CV_IS_MAT_CONT( mat->type & matmask->type ))
{
size.width *= size.height;
size.height = 1;
mat_step = mask_step = CV_STUB_STEP;
}
if( CV_MAT_CN(type) == 1 || coi == 0 )
{
CvFunc2D_2A1P func = (CvFunc2D_2A1P)(mean_tab.fn_2d[type]);
if( !func )
CV_ERROR( CV_StsBadArg, icvUnsupportedFormat );
IPPI_CALL( func( mat->data.ptr, mat_step, matmask->data.ptr,
mask_step, size, mean.val ));
}
else
{
CvFunc2DnC_2A1P func = (CvFunc2DnC_2A1P)(
meancoi_tab.fn_2d[CV_MAT_DEPTH(type)]);
if( !func )
CV_ERROR( CV_StsBadArg, icvUnsupportedFormat );
IPPI_CALL( func( mat->data.ptr, mat->step,
matmask->data.ptr, matmask->step,
size, CV_MAT_CN(type), coi, mean.val ));
}
}
__END__;
return mean;
}
/* End of file */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?