cvdistransform.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 1,028 行 · 第 1/3 页
SVN-BASE
1,028 行
/* 1 < ci < w - 2 */
for( ci = 2; ci < w - 2; ci++ )
{
t1 = *(int *) &_POINT( ri, ci );
_F2I( t2, _POINT( ri, ci - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, ci ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, ci + 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, ci + 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 2, ci + 1 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, ci - 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, ci - 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 2, ci - 1 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( ri, ci ), t1 )}
/* ci = w - 2 */
t1 = *(int *) &_POINT( ri, w - 2 );
_F2I( t2, _POINT( ri - 1, w - 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, w - 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 2, w - 1 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri, w - 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, w - 3 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, w - 4 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 2, w - 3 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( ri, w - 2 ), t1 );
/* ci = w - 1 */
t1 = *(int *) &_POINT( ri, w - 1 );
_F2I( t2, _POINT( ri - 1, w - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri, w - 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, w - 2 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 1, w - 3 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri - 2, w - 2 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( ri, w - 1 ), t1 );
}
/* ____________ Backward mask _______________ */
/* ri = h - 1, ci = w - 1: do nothing */
/* ri = h - 1, ci = w - 2 */
t1 = *(int *) &_POINT( h - 1, w - 2 );
_F2I( t2, _POINT( h - 1, w - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_I2F( _POINT( h - 1, w - 2 ), t1 );
/* ri = h - 1, w - 2 > ci >= 0 */
for( ci = w - 3; ci >= 0; ci-- )
{
t1 = *(int *) &_POINT( h - 1, ci );
_F2I( t2, _POINT( h - 1, ci + 1 ) + mask0 );
CALC_MIN( t1, t2 );
_I2F( _POINT( h - 1, ci ), t1 );
}
/* ri = h - 2, ci = w - 1 */
t1 = *(int *) &_POINT( h - 2, w - 1 );
_F2I( t2, _POINT( h - 1, w - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, w - 2 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, w - 3 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( h - 2, w - 1 ), t1 );
/* ri = h - 2, ci = w - 2 */
t1 = *(int *) &_POINT( h - 2, w - 2 );
_F2I( t2, _POINT( h - 1, w - 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, w - 3 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, w - 4 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, w - 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 2, w - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_I2F( _POINT( h - 2, w - 2 ), t1 );
/* ri = h - 2, w - 2 > ci > 1 */
for( ci = w - 3; ci > 1; ci-- )
{
t1 = *(int *) &_POINT( h - 2, ci );
_F2I( t2, _POINT( h - 2, ci + 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, ci ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, ci + 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, ci + 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, ci - 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, ci - 2 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( h - 2, ci ), t1 );
}
/* ri = h - 2, ci = 1 */
t1 = *(int *) &_POINT( h - 2, 1 );
_F2I( t2, _POINT( h - 2, 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, 2 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, 3 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, 0 ) + mask1 );
CALC_MIN( t1, t2 );
_I2F( _POINT( h - 2, 1 ), t1 );
/* ri = h - 2, ci = 0 */
t1 = *(int *) &_POINT( h - 2, 0 );
_F2I( t2, _POINT( h - 2, 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( h - 1, 0 ) + mask0 );
CALC_MIN( t1, t2 );
_I2F( _POINT( h - 2, 0 ), t1 );
/* h - 2 > ri >= 0 */
for( ri = h - 3; ri >= 0; ri-- )
{
/* ci = w - 1 */
t1 = *(int *) &_POINT( ri, w - 1 );
_F2I( t2, _POINT( ri + 1, w - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, w - 2 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 2, w - 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, w - 3 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( ri, w - 1 ), t1 );
/* ci = w - 2 */
t1 = *(int *) &_POINT( ri, w - 2 );
_F2I( t2, _POINT( ri, w - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, w - 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 2, w - 1 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, w - 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, w - 3 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 2, w - 3 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, w - 4 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( ri, w - 2 ), t1 );
/* w - 2 > ci > 1 */
for( ci = w - 3; ci > 1; ci-- )
{
t1 = *(int *) &_POINT( ri, ci );
_F2I( t2, _POINT( ri, ci + 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, ci ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, ci + 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, ci + 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 2, ci + 1 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, ci - 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, ci - 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 2, ci - 1 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( ri, ci ), t1 );
}
/* ci = 1 */
t1 = *(int *) &_POINT( ri, 1 );
_F2I( t2, _POINT( ri, 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, 2 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, 3 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 2, 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, 0 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 2, 0 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( ri, 1 ), t1 );
/* ci = 0 */
t1 = *(int *) &_POINT( ri, 0 );
_F2I( t2, _POINT( ri, 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, 0 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 1, 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( ri + 2, 1 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( ri, 0 ), t1 );
}
func_exit:
icvCvtIntTofloat( (int *) pDst, dstStep, roiSize, scale );
return CV_OK;
}
IPCVAPI_IMPL( CvStatus, icvGetDistanceTransformMask, (int maskType, float *pMetrics) )
{
if( !pMetrics )
return CV_NULLPTR_ERR;
switch (maskType)
{
case 30:
pMetrics[0] = 1.0f;
pMetrics[1] = 1.0f;
break;
case 31:
pMetrics[0] = 1.0f;
pMetrics[1] = 2.0f;
break;
case 32:
pMetrics[0] = 0.955f;
pMetrics[1] = 1.3693f;
break;
case 52:
pMetrics[0] = 1.0f;
pMetrics[1] = 1.4f;
pMetrics[2] = 2.1969f;
break;
default:
return CV_BADRANGE_ERR;
}
return CV_OK;
}
/* Wrapper function for distance transform group */
CV_IMPL void
cvDistTransform( const void* srcarr, void* dstarr,
CvDisType distType, int maskSize,
const float *mask )
{
CV_FUNCNAME( "cvDistTransform" );
__BEGIN__;
float _mask[5];
CvMat srcstub, *src = (CvMat*)srcarr;
CvMat dststub, *dst = (CvMat*)dstarr;
CV_CALL( src = cvGetMat( src, &srcstub ));
CV_CALL( dst = cvGetMat( dst, &dststub ));
if( !CV_IS_MASK_ARR( src ) || CV_MAT_TYPE( dst->type ) != CV_32FC1 )
CV_ERROR( CV_StsUnsupportedFormat, "" );
if( !CV_ARE_SIZES_EQ( src, dst ))
CV_ERROR( CV_StsUnmatchedSizes, "" );
if( maskSize != CV_DIST_MASK_3 && maskSize != CV_DIST_MASK_5 )
CV_ERROR( CV_StsBadSize, "" );
if( distType == CV_DIST_C || distType == CV_DIST_L1 )
maskSize = CV_DIST_MASK_3;
if( distType == CV_DIST_C || distType == CV_DIST_L1 || distType == CV_DIST_L2 )
{
IPPI_CALL( icvGetDistanceTransformMask( distType == CV_DIST_C ? 30 :
distType == CV_DIST_L1 ? 31 :
maskSize*10 + 2, _mask ));
}
else if( distType == CV_DIST_USER )
{
if( !mask )
CV_ERROR( CV_StsNullPtr, "" );
memcpy( _mask, mask, (maskSize/2 + 1)*sizeof(float));
}
if( maskSize == CV_DIST_MASK_3 )
{
IPPI_CALL( icvDistanceTransform_3x3_8u32f_C1R
( src->data.ptr, src->step,
dst->data.fl, dst->step,
icvGetMatSize(src), _mask ));
}
else
{
IPPI_CALL( icvDistanceTransform_5x5_8u32f_C1R
( src->data.ptr, src->step,
dst->data.fl, dst->step,
icvGetMatSize(src), _mask ));
}
__END__;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?