cvabsdiff.cpp.svn-base

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

SVN-BASE
639
字号
    CvSize size;

    if( !inittab )
    {
        icvInitAbsDiffCTable( &adiffs_tab );
        inittab = 1;
    }

    CV_CALL( src = cvGetMat( src, &srcstub, &coi1 ));
    CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 ));

    if( coi1 != 0 || coi2 != 0 )
        CV_ERROR( CV_BadCOI, "" );

    if( !CV_ARE_TYPES_EQ(src, dst) )
        CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats );

    if( !CV_ARE_SIZES_EQ(src, dst) )
        CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes );

    sctype = type = CV_MAT_TYPE( src->type );
    if( CV_MAT_DEPTH(type) < CV_32S )
        sctype = (type & CV_MAT_CN_MASK) | CV_32SC1;
 
    size = icvGetMatSize( src );
    size.width *= CV_MAT_CN( type );

    src_step = src->step;
    dst_step = dst->step;

    if( CV_IS_MAT_CONT( src->type & dst->type ))
    {
        size.width *= size.height;
        size.height = 1;
        src_step = dst_step = CV_STUB_STEP;
    }

    CV_CALL( cvScalarToRawData( &scalar, buf, sctype, 1 ));

    {
        CvFunc2D_2A1P func = (CvFunc2D_2A1P)
            (adiffs_tab.fn_2d[CV_MAT_DEPTH(type)]);

        if( !func )
            CV_ERROR( CV_StsUnsupportedFormat, "" );

        IPPI_CALL( func( src->data.ptr, src_step, dst->data.ptr,
                         dst_step, size, buf ));
    }

    __END__;
}



/* 
   Finds L1 norm between two blocks.
*/
int
icvCmpBlocksL1_8u_C1( const uchar * vec1, const uchar * vec2, int len )
{
    int i, sum = 0;

    for( i = 0; i <= len - 4; i += 4 )
    {
        int t0 = vec1[i] - vec2[i];
        int t1 = vec1[i + 1] - vec2[i + 1];
        int t2 = vec1[i + 2] - vec2[i + 2];
        int t3 = vec1[i + 3] - vec2[i + 3];

        sum += CV_IABS( t0 ) + CV_IABS( t1 ) + CV_IABS( t2 ) + CV_IABS( t3 );
    }

    for( ; i < len; i++ )
    {
        int t0 = vec1[i] - vec2[i];

        sum += CV_IABS( t0 );
    }

    return sum;
}


int64
icvCmpBlocksL2_8u_C1( const uchar * vec1, const uchar * vec2, int len )
{
    int i, s = 0;
    int64 sum = 0;

    for( i = 0; i <= len - 4; i += 4 )
    {
        int v = vec1[i] - vec2[i];
        int e = v * v;

        v = vec1[i + 1] - vec2[i + 1];
        e += v * v;
        v = vec1[i + 2] - vec2[i + 2];
        e += v * v;
        v = vec1[i + 3] - vec2[i + 3];
        e += v * v;
        sum += e;
    }

    for( ; i < len; i++ )
    {
        int v = vec1[i] - vec2[i];

        s += v * v;
    }

    return sum + s;
}


int64
icvCmpBlocksL2_8s_C1( const char *vec1, const char *vec2, int len )
{
    int i, s = 0;
    int64 sum = 0;

    for( i = 0; i <= len - 4; i += 4 )
    {
        int v = vec1[i] - vec2[i];
        int e = v * v;

        v = vec1[i + 1] - vec2[i + 1];
        e += v * v;
        v = vec1[i + 2] - vec2[i + 2];
        e += v * v;
        v = vec1[i + 3] - vec2[i + 3];
        e += v * v;
        sum += e;
    }

    for( ; i < len; i++ )
    {
        int v = vec1[i] - vec2[i];

        s += v * v;
    }

    return sum + s;
}


double
icvCmpBlocksL2_32f_C1( const float *vec1, const float *vec2, int len )
{
    double sum = 0;
    int i;

    for( i = 0; i <= len - 4; i += 4 )
    {
        double v0 = vec1[i] - vec2[i];
        double v1 = vec1[i + 1] - vec2[i + 1];
        double v2 = vec1[i + 2] - vec2[i + 2];
        double v3 = vec1[i + 3] - vec2[i + 3];

        sum += v0 * v0 + v1 * v1 + v2 * v2 + v3 * v3;
    }
    for( ; i < len; i++ )
    {
        double v = vec1[i] - vec2[i];

        sum += v * v;
    }
    return sum;
}


/* 
   Calculates cross correlation for two blocks.
*/
int64
icvCrossCorr_8u_C1( const uchar * vec1, const uchar * vec2, int len )
{
    int i, s = 0;
    int64 sum = 0;

    for( i = 0; i <= len - 4; i += 4 )
    {
        int e = vec1[i] * vec2[i];
        int v = vec1[i + 1] * vec2[i + 1];

        e += v;
        v = vec1[i + 2] * vec2[i + 2];
        e += v;
        v = vec1[i + 3] * vec2[i + 3];
        e += v;
        sum += e;
    }

    for( ; i < len; i++ )
    {
        s += vec1[i] * vec2[i];
    }

    return sum + s;
}


int64
icvCrossCorr_8s_C1( const char *vec1, const char *vec2, int len )
{
    int i, s = 0;
    int64 sum = 0;

    for( i = 0; i <= len - 4; i += 4 )
    {
        int e = vec1[i] * vec2[i];
        int v = vec1[i + 1] * vec2[i + 1];

        e += v;
        v = vec1[i + 2] * vec2[i + 2];
        e += v;
        v = vec1[i + 3] * vec2[i + 3];
        e += v;
        sum += e;
    }

    for( ; i < len; i++ )
    {
        s += vec1[i] * vec2[i];
    }

    return sum + s;
}


double
icvCrossCorr_32f_C1( const float *vec1, const float *vec2, int len )
{
    double sum = 0;
    int i;

    for( i = 0; i <= len - 4; i += 4 )
    {
        double v0 = vec1[i] * vec2[i];
        double v1 = vec1[i + 1] * vec2[i + 1];
        double v2 = vec1[i + 2] * vec2[i + 2];
        double v3 = vec1[i + 3] * vec2[i + 3];

        sum += v0 + v1 + v2 + v3;
    }
    for( ; i < len; i++ )
    {
        double v = vec1[i] * vec2[i];

        sum += v;
    }
    return sum;
}


/* 
   Calculates cross correlation for two blocks.
*/
int64
icvSumPixels_8u_C1( const uchar * vec, int len )
{
    int i, s = 0;
    int64 sum = 0;

    for( i = 0; i <= len - 4; i += 4 )
    {
        sum += vec[i] + vec[i + 1] + vec[i + 2] + vec[i + 3];
    }

    for( ; i < len; i++ )
    {
        s += vec[i];
    }

    return sum + s;
}


int64
icvSumPixels_8s_C1( const char *vec, int len )
{
    int i, s = 0;
    int64 sum = 0;

    for( i = 0; i <= len - 4; i += 4 )
    {
        sum += vec[i] + vec[i + 1] + vec[i + 2] + vec[i + 3];
    }

    for( ; i < len; i++ )
    {
        s += vec[i];
    }

    return sum + s;
}


double
icvSumPixels_32f_C1( const float *vec, int len )
{
    double sum = 0;
    int i;

    for( i = 0; i <= len - 4; i += 4 )
    {
        sum += vec[i] + vec[i + 1] + vec[i + 2] + vec[i + 3];
    }

    for( ; i < len; i++ )
    {
        sum += vec[i];
    }
    return sum;
}


/* End of file. */

⌨️ 快捷键说明

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