📄 cvpyramids.c
字号:
buf_size = MAX(src_size.width,src_size.height) * sizeof(buf[0]) * 2 * channels; \
if( buf_size > (1 << 14) ) \
{ \
buf = (worktype*)cvAlloc( buf_size ); \
if( !buf ) \
return CV_OUTOFMEM_ERR; \
} \
else \
{ \
buf = (worktype*)cvAlignPtr(alloca( buf_size+8 ), 8); \
local_alloc = 1; \
} \
\
buf0 = buf; \
\
src_step /= sizeof(src[0]); \
dst_step /= sizeof(dst[0]); \
\
cols = (W & 1) + (Wd*2 > W); \
rows = (H & 1) + (Hd*2 > H); \
\
src2 = src + (H-1)*src_step; \
dst2 = dst + (Hd - rows)*dst_step; \
src += (W - 1)*channels; \
dst += (Wd - cols)*channels; \
\
/* part of row(column) from 1 to Wd_(Hd_) is processed using PD_FILTER macro */ \
Wd_ = Wd - 1 + (cols == 1 && (W & 1) != 0); \
Hd_ = Hd - 1 + (rows == 1 && (H & 1) != 0); \
\
bufW = channels * cols; \
\
/******************* STAGE 1. ******************/ \
\
/* do horizontal convolution of the 1-2 right columns and write results to buffer */\
if( cols > 0 ) \
{ \
if( W <= 2 ) \
{ \
assert( Wd == 1 ); \
for( i = 0; i < H; i++, src += src_step, buf += channels ) \
{ \
if( channels == 1 ) \
buf[0] = PD_SINGULAR( src[1-Wn], src[0] ); \
else \
{ \
buf[0] = PD_SINGULAR( src[3-Wn], src[0] ); \
buf[1] = PD_SINGULAR( src[4-Wn], src[1] ); \
buf[2] = PD_SINGULAR( src[5-Wn], src[2] ); \
} \
} \
} \
else if( W == 3 && Wd == 1 || W > 3 && !(Wd & 1) ) \
{ \
for( i = 0; i < H; i++, src += src_step, buf += channels ) \
{ \
if( channels == 1 ) \
buf[0] = PD_LT( src[-2], src[-1], src[0] ); \
else \
{ \
buf[0] = PD_LT( src[-6], src[-3], src[0] ); \
buf[1] = PD_LT( src[-5], src[-2], src[1] ); \
buf[2] = PD_LT( src[-4], src[-1], src[2] ); \
} \
} \
} \
else if( W == 3 ) \
{ \
for( i = 0; i < H; i++, src += src_step, buf += channels*2 ) \
{ \
if( channels == 1 ) \
{ \
buf[0] = PD_LT( src[-2], src[-1], src[0] ); \
buf[1] = PD_LT( src[0], src[-1], src[-2] ); \
} \
else \
{ \
buf[0] = PD_LT( src[-6], src[-3], src[0] ); \
buf[1] = PD_LT( src[-5], src[-2], src[1] ); \
buf[2] = PD_LT( src[-4], src[-1], src[2] ); \
buf[3] = PD_LT( src[0], src[-3], src[-6] ); \
buf[4] = PD_LT( src[1], src[-2], src[-5] ); \
buf[5] = PD_LT( src[2], src[-1], src[-4] ); \
} \
} \
} \
else if( cols == 1 ) \
{ \
for( i = 0; i < H; i++, src += src_step, buf += channels ) \
{ \
if( channels == 1 ) \
buf[0] = PD_FILTER( src[-4], src[-3], src[-2], src[-1], src[0]); \
else \
{ \
buf[0] = PD_FILTER( src[-12], src[-9], src[-6], src[-3], src[0]); \
buf[1] = PD_FILTER( src[-11], src[-8], src[-5], src[-2], src[1]); \
buf[2] = PD_FILTER( src[-10], src[-7], src[-4], src[-1], src[2]); \
} \
} \
} \
else \
{ \
for( i = 0; i < H; i++, src += src_step, buf += channels*2 ) \
{ \
if( channels == 1 ) \
{ \
buf[0] = PD_FILTER( src[-4], src[-3], src[-2], src[-1], src[0] ); \
buf[1] = PD_LT( src[0], src[-1], src[-2] ); \
} \
else \
{ \
buf[0] = PD_FILTER( src[-12], src[-9], src[-6], src[-3], src[0] ); \
buf[1] = PD_FILTER( src[-11], src[-8], src[-5], src[-2], src[1] ); \
buf[2] = PD_FILTER( src[-10], src[-7], src[-4], src[-1], src[2] ); \
buf[3] = PD_LT( src[0], src[-3], src[-6] ); \
buf[4] = PD_LT( src[1], src[-2], src[-5] ); \
buf[5] = PD_LT( src[2], src[-1], src[-4] ); \
} \
} \
} \
buf = buf0; \
} \
\
src = src2; \
\
/******************* STAGE 2. ******************/ \
\
/* do vertical convolution of the pre-processed right columns, */ \
/* stored in buffer, and write results to the destination */ \
/* do vertical convolution of the 1-2 bottom rows */ \
/* and write results to the buffer */ \
if( H <= 2 ) \
{ \
if( cols > 0 ) \
{ \
assert( Hd == 1 ); \
for( j = 0; j < bufW; j++ ) \
dst[j] = (arrtype)_pd_scale_( PD_SINGULAR( buf[j], buf[j+(H-1)*bufW] ));\
} \
\
if( rows > 0 ) \
{ \
for( j = 0; j < Wn; j++ ) \
buf[j] = PD_SINGULAR( src[j-src_step], src[j] ); \
} \
} \
else if( H == 3 ) \
{ \
if( cols > 0 ) \
{ \
for( j = 0; j < bufW; j++ ) \
{ \
dst[j]= (arrtype)_pd_scale_(PD_LT( buf[j], buf[j+bufW], buf[j+bufW*2]));\
} \
if( Hd == 2 ) \
{ \
dst += dst_step; \
for( j = 0; j < bufW; j++ ) \
dst[j] = (arrtype)_pd_scale_( PD_LT( buf[j+bufW*2], \
buf[j+bufW], buf[j] )); \
} \
} \
\
if( Hd == 1 ) \
{ \
for( j = 0; j < Wn; j++ ) \
buf[j] = PD_LT( src[j-src_step*2], src[j - src_step], src[j] ); \
} \
else \
{ \
for( j = 0; j < Wn; j++ ) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -