📄 cvimgwarp.cpp
字号:
worktype t = _src[sx]; \
_buf[dx] = mul_one_macro(t) + fx*(_src[sx+cn] - t); \
} \
\
for( ; dx < dsize.width; dx++ ) \
_buf[dx] = mul_one_macro(_src[xofs[dx].idx]); \
} \
\
prev_sy0 = sy0; \
prev_sy1 = sy1; \
\
if( sy0 == sy1 ) \
for( dx = 0; dx < dsize.width; dx++ ) \
dst[dx] = (arrtype)descale_macro( mul_one_macro(buf0[dx])); \
else \
for( dx = 0; dx < dsize.width; dx++ ) \
dst[dx] = (arrtype)descale_macro( mul_one_macro(buf0[dx]) + \
fy*(buf1[dx] - buf0[dx])); \
} \
\
return CV_OK; \
}
typedef struct CvDecimateAlpha
{
int si, di;
float alpha;
}
CvDecimateAlpha;
#define ICV_DEF_RESIZE_AREA_FAST_FUNC( flavor, arrtype, worktype, cast_macro ) \
static CvStatus CV_STDCALL \
icvResize_AreaFast_##flavor##_CnR( const arrtype* src, int srcstep, CvSize ssize,\
arrtype* dst, int dststep, CvSize dsize, int cn, \
const int* ofs, const int* xofs ) \
{ \
int dy, dx, k = 0; \
int scale_x = ssize.width/dsize.width; \
int scale_y = ssize.height/dsize.height; \
int area = scale_x*scale_y; \
float scale = 1.f/(scale_x*scale_y); \
\
srcstep /= sizeof(src[0]); \
dststep /= sizeof(dst[0]); \
dsize.width *= cn; \
\
for( dy = 0; dy < dsize.height; dy++, dst += dststep ) \
for( dx = 0; dx < dsize.width; dx++ ) \
{ \
const arrtype* _src = src + dy*scale_y*srcstep + xofs[dx]; \
worktype sum = 0; \
\
for( k = 0; k <= area - 4; k += 4 ) \
sum += _src[ofs[k]] + _src[ofs[k+1]] + \
_src[ofs[k+2]] + _src[ofs[k+3]]; \
\
for( ; k < area; k++ ) \
sum += _src[ofs[k]]; \
\
dst[dx] = (arrtype)cast_macro( sum*scale ); \
} \
\
return CV_OK; \
}
#define ICV_DEF_RESIZE_AREA_FUNC( flavor, arrtype, load_macro, cast_macro ) \
static CvStatus CV_STDCALL \
icvResize_Area_##flavor##_CnR( const arrtype* src, int srcstep, CvSize ssize, \
arrtype* dst, int dststep, CvSize dsize, \
int cn, const CvDecimateAlpha* xofs, \
int xofs_count, float* buf, float* sum ) \
{ \
int k, sy, dx, cur_dy = 0; \
float scale_y = (float)ssize.height/dsize.height; \
\
srcstep /= sizeof(src[0]); \
dststep /= sizeof(dst[0]); \
dsize.width *= cn; \
\
for( sy = 0; sy < ssize.height; sy++, src += srcstep ) \
{ \
if( cn == 1 ) \
for( k = 0; k < xofs_count; k++ ) \
{ \
int dxn = xofs[k].di; \
float alpha = xofs[k].alpha; \
buf[dxn] = buf[dxn] + load_macro(src[xofs[k].si])*alpha; \
} \
else if( cn == 2 ) \
for( k = 0; k < xofs_count; k++ ) \
{ \
int sxn = xofs[k].si; \
int dxn = xofs[k].di; \
float alpha = xofs[k].alpha; \
float t0 = buf[dxn] + load_macro(src[sxn])*alpha; \
float t1 = buf[dxn+1] + load_macro(src[sxn+1])*alpha; \
buf[dxn] = t0; buf[dxn+1] = t1; \
} \
else if( cn == 3 ) \
for( k = 0; k < xofs_count; k++ ) \
{ \
int sxn = xofs[k].si; \
int dxn = xofs[k].di; \
float alpha = xofs[k].alpha; \
float t0 = buf[dxn] + load_macro(src[sxn])*alpha; \
float t1 = buf[dxn+1] + load_macro(src[sxn+1])*alpha; \
float t2 = buf[dxn+2] + load_macro(src[sxn+2])*alpha; \
buf[dxn] = t0; buf[dxn+1] = t1; buf[dxn+2] = t2; \
} \
else \
for( k = 0; k < xofs_count; k++ ) \
{ \
int sxn = xofs[k].si; \
int dxn = xofs[k].di; \
float alpha = xofs[k].alpha; \
float t0 = buf[dxn] + load_macro(src[sxn])*alpha; \
float t1 = buf[dxn+1] + load_macro(src[sxn+1])*alpha; \
buf[dxn] = t0; buf[dxn+1] = t1; \
t0 = buf[dxn+2] + load_macro(src[sxn+2])*alpha; \
t1 = buf[dxn+3] + load_macro(src[sxn+3])*alpha; \
buf[dxn+2] = t0; buf[dxn+3] = t1; \
} \
\
if( (cur_dy + 1)*scale_y <= sy + 1 || sy == ssize.height - 1 ) \
{ \
float beta = sy + 1 - (cur_dy+1)*scale_y, beta1; \
beta = MAX( beta, 0 ); \
beta1 = 1 - beta; \
if( fabs(beta) < 1e-3 ) \
for( dx = 0; dx < dsize.width; dx++ ) \
{ \
dst[dx] = (arrtype)cast_macro(sum[dx] + buf[dx]); \
sum[dx] = buf[dx] = 0; \
} \
else \
for( dx = 0; dx < dsize.width; dx++ ) \
{ \
dst[dx] = (arrtype)cast_macro(sum[dx] + buf[dx]*beta1); \
sum[dx] = buf[dx]*beta; \
buf[dx] = 0; \
} \
dst += dststep; \
cur_dy++; \
} \
else \
for( dx = 0; dx < dsize.width; dx += 2 ) \
{ \
float t0 = sum[dx] + buf[dx]; \
float t1 = sum[dx+1] + buf[dx+1]; \
sum[dx] = t0; sum[dx+1] = t1; \
buf[dx] = buf[dx+1] = 0; \
} \
} \
\
return CV_OK; \
}
#define ICV_DEF_RESIZE_BICUBIC_FUNC( flavor, arrtype, worktype, load_macro, \
cast_macro1, cast_macro2 ) \
static CvStatus CV_STDCALL \
icvResize_Bicubic_##flavor##_CnR( const arrtype* src, int srcstep, CvSize ssize,\
arrtype* dst, int dststep, CvSize dsize, \
int cn, int xmin, int xmax, \
const CvResizeAlpha* xofs, float** buf ) \
{ \
float scale_y = (float)ssize.height/dsize.height; \
int dx, dy, sx, sy, sy2, ify; \
int prev_sy2 = -2; \
\
xmin *= cn; xmax *= cn; \
dsize.width *= cn; \
ssize.width *= cn; \
srcstep /= sizeof(src[0]); \
dststep /= sizeof(dst[0]); \
\
for( dy = 0; dy < dsize.height; dy++, dst += dststep ) \
{ \
float w0, w1, w2, w3; \
float fy, x, sum; \
float *row, *row0, *row1, *row2, *row3; \
int k1, k = 4; \
\
fy = dy*scale_y; \
sy = cvFloor(fy); \
fy -= sy; \
ify = cvRound(fy*ICV_CUBIC_TAB_SIZE); \
sy2 = sy + 2; \
\
if( sy2 > prev_sy2 ) \
{ \
int delta = prev_sy2 - sy + 2; \
for( k = 0; k < delta; k++ ) \
CV_SWAP( buf[k], buf[k+4-delta], row ); \
} \
\
for( sy += k - 1; k < 4; k++, sy++ ) \
{ \
const arrtype* _src = src + sy*srcstep; \
\
row = buf[k]; \
if( sy < 0 ) \
continue; \
if( sy >= ssize.height ) \
{ \
assert( k > 0 ); \
memcpy( row, buf[k-1], dsize.width*sizeof(row[0]) ); \
continue; \
} \
\
for( dx = 0; dx < xmin; dx++ ) \
{ \
int ifx = xofs[dx].ialpha, sx0 = xofs[dx].idx; \
sx = sx0 + cn*2; \
while( sx >= ssize.width ) \
sx -= cn; \
x = load_macro(_src[sx]); \
sum = x*icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE - ifx)*2 + 1]; \
if( (unsigned)(sx = sx0 + cn) < (unsigned)ssize.width ) \
x = load_macro(_src[sx]); \
sum += x*icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE - ifx)*2]; \
if( (unsigned)(sx = sx0) < (unsigned)ssize.width ) \
x = load_macro(_src[sx]); \
sum += x*icvCubicCoeffs[ifx*2]; \
if( (unsigned)(sx = sx0 - cn) < (unsigned)ssize.width ) \
x = load_macro(_src[sx]); \
row[dx] = sum + x*icvCubicCoeffs[ifx*2 + 1]; \
} \
\
for( ; dx < xmax; dx++ ) \
{ \
int ifx = xofs[dx].ialpha; \
int sx0 = xofs[dx].idx; \
row[dx] = _src[sx0 - cn]*icvCubicCoeffs[ifx*2 + 1] + \
_src[sx0]*icvCubicCoeffs[ifx*2] + \
_src[sx0 + cn]*icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE-ifx)*2] + \
_src[sx0 + cn*2]*icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE-ifx)*2+1];\
} \
\
for( ; dx < dsize.width; dx++ ) \
{ \
int ifx = xofs[dx].ialpha, sx0 = xofs[dx].idx; \
x = load_macro(_src[sx0 - cn]); \
sum = x*icvCubicCoeffs[ifx*2 + 1]; \
if( (unsigned)(sx = sx0) < (unsigned)ssize.width ) \
x = load_macro(_src[sx]); \
sum += x*icvCubicCoeffs[ifx*2]; \
if( (unsigned)(sx = sx0 + cn) < (unsigned)ssize.width ) \
x = load_macro(_src[sx]); \
sum += x*icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE - ifx)*2]; \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -