📄 cvpyramids.c
字号:
} \
else /* Cs == 3 */ \
for( y1 = fst; y1 < lst; y1++, src += srcstep ) \
{ \
worktype *row = rows[y1]; \
\
if( size.width > PU_SZ / 2 ) \
{ \
int c; \
\
for( c = 0; c < 3; c++ ) \
{ \
/* process left & right bounds */ \
row[c] = PU_LT( src[c], src[3 + c] ); \
row[3 + c] = PU_LT_ZI( src[c], src[3 + c] ); \
row[Wn * 2 - 6 + c] = PU_RB( src[Wn - 6 + c], src[Wn - 3 + c]); \
row[Wn * 2 - 3 + c] = PU_RB_ZI( src[Wn - 3 + c] ); \
} \
/* other points */ \
for( x = 3; x < Wn - 3; x += 3 ) \
{ \
row[2 * x] = PU_FILTER( src[x - 3], src[x], src[x + 3] ); \
row[2 * x + 3] = PU_FILTER_ZI( src[x], src[x + 3] ); \
\
row[2 * x + 1] = PU_FILTER( src[x - 2], src[x + 1], src[x + 4]);\
row[2 * x + 4] = PU_FILTER_ZI( src[x + 1], src[x + 4] ); \
\
row[2 * x + 2] = PU_FILTER( src[x - 1], src[x + 2], src[x + 5]);\
row[2 * x + 5] = PU_FILTER_ZI( src[x + 2], src[x + 5] ); \
} \
} \
else /* size.width <= PU_SZ/2 */ \
{ \
int c; \
\
for( c = 0; c < 3; c++ ) \
{ \
row[c] = PU_SINGULAR( src[c] ); \
row[3 + c] = PU_SINGULAR_ZI( src[c] ); \
} \
} \
} \
\
/* second pass. Do vertical conv and write results do destination image */ \
if( y > 0 ) \
{ \
if( y < size.height - PU_SZ / 2 ) \
{ \
for( x = 0; x < Wdn; x++ ) \
{ \
dst[x] = (type)_pu_scale_( PU_FILTER( row0[x], row1[x], row2[x] )); \
dst1[x] = (type)_pu_scale_( PU_FILTER_ZI( row1[x], row2[x] )); \
} \
top_row += buffer_step; \
top_row &= top_row < pu_sz ? -1 : 0; \
} \
else /* bottom */ \
for( x = 0; x < Wdn; x++ ) \
{ \
dst[x] = (type)_pu_scale_( PU_RB( row0[x], row1[x] )); \
dst1[x] = (type)_pu_scale_( PU_RB_ZI( row1[x] )); \
} \
} \
else \
{ \
if( size.height > PU_SZ / 2 ) /* top */ \
for( x = 0; x < Wdn; x++ ) \
{ \
dst[x] = (type)_pu_scale_( PU_LT( row0[x], row1[x] )); \
dst1[x] = (type)_pu_scale_( PU_LT_ZI( row0[x], row1[x] )); \
} \
else /* size.height <= PU_SZ/2 */ \
for( x = 0; x < Wdn; x++ ) \
{ \
dst[x] = (type)_pu_scale_( PU_SINGULAR( row0[x] )); \
dst1[x] = (type)_pu_scale_( PU_SINGULAR_ZI( row0[x] )); \
} \
fst = PU_SZ - 1; \
} \
\
lst = y < size.height - PU_SZ/2 - 1 ? PU_SZ : size.height + PU_SZ/2 - y - 1; \
} \
\
return CV_OK; \
}
ICV_DEF_PYR_UP_FUNC( 8u, uchar, int, PU_SCALE_INT )
ICV_DEF_PYR_UP_FUNC( 16s, short, int, PU_SCALE_INT )
ICV_DEF_PYR_UP_FUNC( 16u, ushort, int, PU_SCALE_INT )
ICV_DEF_PYR_UP_FUNC( 32f, float, float, PU_SCALE_FLT )
ICV_DEF_PYR_UP_FUNC( 64f, double, double, PU_SCALE_FLT )
static CvStatus CV_STDCALL
icvPyrUpG5x5_GetBufSize( int roiWidth, CvDataType dataType,
int channels, int *bufSize )
{
int bufStep;
if( !bufSize )
return CV_NULLPTR_ERR;
*bufSize = 0;
if( roiWidth < 0 )
return CV_BADSIZE_ERR;
if( channels != 1 && channels != 3 )
return CV_UNSUPPORTED_CHANNELS_ERR;
bufStep = 2*roiWidth*channels;
if( dataType == cv64f )
bufStep *= sizeof(double);
else
bufStep *= sizeof(int);
*bufSize = bufStep * PU_SZ;
return CV_OK;
}
static CvStatus CV_STDCALL
icvPyrDownG5x5_GetBufSize( int roiWidth, CvDataType dataType,
int channels, int *bufSize )
{
int bufStep;
if( !bufSize )
return CV_NULLPTR_ERR;
*bufSize = 0;
if( roiWidth < 0 || (roiWidth & 1) != 0 )
return CV_BADSIZE_ERR;
if( channels != 1 && channels != 3 )
return CV_UNSUPPORTED_CHANNELS_ERR;
bufStep = 2*roiWidth*channels;
if( dataType == cv64f )
bufStep *= sizeof(double);
else
bufStep *= sizeof(int);
*bufSize = bufStep * (PD_SZ + 1);
return CV_OK;
}
/****************************************************************************************\
Downsampled image border completion
\****************************************************************************************/
#define ICV_DEF_PYR_BORDER_FUNC( flavor, arrtype, worktype, _pd_scale_ ) \
static CvStatus CV_STDCALL \
icvPyrDownBorder_##flavor##_CnR( const arrtype *src, int src_step, CvSize src_size, \
arrtype *dst, int dst_step, CvSize dst_size, int channels ) \
{ \
int local_alloc = 0; \
worktype *buf = 0, *buf0 = 0; \
const arrtype* src2; \
arrtype* dst2; \
int buf_size; \
int i, j; \
int W = src_size.width, H = src_size.height; \
int Wd = dst_size.width, Hd = dst_size.height; \
int Wd_, Hd_; \
int Wn = W*channels; \
int bufW; \
int cols, rows; /* columns and rows to modify */ \
\
assert( channels == 1 || channels == 3 ); \
\
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -