📄 cvimgwarp.c
字号:
x = load_macro(_src[sx]); \
sum += x*icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE - ifx)*2]; \
if( (unsigned)(sx = sx0 + cn*2) < (unsigned)ssize.width ) \
x = load_macro(_src[sx]); \
row[dx] = sum + x*icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE-ifx)*2+1]; \
} \
\
if( sy == 0 ) \
for( k1 = 0; k1 < k; k1++ ) \
memcpy( buf[k1], row, dsize.width*sizeof(row[0])); \
} \
\
prev_sy2 = sy2; \
\
row0 = buf[0]; row1 = buf[1]; \
row2 = buf[2]; row3 = buf[3]; \
\
w0 = icvCubicCoeffs[ify*2+1]; \
w1 = icvCubicCoeffs[ify*2]; \
w2 = icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE - ify)*2]; \
w3 = icvCubicCoeffs[(ICV_CUBIC_TAB_SIZE - ify)*2 + 1]; \
\
for( dx = 0; dx < dsize.width; dx++ ) \
{ \
worktype val = cast_macro1( row0[dx]*w0 + row1[dx]*w1 + \
row2[dx]*w2 + row3[dx]*w3 ); \
dst[dx] = cast_macro2(val); \
} \
} \
\
return CV_OK; \
}
ICV_DEF_RESIZE_BILINEAR_FUNC( 8u, uchar, int, ialpha,
ICV_WARP_MUL_ONE_8U, ICV_WARP_DESCALE_8U )
ICV_DEF_RESIZE_BILINEAR_FUNC( 16u, ushort, float, alpha, CV_NOP, cvRound )
ICV_DEF_RESIZE_BILINEAR_FUNC( 32f, float, float, alpha, CV_NOP, CV_NOP )
ICV_DEF_RESIZE_BICUBIC_FUNC( 8u, uchar, int, CV_8TO32F, cvRound, CV_CAST_8U )
ICV_DEF_RESIZE_BICUBIC_FUNC( 16u, ushort, int, CV_NOP, cvRound, CV_CAST_16U )
ICV_DEF_RESIZE_BICUBIC_FUNC( 32f, float, float, CV_NOP, CV_NOP, CV_NOP )
ICV_DEF_RESIZE_AREA_FAST_FUNC( 8u, uchar, int, cvRound )
ICV_DEF_RESIZE_AREA_FAST_FUNC( 16u, ushort, int, cvRound )
ICV_DEF_RESIZE_AREA_FAST_FUNC( 32f, float, float, CV_NOP )
ICV_DEF_RESIZE_AREA_FUNC( 8u, uchar, CV_8TO32F, cvRound )
ICV_DEF_RESIZE_AREA_FUNC( 16u, ushort, CV_NOP, cvRound )
ICV_DEF_RESIZE_AREA_FUNC( 32f, float, CV_NOP, CV_NOP )
static void icvInitResizeTab( CvFuncTable* bilin_tab,
CvFuncTable* bicube_tab,
CvFuncTable* areafast_tab,
CvFuncTable* area_tab )
{
bilin_tab->fn_2d[CV_8U] = (void*)icvResize_Bilinear_8u_CnR;
bilin_tab->fn_2d[CV_16U] = (void*)icvResize_Bilinear_16u_CnR;
bilin_tab->fn_2d[CV_32F] = (void*)icvResize_Bilinear_32f_CnR;
bicube_tab->fn_2d[CV_8U] = (void*)icvResize_Bicubic_8u_CnR;
bicube_tab->fn_2d[CV_16U] = (void*)icvResize_Bicubic_16u_CnR;
bicube_tab->fn_2d[CV_32F] = (void*)icvResize_Bicubic_32f_CnR;
areafast_tab->fn_2d[CV_8U] = (void*)icvResize_AreaFast_8u_CnR;
areafast_tab->fn_2d[CV_16U] = (void*)icvResize_AreaFast_16u_CnR;
areafast_tab->fn_2d[CV_32F] = (void*)icvResize_AreaFast_32f_CnR;
area_tab->fn_2d[CV_8U] = (void*)icvResize_Area_8u_CnR;
area_tab->fn_2d[CV_16U] = (void*)icvResize_Area_16u_CnR;
area_tab->fn_2d[CV_32F] = (void*)icvResize_Area_32f_CnR;
}
typedef CvStatus (CV_STDCALL * CvResizeBilinearFunc)
( const void* src, int srcstep, CvSize ssize,
void* dst, int dststep, CvSize dsize,
int cn, int xmax, const CvResizeAlpha* xofs,
const CvResizeAlpha* yofs, float* buf0, float* buf1 );
typedef CvStatus (CV_STDCALL * CvResizeBicubicFunc)
( const void* src, int srcstep, CvSize ssize,
void* dst, int dststep, CvSize dsize,
int cn, int xmin, int xmax,
const CvResizeAlpha* xofs, float** buf );
typedef CvStatus (CV_STDCALL * CvResizeAreaFastFunc)
( const void* src, int srcstep, CvSize ssize,
void* dst, int dststep, CvSize dsize,
int cn, const int* ofs, const int *xofs );
typedef CvStatus (CV_STDCALL * CvResizeAreaFunc)
( const void* src, int srcstep, CvSize ssize,
void* dst, int dststep, CvSize dsize,
int cn, const CvDecimateAlpha* xofs,
int xofs_count, float* buf, float* sum );
////////////////////////////////// IPP resize functions //////////////////////////////////
icvResize_8u_C1R_t icvResize_8u_C1R_p = 0;
icvResize_8u_C3R_t icvResize_8u_C3R_p = 0;
icvResize_8u_C4R_t icvResize_8u_C4R_p = 0;
icvResize_16u_C1R_t icvResize_16u_C1R_p = 0;
icvResize_16u_C3R_t icvResize_16u_C3R_p = 0;
icvResize_16u_C4R_t icvResize_16u_C4R_p = 0;
icvResize_32f_C1R_t icvResize_32f_C1R_p = 0;
icvResize_32f_C3R_t icvResize_32f_C3R_p = 0;
icvResize_32f_C4R_t icvResize_32f_C4R_p = 0;
typedef CvStatus (CV_STDCALL * CvResizeIPPFunc)
( const void* src, CvSize srcsize, int srcstep, CvRect srcroi,
void* dst, int dststep, CvSize dstroi,
double xfactor, double yfactor, int interpolation );
//////////////////////////////////////////////////////////////////////////////////////////
CV_IMPL void
cvResize( const CvArr* srcarr, CvArr* dstarr, int method )
{
static CvFuncTable bilin_tab, bicube_tab, areafast_tab, area_tab;
static int inittab = 0;
void* temp_buf = 0;
CV_FUNCNAME( "cvResize" );
__BEGIN__
CvMat srcstub, *src = (CvMat*)srcarr;
CvMat dststub, *dst = (CvMat*)dstarr;
CvSize ssize, dsize;
float scale_x, scale_y;
int k, sx, sy, dx, dy;
int type, depth, cn;
CV_CALL( src = cvGetMat( srcarr, &srcstub, 0, 0 ));
CV_CALL( dst = cvGetMat( dstarr, &dststub, 0, 0 ));
if( CV_ARE_SIZES_EQ( src, dst ))
CV_CALL( cvCopy( src, dst, 0 ));
if( !CV_ARE_TYPES_EQ( src, dst ))
CV_ERROR( CV_StsUnmatchedFormats, "" );
if( !inittab )
{
icvInitResizeTab( &bilin_tab, &bicube_tab, &areafast_tab, &area_tab );
inittab = 1;
}
ssize = cvGetMatSize( src );
dsize = cvGetMatSize( dst );
type = CV_MAT_TYPE(src->type);
depth = CV_MAT_DEPTH(type);
cn = CV_MAT_CN(type);
scale_x = (float)ssize.width/dsize.width;
scale_y = (float)ssize.height/dsize.height;
if( method == CV_INTER_CUBIC &&
(MIN(ssize.width, dsize.width) <= 4 ||
MIN(ssize.height, dsize.height) <= 4) )
method = CV_INTER_LINEAR;
if( icvResize_8u_C1R_p &&
MIN(ssize.width, dsize.width) > 4 &&
MIN(ssize.height, dsize.height) > 4 )
{
CvResizeIPPFunc ipp_func =
type == CV_8UC1 ? icvResize_8u_C1R_p :
type == CV_8UC3 ? icvResize_8u_C3R_p :
type == CV_8UC4 ? icvResize_8u_C4R_p :
type == CV_16UC1 ? icvResize_16u_C1R_p :
type == CV_16UC3 ? icvResize_16u_C3R_p :
type == CV_16UC4 ? icvResize_16u_C4R_p :
type == CV_32FC1 ? icvResize_32f_C1R_p :
type == CV_32FC3 ? icvResize_32f_C3R_p :
type == CV_32FC4 ? icvResize_32f_C4R_p : 0;
if( ipp_func && (CV_INTER_NN < method && method < CV_INTER_AREA))
{
int srcstep = src->step ? src->step : CV_STUB_STEP;
int dststep = dst->step ? dst->step : CV_STUB_STEP;
IPPI_CALL( ipp_func( src->data.ptr, ssize, srcstep,
cvRect(0,0,ssize.width,ssize.height),
dst->data.ptr, dststep, dsize,
(double)dsize.width/ssize.width,
(double)dsize.height/ssize.height, 1 << method ));
EXIT;
}
}
if( method == CV_INTER_NN )
{
IPPI_CALL( icvResize_NN_8u_C1R( src->data.ptr, src->step, ssize,
dst->data.ptr, dst->step, dsize,
CV_ELEM_SIZE(src->type)));
}
else if( method == CV_INTER_LINEAR || method == CV_INTER_AREA )
{
if( method == CV_INTER_AREA &&
ssize.width >= dsize.width && ssize.height >= dsize.height )
{
// "area" method for (scale_x > 1 & scale_y > 1)
int iscale_x = cvRound(scale_x);
int iscale_y = cvRound(scale_y);
if( fabs(scale_x - iscale_x) < DBL_EPSILON &&
fabs(scale_y - iscale_y) < DBL_EPSILON )
{
int area = iscale_x*iscale_y;
int srcstep = src->step / CV_ELEM_SIZE(depth);
int* ofs = (int*)cvStackAlloc( (area + dsize.width*cn)*sizeof(int) );
int* xofs = ofs + area;
CvResizeAreaFastFunc func = (CvResizeAreaFastFunc)areafast_tab.fn_2d[depth];
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
for( sy = 0, k = 0; sy < iscale_y; sy++ )
for( sx = 0; sx < iscale_x; sx++ )
ofs[k++] = sy*srcstep + sx*cn;
for( dx = 0; dx < dsize.width; dx++ )
{
sx = dx*iscale_x*cn;
for( k = 0; k < cn; k++ )
xofs[dx*cn + k] = sx + k;
}
IPPI_CALL( func( src->data.ptr, src->step, ssize, dst->data.ptr,
dst->step, dsize, cn, ofs, xofs ));
}
else
{
int buf_len = dsize.width*cn + 4, buf_size, xofs_count = 0;
float scale = 1.f/(scale_x*scale_y);
float *buf, *sum;
CvDecimateAlpha* xofs;
CvResizeAreaFunc func = (CvResizeAreaFunc)area_tab.fn_2d[depth];
if( !func || cn > 4 )
CV_ERROR( CV_StsUnsupportedFormat, "" );
buf_size = buf_len*2*sizeof(float) + ssize.width*2*sizeof(CvDecimateAlpha);
if( buf_size < CV_MAX_LOCAL_SIZE )
buf = (float*)cvStackAlloc(buf_size);
else
CV_CALL( temp_buf = buf = (float*)cvAlloc(buf_size));
sum = buf + buf_len;
xofs = (CvDecimateAlpha*)(sum + buf_len);
for( dx = 0, k = 0; dx < dsize.width; dx++ )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -