📄 cxnorm.cpp
字号:
}
while( --size.width );
if( is_relative )
norm = norm_diff/(norm + DBL_EPSILON);
else
norm = norm_diff;
}
norm = sqrt(norm);
EXIT;
}
if( depth == CV_64F )
{
const double* src1data = mat1->data.db;
int size0 = size.width *= cn;
if( !mat2 || is_relative )
{
do
{
double t = src1data[size.width-1];
norm += t*t;
}
while( --size.width );
}
if( mat2 )
{
const double* src2data = mat2->data.db;
size.width = size0;
do
{
double t = src1data[size.width-1] - src2data[size.width-1];
norm_diff += t*t;
}
while( --size.width );
if( is_relative )
norm = norm_diff/(norm + DBL_EPSILON);
else
norm = norm_diff;
}
norm = sqrt(norm);
EXIT;
}
}
size.height = 1;
mat1_step = mat2_step = CV_STUB_STEP;
}
else
{
mat1_step = mat1->step;
mat2_step = mat2 ? mat2->step : 0;
}
}
else if( !CV_IS_MATND(mat1) && !CV_IS_MATND(mat2) )
{
CV_CALL( mat1 = cvGetMat( mat1, &stub1, &coi ));
if( mat2 )
{
CV_CALL( mat2 = cvGetMat( mat2, &stub2, &coi2 ));
if( !CV_ARE_TYPES_EQ( mat1, mat2 ))
CV_ERROR( CV_StsUnmatchedFormats, "" );
if( !CV_ARE_SIZES_EQ( mat1, mat2 ))
CV_ERROR( CV_StsUnmatchedSizes, "" );
if( coi != coi2 && CV_MAT_CN( mat1->type ) > 1 )
CV_ERROR( CV_BadCOI, "" );
mat2_flag = mat2->type;
}
size = cvGetMatSize( mat1 );
type = CV_MAT_TYPE(mat1->type);
depth = CV_MAT_DEPTH(type);
cn = CV_MAT_CN(type);
mat1_step = mat1->step;
mat2_step = mat2 ? mat2->step : 0;
if( !mask && CV_IS_MAT_CONT( mat1->type & mat2_flag ))
{
size.width *= size.height;
size.height = 1;
mat1_step = mat2_step = CV_STUB_STEP;
}
}
else
{
CvArr* arrs[] = { mat1, mat2 };
CvMatND stubs[2];
CvNArrayIterator iterator;
int pass_hint;
if( !inittab )
{
icvInitNormTabs( norm_tab, normmask_tab );
inittab = 1;
}
if( mask )
CV_ERROR( CV_StsBadMask,
"This operation on multi-dimensional arrays does not support mask" );
CV_CALL( cvInitNArrayIterator( 1 + (mat2 != 0), arrs, 0, stubs, &iterator ));
type = CV_MAT_TYPE(iterator.hdr[0]->type);
depth = CV_MAT_DEPTH(type);
iterator.size.width *= CV_MAT_CN(type);
pass_hint = normType != 0 && (depth == CV_32F);
if( !mat2 || is_relative )
{
if( !pass_hint )
{
CvFunc2D_1A1P func;
CV_GET_FUNC_PTR( func, (CvFunc2D_1A1P)norm_tab[normType].fn_2d[depth]);
do
{
double temp = 0;
IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
iterator.size, &temp ));
norm += temp;
}
while( cvNextNArraySlice( &iterator ));
}
else
{
CvFunc2D_1A1P1I func;
CV_GET_FUNC_PTR( func, (CvFunc2D_1A1P1I)norm_tab[normType].fn_2d[depth]);
do
{
double temp = 0;
IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
iterator.size, &temp, cvAlgHintAccurate ));
norm += temp;
}
while( cvNextNArraySlice( &iterator ));
}
}
if( mat2 )
{
if( !pass_hint )
{
CvFunc2D_2A1P func;
CV_GET_FUNC_PTR( func, (CvFunc2D_2A1P)norm_tab[3 + normType].fn_2d[depth]);
do
{
double temp = 0;
IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
iterator.ptr[1], CV_STUB_STEP,
iterator.size, &temp ));
norm_diff += temp;
}
while( cvNextNArraySlice( &iterator ));
}
else
{
CvFunc2D_2A1P1I func;
CV_GET_FUNC_PTR( func, (CvFunc2D_2A1P1I)norm_tab[3 + normType].fn_2d[depth]);
do
{
double temp = 0;
IPPI_CALL( func( iterator.ptr[0], CV_STUB_STEP,
iterator.ptr[1], CV_STUB_STEP,
iterator.size, &temp, cvAlgHintAccurate ));
norm_diff += temp;
}
while( cvNextNArraySlice( &iterator ));
}
if( is_relative )
norm = norm_diff/(norm + DBL_EPSILON);
else
norm = norm_diff;
}
EXIT;
}
if( !inittab )
{
icvInitNormTabs( norm_tab, normmask_tab );
inittab = 1;
}
if( !mask )
{
if( cn == 1 || coi == 0 )
{
int pass_hint = depth == CV_32F && normType != 0;
size.width *= cn;
if( !mat2 || is_relative )
{
if( !pass_hint )
{
CvFunc2D_1A1P func;
CV_GET_FUNC_PTR( func, (CvFunc2D_1A1P)norm_tab[normType].fn_2d[depth]);
IPPI_CALL( func( mat1->data.ptr, mat1_step, size, &norm ));
}
else
{
CvFunc2D_1A1P1I func;
CV_GET_FUNC_PTR( func, (CvFunc2D_1A1P1I)norm_tab[normType].fn_2d[depth]);
IPPI_CALL( func( mat1->data.ptr, mat1_step, size, &norm, cvAlgHintAccurate ));
}
}
if( mat2 )
{
if( !pass_hint )
{
CvFunc2D_2A1P func;
CV_GET_FUNC_PTR( func, (CvFunc2D_2A1P)norm_tab[3 + normType].fn_2d[depth]);
IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
size, &norm_diff ));
}
else
{
CvFunc2D_2A1P1I func;
CV_GET_FUNC_PTR( func, (CvFunc2D_2A1P1I)norm_tab[3 + normType].fn_2d[depth]);
IPPI_CALL( func( mat1->data.ptr, mat1_step, mat2->data.ptr, mat2_step,
size, &norm_diff, cvAlgHintAccurate ));
}
if( is_relative )
norm = norm_diff/(norm + DBL_EPSILON);
else
norm = norm_diff;
}
}
else
{
if( !mat2 || is_relative )
{
CvFunc2DnC_1A1P func;
CV_GET_FUNC_PTR( func, (CvFunc2DnC_1A1P)norm_tab[6 + normType].fn_2d[depth]);
IPPI_CALL( func( mat1->data.ptr, mat1_step, size, cn, coi, &norm ));
}
if( mat2 )
{
CvFunc2DnC_2A1P func;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -