cvconvert.cpp.svn-base

来自「非结构化路识别」· SVN-BASE 代码 · 共 1,330 行 · 第 1/5 页

SVN-BASE
1,330
字号
            ICV_DEF_CVT_SCALE_CASE( int, CV_NOP, ICV_SCALE, cast_macro, \
                                    (short*&)src, iscale, ishift );     \
        }                                                               \
        else                                                            \
        {                                                               \
            ICV_DEF_CVT_SCALE_CASE( int, CV_NOP, cvRound, cast_macro,   \
                                    (short*&)src, scale, shift );       \
        }                                                               \
        break;                                                          \
    case  CV_32S:                                                       \
        ICV_DEF_CVT_SCALE_CASE( int, CV_NOP, cvRound, cast_macro,       \
                                (int*&)src, scale, shift )              \
        break;                                                          \
    case  CV_32F:                                                       \
        ICV_DEF_CVT_SCALE_CASE( int, CV_NOP, cvRound, cast_macro,       \
                                (float*&)src, scale, shift )            \
        break;                                                          \
    case  CV_64F:                                                       \
        ICV_DEF_CVT_SCALE_CASE( int, CV_NOP, cvRound, cast_macro,       \
                                (double*&)src, scale, shift )           \
        break;                                                          \
    default:                                                            \
        assert(0);                                                      \
        return CV_BADFLAG_ERR;                                          \
    }                                                                   \
                                                                        \
    return  CV_OK;                                                      \
}


#define  ICV_DEF_CVT_SCALE_FUNC_FLT( flavor, dsttype, cast_macro )      \
static  CvStatus  CV_STDCALL                                            \
icvCvtScaleTo_##flavor##_C1R( const char* src, int srcstep,             \
                              dsttype* dst, int dststep,                \
                              CvSize size, double scale, double shift,  \
                              int param )                               \
{                                                                       \
    int i, srctype = param;                                             \
    dsttype lut[256];                                                   \
                                                                        \
    switch( CV_MAT_DEPTH(srctype) )                                     \
    {                                                                   \
    case  CV_8U:                                                        \
        if( size.width*size.height >= 256 )                             \
        {                                                               \
            for( i = 0; i < 256; i++ )                                  \
            {                                                           \
                lut[i] = (dsttype)(i*scale + shift);                    \
            }                                                           \
                                                                        \
            icvLUT_Transform_##flavor##_C1R( src, srcstep, dst,         \
                                        dststep, size, lut );           \
        }                                                               \
        else                                                            \
        {                                                               \
            ICV_DEF_CVT_SCALE_CASE( dsttype, CV_8TO32F, cast_macro,     \
                                CV_NOP, (uchar*&)src, scale, shift );   \
        }                                                               \
        break;                                                          \
    case  CV_8S:                                                        \
        if( size.width*size.height >= 256 )                             \
        {                                                               \
            for( i = 0; i < 256; i++ )                                  \
            {                                                           \
                lut[i] = (dsttype)((char)i*scale + shift);              \
            }                                                           \
                                                                        \
            icvLUT_Transform_##flavor##_C1R( src, srcstep, dst,         \
                                             dststep, size, lut );      \
        }                                                               \
        else                                                            \
        {                                                               \
            ICV_DEF_CVT_SCALE_CASE( dsttype, CV_8TO32F, cast_macro,     \
                                CV_NOP, (char*&)src, scale, shift );    \
        }                                                               \
        break;                                                          \
    case  CV_16S:                                                       \
        ICV_DEF_CVT_SCALE_CASE( dsttype, CV_NOP, cast_macro, CV_NOP,    \
                                (short*&)src, scale, shift );           \
        break;                                                          \
    case  CV_32S:                                                       \
        ICV_DEF_CVT_SCALE_CASE( dsttype, CV_NOP, cast_macro, CV_NOP,    \
                                (int*&)src, scale, shift )              \
        break;                                                          \
    case  CV_32F:                                                       \
        ICV_DEF_CVT_SCALE_CASE( dsttype, CV_NOP, cast_macro, CV_NOP,    \
                                (float*&)src, scale, shift )            \
        break;                                                          \
    case  CV_64F:                                                       \
        ICV_DEF_CVT_SCALE_CASE( dsttype, CV_NOP, cast_macro, CV_NOP,    \
                                (double*&)src, scale, shift )           \
        break;                                                          \
    default:                                                            \
        assert(0);                                                      \
        return CV_BADFLAG_ERR;                                          \
    }                                                                   \
                                                                        \
    return  CV_OK;                                                      \
}


ICV_DEF_CVT_SCALE_FUNC_INT( 8u, uchar, CV_CAST_8U )
ICV_DEF_CVT_SCALE_FUNC_INT( 8s, char, CV_CAST_8S )
ICV_DEF_CVT_SCALE_FUNC_INT( 16s, short, CV_CAST_16S )
ICV_DEF_CVT_SCALE_FUNC_INT( 32s, int, CV_CAST_32S )

ICV_DEF_CVT_SCALE_FUNC_FLT( 32f, float, CV_CAST_32F )
ICV_DEF_CVT_SCALE_FUNC_FLT( 64f, double, CV_CAST_64F )

CV_DEF_INIT_FUNC_TAB_2D( CvtScaleTo, C1R )


/****************************************************************************************\
*                             Conversion w/o scaling macros                              *
\****************************************************************************************/

#define ICV_DEF_CVT_CASE_2D( src_type, dst_type, work_type, cast_macro1, cast_macro2, \
                             src_ptr, src_step, dst_ptr, dst_step, size )           \
{                                                                                   \
    for( ; (size).height--; (src_ptr) += (src_step), (dst_ptr) += (dst_step))       \
    {                                                                               \
        int i;                                                                      \
                                                                                    \
        for( i = 0; i <= (size).width - 4; i += 4 )                                 \
        {                                                                           \
            work_type t0 = cast_macro1(((src_type*)(src_ptr))[i]);                  \
            work_type t1 = cast_macro1(((src_type*)(src_ptr))[i+1]);                \
                                                                                    \
            ((dst_type*)(dst_ptr))[i] = cast_macro2(t0);                            \
            ((dst_type*)(dst_ptr))[i+1] = cast_macro2(t1);                          \
                                                                                    \
            t0 = cast_macro1(((src_type*)(src_ptr))[i+2]);                          \
            t1 = cast_macro1(((src_type*)(src_ptr))[i+3]);                          \
                                                                                    \
            ((dst_type*)(dst_ptr))[i+2] = cast_macro2(t0);                          \
            ((dst_type*)(dst_ptr))[i+3] = cast_macro2(t1);                          \
        }                                                                           \
                                                                                    \
        for( ; i < (size).width; i++ )                                              \
        {                                                                           \
            work_type t0 = cast_macro1(((src_type*)(src_ptr))[i]);                  \
            ((dst_type*)(dst_ptr))[i] = cast_macro2(t0);                            \
        }                                                                           \
    }                                                                               \
}


#define ICV_DEF_CVT_FUNC_2D( flavor, dst_type, work_type, cast_macro2,  \
                             src_depth1, src_type1, cast_macro11,       \
                             src_depth2, src_type2, cast_macro12,       \
                             src_depth3, src_type3, cast_macro13,       \
                             src_depth4, src_type4, cast_macro14,       \
                             src_depth5, src_type5, cast_macro15 )      \
