cvsamplers.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 1,027 行 · 第 1/4 页
SVN-BASE
1,027 行
} \
\
return CV_OK; \
}
#define ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC_C3( flavor, srctype, dsttype, \
worktype, cast_macro, cvt ) \
IPCVAPI_IMPL( CvStatus, icvGetQuadrangleSubPix_##flavor##_C3R, \
( const srctype * src, int srcStep, CvSize src_size, \
dsttype *dst, int dstStep, CvSize win_size, \
const float *matrix, int fill_outliers, \
dsttype* fillval )) \
{ \
int x, y, x0, y0, x1, y1; \
float A11 = matrix[0], A12 = matrix[1], b1 = matrix[2]; \
float A21 = matrix[3], A22 = matrix[4], b2 = matrix[5]; \
int left = -(win_size.width >> 1), right = win_size.width + left - 1; \
int top = -(win_size.height >> 1), bottom = win_size.height + top - 1; \
\
srcStep /= sizeof(srctype); \
dstStep /= sizeof(dsttype); \
\
dst -= left*3; \
\
for( y = top; y <= bottom; y++, dst += dstStep ) \
{ \
float xs = GET_X( left, y ); \
float ys = GET_Y( left, y ); \
float xe = GET_X( right, y ); \
float ye = GET_Y( right, y ); \
\
if( (unsigned)cvFloor(xs) < (unsigned)(src_size.width - 1) && \
(unsigned)cvFloor(ys) < (unsigned)(src_size.height - 1) && \
(unsigned)cvFloor(xe) < (unsigned)(src_size.width - 1) && \
(unsigned)cvFloor(ye) < (unsigned)(src_size.height - 1)) \
{ \
for( x = left; x <= right; x++ ) \
{ \
worktype p0, p1; \
float a, b; \
\
int ixs = cvFloor( xs ); \
int iys = cvFloor( ys ); \
const srctype *ptr = PTR_AT( ixs*3, iys ); \
\
a = xs - ixs; \
b = ys - iys; \
\
xs += A11; \
ys += A21; \
\
p0 = cvt(ptr[0]) + a * (cvt(ptr[3]) - cvt(ptr[0])); \
p1 = cvt(ptr[srcStep]) + a * (cvt(ptr[srcStep + 3]) - \
cvt(ptr[srcStep])); \
dst[x*3] = cast_macro(p0 + b * (p1 - p0)); \
\
p0 = cvt(ptr[1]) + a * (cvt(ptr[4]) - cvt(ptr[1])); \
p1 = cvt(ptr[srcStep+1]) + a * (cvt(ptr[srcStep + 4]) - \
cvt(ptr[srcStep + 1])); \
dst[x*3+1] = cast_macro(p0 + b * (p1 - p0)); \
\
p0 = cvt(ptr[2]) + a * (cvt(ptr[5]) - cvt(ptr[2])); \
p1 = cvt(ptr[srcStep+2]) + a * (cvt(ptr[srcStep + 5]) - \
cvt(ptr[srcStep + 2])); \
dst[x*3+2] = cast_macro(p0 + b * (p1 - p0)); \
} \
} \
else \
{ \
for( x = left; x <= right; x++ ) \
{ \
worktype p0, p1; \
float a, b; \
\
int ixs = cvFloor( xs ); \
int iys = cvFloor( ys ); \
\
a = xs - ixs; \
b = ys - iys; \
\
xs += A11; \
ys += A21; \
\
if( (unsigned)ixs < (unsigned)(src_size.width - 1) && \
(unsigned)iys < (unsigned)(src_size.height - 1) ) \
{ \
const srctype *ptr = PTR_AT( ixs*3, iys ); \
\
p0 = cvt(ptr[0]) + a * (cvt(ptr[3]) - cvt(ptr[0])); \
p1 = cvt(ptr[srcStep]) + a * (cvt(ptr[srcStep + 3]) - \
cvt(ptr[srcStep]));\
dst[x*3] = cast_macro(p0 + b * (p1 - p0)); \
\
p0 = cvt(ptr[1]) + a * (cvt(ptr[4]) - cvt(ptr[1])); \
p1 = cvt(ptr[srcStep+1]) + a * (cvt(ptr[srcStep + 4]) - \
cvt(ptr[srcStep + 1])); \
dst[x*3+1] = cast_macro(p0 + b * (p1 - p0)); \
\
p0 = cvt(ptr[2]) + a * (cvt(ptr[5]) - cvt(ptr[2])); \
p1 = cvt(ptr[srcStep+2]) + a * (cvt(ptr[srcStep + 5]) - \
cvt(ptr[srcStep + 2])); \
dst[x*3+2] = cast_macro(p0 + b * (p1 - p0)); \
} \
else if( !fill_outliers ) \
{ \
/* the slowest branch */ \
worktype t0, t1; \
\
x0 = CLIP_X( ixs ); \
y0 = CLIP_Y( iys ); \
x1 = CLIP_X( ixs + 1 ); \
y1 = CLIP_Y( iys + 1 ); \
\
t0 = cvt(*PTR_AT( x0*3, y0 )); \
t1 = cvt(*PTR_AT( x1*3, y0 )); \
p0 = t0 + a * (t1 - t0); \
\
t0 = cvt(*PTR_AT( x0*3, y1 )); \
t1 = cvt(*PTR_AT( x1*3, y1 )); \
p1 = t0 + a * (t1 - t0); \
p0 = p0 + b * (p1 - p0); \
dst[x*3] = cast_macro(p0); \
\
t0 = cvt(*PTR_AT( x0*3+1, y0 )); \
t1 = cvt(*PTR_AT( x1*3+1, y0 )); \
p0 = t0 + a * (t1 - t0); \
\
t0 = cvt(*PTR_AT( x0*3+1, y1 )); \
t1 = cvt(*PTR_AT( x1*3+1, y1 )); \
p1 = t0 + a * (t1 - t0); \
p0 = p0 + b * (p1 - p0); \
dst[x*3+1] = cast_macro(p0); \
\
t0 = cvt(*PTR_AT( x0*3+2, y0 )); \
t1 = cvt(*PTR_AT( x1*3+2, y0 )); \
p0 = t0 + a * (t1 - t0); \
\
t0 = cvt(*PTR_AT( x0*3+2, y1 )); \
t1 = cvt(*PTR_AT( x1*3+2, y1 )); \
p1 = t0 + a * (t1 - t0); \
p0 = p0 + b * (p1 - p0); \
dst[x*3+2] = cast_macro(p0); \
} \
else \
{ \
dst[x*3] = fillval[0]; \
dst[x*3+1] = fillval[1]; \
dst[x*3+2] = fillval[2]; \
} \
} \
} \
} \
\
return CV_OK; \
}
#define ICV_32F8U(x) ((uchar)cvRound(x))
ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC( 8u, uchar, uchar, float, ICV_32F8U, CV_8TO32F )
ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC( 32f, float, float, float, CV_NOP, CV_NOP )
ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC( 8u32f, uchar, float, float, CV_NOP, CV_8TO32F )
ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC_C3( 8u, uchar, uchar, float, ICV_32F8U, CV_8TO32F )
ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC_C3( 32f, float, float, float, CV_NOP, CV_NOP )
ICV_DEF_GET_QUADRANGLE_SUB_PIX_FUNC_C3( 8u32f, uchar, float, float, CV_NOP, CV_8TO32F )
ICV_DEF_INIT_SUBPIX_TAB( GetQuadrangleSubPix, C1R )
ICV_DEF_INIT_SUBPIX_TAB( GetQuadrangleSubPix, C3R )
typedef CvStatus (CV_STDCALL *CvGetQuadrangleSubPixFunc)(
const void* src, int src_step,
CvSize src_size, void* dst,
int dst_step, CvSize win_size,
const float* matrix, int fill_outliers,
const void* fillvalue );
CV_IMPL void
cvGetQuadrangleSubPix( const void* srcarr, void* dstarr,
const void* matrix, int fillOutliers,
CvScalar fillValue )
{
static CvFuncTable gq_tab[2];
static int inittab = 0;
CV_FUNCNAME( "cvGetQuadrangleSubPix" );
__BEGIN__;
CvMat srcstub, *src = (CvMat*)srcarr;
CvMat dststub, *dst = (CvMat*)dstarr;
CvMat matstub, *mat = (CvMat*)matrix;
CvSize src_size, dst_size;
CvGetQuadrangleSubPixFunc func;
double buf[12];
int cn;
if( !inittab )
{
icvInitGetQuadrangleSubPixC1RTable( gq_tab + 0 );
icvInitGetQuadrangleSubPixC3RTable( gq_tab + 1 );
inittab = 1;
}
if( !CV_IS_MAT(src))
CV_CALL( src = cvGetMat( src, &srcstub ));
if( !CV_IS_MAT(dst))
CV_CALL( dst = cvGetMat( dst, &dststub ));
if( !CV_IS_MAT(mat))
CV_CALL( mat = cvGetMat( mat, &matstub ));
cn = CV_MAT_CN( src->type );
if( (cn != 1 && cn != 3) || !CV_ARE_CNS_EQ( src, dst ))
CV_ERROR( CV_StsUnsupportedFormat, "" );
src_size = icvGetMatSize( src );
dst_size = icvGetMatSize( dst );
/*if( dst_size.width > src_size.width || dst_size.height > src_size.height )
CV_ERROR( CV_StsBadSize, "destination ROI must not be larger than source ROI" );*/
CV_CALL( cvScalarToRawData( &fillValue, buf, dst->type, 1 ));
if( !CV_IS_MAT_CONT( mat->type ) ||
CV_MAT_DEPTH( mat->type ) != CV_32F ||
mat->width*mat->height != 6 )
CV_ERROR( CV_StsBadArg, "Matrix argument must be continuous array of 6 floats" );
if( CV_ARE_DEPTHS_EQ( src, dst ))
{
func = (CvGetQuadrangleSubPixFunc)(gq_tab[cn != 1].fn_2d[CV_MAT_DEPTH(src->type)]);
}
else
{
if( CV_MAT_DEPTH( src->type ) != CV_8U || CV_MAT_DEPTH( dst->type ) != CV_32F )
CV_ERROR( CV_StsUnsupportedFormat, "" );
func = (CvGetQuadrangleSubPixFunc)(gq_tab[cn != 1].fn_2d[1]);
}
if( !func )
CV_ERROR( CV_StsUnsupportedFormat, "" );
IPPI_CALL( func( src->data.ptr, src->step, src_size,
dst->data.ptr, dst->step, dst_size,
mat->data.fl, fillOutliers, buf ));
__END__;
}
/* End of file. */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?