cvdistransform.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 1,028 行 · 第 1/3 页
SVN-BASE
1,028 行
int mask0, mask1, mask2;
float scale;
/* Test input data for validness */
if( !pSrc || !pDst || !pMetrics )
return CV_NULLPTR_ERR;
if( roiSize.width < 0 || roiSize.height < 0 ||
srcStep < roiSize.width || dstStep < roiSize.width * sizeof_float ||
(dstStep & (sizeof_float - 1)) != 0 )
return CV_BADSIZE_ERR;
dstStep /= sizeof_float;
mask0 = cvRound( pMetrics[0] * (1 << _CV_DIST_SHIFT) );
mask1 = cvRound( pMetrics[1] * (1 << _CV_DIST_SHIFT) );
mask2 = cvRound( pMetrics[2] * (1 << _CV_DIST_SHIFT) );
scale = (float) (1. / (1 << _CV_DIST_SHIFT));
init_distances_8uC1( pSrc, srcStep, (int *) pDst, dstStep, roiSize );
if( w < 4 || h < 4 )
{
/* ____________ Forward mask _______________ */
for( ri = 0; ri < h; ri++ )
{
for( ci = 0; ci < w; ci++ )
{
length = 1;
offset = ri * dstStep + ci;
d = (int *) pDst + offset;
buffer[0] = d[0];
if( ri == 0 )
{
if( ci == 1 )
{
_ADD_POINT( ri, ci - 1, mask0 );
}
else if( ci > 1 )
{
_ADD_POINT( ri, ci - 1, mask0 );
_ADD_POINT( ri, ci - 2, 2 * mask0 );
}
}
else if( ri == 1 )
{
if( ci == 0 )
{
_ADD_POINT( ri - 1, ci, mask0 );
}
else if( ci == 1 )
{
_ADD_POINT( ri, ci - 1, mask0 );
_ADD_POINT( ri - 1, ci, mask0 );
_ADD_POINT( ri - 1, ci - 1, mask1 );
}
else
{
_ADD_POINT( ri, ci - 1, mask0 );
_ADD_POINT( ri, ci - 2, 2 * mask0 );
_ADD_POINT( ri - 1, ci, mask0 );
_ADD_POINT( ri - 1, ci - 1, mask1 );
_ADD_POINT( ri - 1, ci - 2, mask2 );
}
if( ci == w - 2 )
{
_ADD_POINT( ri - 1, ci + 1, mask1 );
}
else if( ci < w - 2 )
{
_ADD_POINT( ri - 1, ci + 1, mask1 );
_ADD_POINT( ri - 1, ci + 2, mask2 );
}
}
else
{
if( ci == 0 )
{
_ADD_POINT( ri - 1, ci, mask0 );
_ADD_POINT( ri - 2, ci, 2 * mask0 );
}
else if( ci == 1 )
{
_ADD_POINT( ri, ci - 1, mask0 );
_ADD_POINT( ri - 1, ci, mask0 );
_ADD_POINT( ri - 1, ci - 1, mask1 );
_ADD_POINT( ri - 2, ci, 2 * mask0 );
_ADD_POINT( ri - 2, ci - 1, mask2 );
}
else
{
_ADD_POINT( ri, ci - 1, mask0 );
_ADD_POINT( ri, ci - 2, 2 * mask0 );
_ADD_POINT( ri - 1, ci, mask0 );
_ADD_POINT( ri - 1, ci - 1, mask1 );
_ADD_POINT( ri - 1, ci - 2, mask2 );
_ADD_POINT( ri - 2, ci, 2 * mask0 );
_ADD_POINT( ri - 2, ci - 1, mask2 );
_ADD_POINT( ri - 2, ci - 2, 2 * mask1 );
}
if( ci == w - 2 )
{
_ADD_POINT( ri - 1, ci + 1, mask1 );
_ADD_POINT( ri - 2, ci + 1, mask2 );
}
else if( ci < w - 2 )
{
_ADD_POINT( ri - 1, ci + 1, mask1 );
_ADD_POINT( ri - 1, ci + 2, mask2 );
_ADD_POINT( ri - 2, ci + 1, mask2 );
_ADD_POINT( ri - 2, ci + 2, 2 * mask1 );
}
}
d[0] = _MINn( buffer, length );
}
}
/* ____________ Backward mask _______________ */
for( ri = h - 1; ri >= 0; ri-- )
{
for( ci = w - 1; ci >= 0; ci-- )
{
length = 1;
offset = ri * dstStep + ci;
d = (int *) pDst + offset;
buffer[0] = d[0];
if( ri == h - 1 )
{
if( ci == w - 2 )
{
_ADD_POINT( ri, ci + 1, mask0 );
}
else if( ci < w - 2 )
{
_ADD_POINT( ri, ci + 1, mask0 );
_ADD_POINT( ri, ci + 2, 2 * mask0 );
}
}
else if( ri == h - 2 )
{
if( ci == w - 1 )
{
_ADD_POINT( ri + 1, ci, mask0 );
}
else if( ci == w - 2 )
{
_ADD_POINT( ri, ci + 1, mask0 );
_ADD_POINT( ri + 1, ci, mask0 );
_ADD_POINT( ri + 1, ci + 1, mask1 );
}
else
{
_ADD_POINT( ri, ci + 1, mask0 );
_ADD_POINT( ri, ci + 2, 2 * mask0 );
_ADD_POINT( ri + 1, ci, mask0 );
_ADD_POINT( ri + 1, ci + 1, mask1 );
_ADD_POINT( ri + 1, ci + 2, mask2 );
}
if( ci == 1 )
{
_ADD_POINT( ri + 1, ci - 1, mask1 );
}
else if( ci > 1 )
{
_ADD_POINT( ri + 1, ci - 1, mask1 );
_ADD_POINT( ri + 1, ci - 2, mask2 );
}
}
else
{
if( ci == w - 1 )
{
_ADD_POINT( ri + 1, ci, mask0 );
_ADD_POINT( ri + 2, ci, 2 * mask0 );
}
else if( ci == w - 2 )
{
_ADD_POINT( ri, ci + 1, mask0 );
_ADD_POINT( ri + 1, ci, mask0 );
_ADD_POINT( ri + 1, ci + 1, mask1 );
_ADD_POINT( ri + 2, ci, 2 * mask0 );
_ADD_POINT( ri + 2, ci + 1, mask2 );
}
else
{
_ADD_POINT( ri, ci + 1, mask0 );
_ADD_POINT( ri, ci + 2, 2 * mask0 );
_ADD_POINT( ri + 1, ci, mask0 );
_ADD_POINT( ri + 1, ci + 1, mask1 );
_ADD_POINT( ri + 1, ci + 2, mask2 );
_ADD_POINT( ri + 2, ci, 2 * mask0 );
_ADD_POINT( ri + 2, ci + 1, mask2 );
_ADD_POINT( ri + 2, ci + 2, 2 * mask1 );
}
if( ci == 1 )
{
_ADD_POINT( ri + 1, ci - 1, mask1 );
_ADD_POINT( ri + 2, ci - 1, mask2 );
}
else if( ci > 1 )
{
_ADD_POINT( ri + 1, ci - 1, mask1 );
_ADD_POINT( ri + 1, ci - 2, mask2 );
_ADD_POINT( ri + 2, ci - 1, mask2 );
_ADD_POINT( ri + 2, ci - 2, 2 * mask1 );
}
}
d[0] = _MINn( buffer, length );
}
}
goto func_exit;
}
/* ____________ Forward mask _______________ */
/* ri = 0, ci = 0: do nothing */
/* ri = 0, ci = 1 */
t1 = *(int *) &_POINT( 0, 1 );
_F2I( t2, _POINT( 0, 0 ) + mask0 );
CALC_MIN( t1, t2 );
_I2F( _POINT( 0, 1 ), t1 );
/* ri = 0, 1 < ci < w */
for( ci = 2; ci < w; ci++ )
{
t1 = *(int *) &_POINT( 0, ci );
_F2I( t2, _POINT( 0, ci - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_I2F( _POINT( 0, ci ), t1 );
}
/* ri = 1, ci = 0 */
t1 = *(int *) &_POINT( 1, 0 );
_F2I( t2, _POINT( 0, 0 ) + mask0 );
CALC_MIN(t1, t2);
_F2I( t2, _POINT( 0, 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, 2 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( 1, 0 ), t1 );
/* ri = 1, ci = 1 */
t1 = *(int *) &_POINT( 1, 1 );
_F2I( t2, _POINT( 0, 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, 2 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, 3 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, 0 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 1, 0 ) + mask0 );
CALC_MIN( t1, t2 );
_I2F( _POINT( 1, 1 ), t1 );
/* ri = 1, 1 < ci < w - 2 */
for( ci = 2; ci < w - 2; ci++ )
{
t1 = *(int *) &_POINT( 1, ci );
_F2I( t2, _POINT( 0, ci ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, ci + 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, ci + 2 ) + mask2 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, ci - 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 1, ci - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, ci - 2 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( 1, ci ), t1 );
}
/* ri = 1, ci = w - 2 */
t1 = *(int *) &_POINT( 1, w - 2 );
_F2I( t2, _POINT( 0, w - 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, w - 1 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, w - 3 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 1, w - 3 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, w - 4 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( 1, w - 2 ), t1 );
/* ri = 1, ci = w - 1 */
t1 = *(int *) &_POINT( 1, w - 1 );
_F2I( t2, _POINT( 0, w - 1 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, w - 2 ) + mask1 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 1, w - 2 ) + mask0 );
CALC_MIN( t1, t2 );
_F2I( t2, _POINT( 0, w - 3 ) + mask2 );
CALC_MIN( t1, t2 );
_I2F( _POINT( 1, w - 1 ), t1 )
/* 1 < ri < h */
for( ri = 2; ri < h; ri++ )
{
/* ci = 0 */
t1 = *(int *) &_POINT( ri, 0 );
_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 );
/* ci = 1 */
t1 = *(int *) &_POINT( ri, 1 );
_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, 0 ) + mask0 );
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 );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?