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 + -
显示快捷键?