IPCVAPI_IMPL( CvStatus,                                                 \
icvCvtTo_##flavor##_C1R,( const void* pSrc, int step1,                  \
                          void* pDst, int step,                         \
                          CvSize size, int param ))                     \
{                                                                       \
    int srctype = param;                                                \
    const char* src = (const char*)pSrc;                                \
    char* dst = (char*)pDst;                                            \
                                                                        \
    switch( CV_MAT_DEPTH(srctype) )                                     \
    {                                                                   \
    case src_depth1:                                                    \
        ICV_DEF_CVT_CASE_2D( src_type1, dst_type, work_type,            \
                             cast_macro11, cast_macro2,                 \
                             src, step1, dst, step, size );             \
        break;                                                          \
    case src_depth2:                                                    \
        ICV_DEF_CVT_CASE_2D( src_type2, dst_type, work_type,            \
                             cast_macro12, cast_macro2,                 \
                             src, step1, dst, step, size );             \
        break;                                                          \
    case src_depth3:                                                    \
        ICV_DEF_CVT_CASE_2D( src_type3, dst_type, work_type,            \
                             cast_macro13, cast_macro2,                 \
                             src, step1, dst, step, size );             \
        break;                                                          \
    case src_depth4:                                                    \
        ICV_DEF_CVT_CASE_2D( src_type4, dst_type, work_type,            \
                             cast_macro14, cast_macro2,                 \
                             src, step1, dst, step, size );             \
        break;                                                          \
    case src_depth5:                                                    \
        ICV_DEF_CVT_CASE_2D( src_type5, dst_type, work_type,            \
                             cast_macro15, cast_macro2,                 \
                             src, step1, dst, step, size );             \
        break;                                                          \
    }                                                                   \
                                                                        \
    return  CV_OK;                                                      \
}


ICV_DEF_CVT_FUNC_2D( 8u, uchar, int, CV_CAST_8U,
                     CV_8S,  char,   CV_NOP,
                     CV_16S, short,  CV_NOP,
                     CV_32S, int,    CV_NOP,
                     CV_32F, float,  cvRound,
                     CV_64F, double, cvRound )

ICV_DEF_CVT_FUNC_2D( 8s, char, int, CV_CAST_8S,
                     CV_8U,  uchar,  CV_NOP,
                     CV_16S, short,  CV_NOP,
                     CV_32S, int,    CV_NOP,
                     CV_32F, float,  cvRound,
                     CV_64F, double, cvRound )

ICV_DEF_CVT_FUNC_2D( 16s, short, int, CV_CAST_16S,
                     CV_8U,  uchar,  CV_NOP,
                     CV_8S,  char,   CV_NOP,
                     CV_32S, int,    CV_NOP,
                     CV_32F, float,  cvRound,
                     CV_64F, double, cvRound )

ICV_DEF_CVT_FUNC_2D( 32s, int, int, CV_NOP,
                     CV_8U,  uchar,  CV_NOP,
                     CV_8S,  char,   CV_NOP,
                     CV_16S, short,  CV_NOP,
                     CV_32F, float,  cvRound,
                     CV_64F, double, cvRound )

ICV_DEF_CVT_FUNC_2D( 32f, float, float, CV_NOP,
                     CV_8U,  uchar,  CV_8TO32F,
                     CV_8S,  char,   CV_8TO32F,
                     CV_16S, short,  CV_NOP,
                     CV_32S, int,    CV_CAST_32F,
                     CV_64F, double, CV_CAST_32F )

ICV_DEF_CVT_FUNC_2D( 64f, double, double, CV_NOP,
                     CV_8U,  uchar,  CV_8TO32F,
                     CV_8S,  char,   CV_8TO32F,
                     CV_16S, short,  CV_NOP,
                     CV_32S, int,    CV_NOP,
                     CV_32F, float,  CV_NOP )

CV_DEF_INIT_FUNC_TAB_2D( CvtTo, C1R )


typedef  CvStatus (CV_STDCALL *CvCvtFunc)( const void* src, int srcstep,
                                           void* dst, int dststep, CvSize size,
                                           int param );

typedef  CvStatus (CV_STDCALL *CvCvtScaleFunc)( const void* src, int srcstep,
                                             void* dst, int dststep, CvSize size,
                                             double scale, double shift,
                                             int param );

CV_IMPL void
cvConvertScale( const void* srcarr, void* dstarr,
                double scale, double shift )
{
    static CvFuncTable cvt_tab, cvtscale_tab;
    static int inittab = 0;
    
    CV_FUNCNAME( "cvConvertScale" );

    __BEGIN__;

    int type;
    int is_nd = 0;
    CvMat  srcstub, *src = (CvMat*)srcarr;
    CvMat  dststub, *dst = (CvMat*)dstarr;
    CvSize size;
    int src

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?