cvsmooth.cpp.svn-base

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

SVN-BASE
1,957
字号
                    CvRGBA8u pix = ((CvRGBA8u *) tsrc)[ker_x];
                    CV_SET( (CvRGBA8u *) tsrc, pix, ker_x, x );

                    pix = ((CvRGBA8u *) tsrc)[width + ker_x - 1];
                    CV_SET( (CvRGBA8u *) tsrc + width + ker_x, pix, ker_right, x );

                    /* horizontal blurring */
                    if( ker_width == 3 )
                    {
                        for( i = 0; i < width_n; i += 3 )
                        {
                            int t0 = tsrc[i + 4]*2 + tsrc[i] + tsrc[i+8];
                            int t1 = tsrc[i + 5]*2 + tsrc[i+1] + tsrc[i+9];
                            int t2 = tsrc[i + 6]*2 + tsrc[i+2] + tsrc[i+10];
                            int t3 = tsrc[i + 7]*2 + tsrc[i+3] + tsrc[i+11];

                            tdst[i] = t0;
                            tdst[i+1] = t1;
                            tdst[i+2] = t2;
                            tdst[i+3] = t3;
                        }
                    }
                    else if( ker_width == 5 )
                    {
                        for( i = 0; i < width_n; i += 3 )
                        {
                            int t0 = tsrc[i+8]*6 + (tsrc[i+4] + tsrc[i+12])*4 +
                                     tsrc[i]+tsrc[i+16];
                            int t1 = tsrc[i+9]*6 + (tsrc[i+5] + tsrc[i+13])*4 +
                                     tsrc[i+1]+tsrc[i+17];
                            int t2 = tsrc[i+10]*6 + (tsrc[i+6] + tsrc[i+14])*4 +
                                     tsrc[i+2]+tsrc[i+18];
                            int t3 = tsrc[i+11]*6 + (tsrc[i+7] + tsrc[i+15])*4 +
                                     tsrc[i+2]+tsrc[i+19];

                            tdst[i] = t0;
                            tdst[i+1] = t1;
                            tdst[i+2] = t2;
                            tdst[i+3] = t3;
                        }
                    }
                    else
                    {
                        assert( ker_width == 7 );
                        for( i = 0; i < width_n; i += 4 )
                        {
                            int t0 = tsrc[i+12]*18 + (tsrc[i+8] + tsrc[i+16])*14 +
                                     (tsrc[i+4]+tsrc[i+20])*7 + (tsrc[i] + tsrc[i+24])*2;
                            int t1 = tsrc[i+13]*18 + (tsrc[i+9] + tsrc[i+17])*14 +
                                     (tsrc[i+5]+tsrc[i+21])*7 + (tsrc[i+1] + tsrc[i+25])*2;
                            int t2 = tsrc[i+14]*18 + (tsrc[i+10] + tsrc[i+18])*14 +
                                     (tsrc[i+6]+tsrc[i+22])*7 + (tsrc[i+2] + tsrc[i+26])*2;
                            int t3 = tsrc[i+15]*18 + (tsrc[i+11] + tsrc[i+19])*14 +
                                     (tsrc[i+7]+tsrc[i+23])*7 + (tsrc[i+3] + tsrc[i+27])*2;

                            tdst[i] = t0;
                            tdst[i+1] = t1;
                            tdst[i+2] = t2;
                            tdst[i+3] = t3;
                        }
                    }
                }

                if( !need_copy )
                {
                    /* restore borders */
                    CV_COPY( src - ker_x_n, tbuf - ker_x_n, ker_x_n, x );
                    CV_COPY( src + width_n, tbuf, ker_right_n, x );
                }
            }
            else
            {
                CV_COPY( tdst, tsrc + ker_x_n, width_n, x );
            }

            if( crows < ker_height )
                src += srcStep;
        }

        if( starting_flag )
        {
            starting_flag = 0;
            trow = rows[ker_y];

            for( i = 0; i < ker_y; i++ )
            {
                tdst = rows[i];
                CV_COPY( tdst, trow, width_n, x );
            }
        }

        /* vertical convolution */
        if( crows != ker_height )
            break;

        tdst2 = dst;

        if( width_rest )
        {
            need_copy = width_n < CV_MORPH_ALIGN || y == dst_height - 1;

            if( need_copy )
                tdst2 = tbuf;
            else
                CV_COPY( tbuf + width_n, dst + width_n, CV_MORPH_ALIGN, x );
        }

        trow = rows[ker_y];

        if( ker_height == 1 )
        {
            for( x = 0; x < width_n; x += CV_MORPH_ALIGN )
            {
                int val0, val1, val2, val3;

                val0 = trow[x];
                val1 = trow[x + 1];
                val2 = trow[x + 2];
                val3 = trow[x + 3];

                tdst2[x + 0] = (uchar)((val0 + delta) >> rshift);
                tdst2[x + 1] = (uchar)((val1 + delta) >> rshift);
                tdst2[x + 2] = (uchar)((val2 + delta) >> rshift);
                tdst2[x + 3] = (uchar)((val3 + delta) >> rshift);
            }
        }
        else if( ker_height == 3 )
        {
            int *trow1 = rows[0], *trow2 = rows[2];
            
            for( x = 0; x < width_n; x += CV_MORPH_ALIGN )
            {
                int val0, val1;
                val0 = (trow[x]*2 + trow1[x] + trow2[x] + delta) >> rshift;
                val1 = (trow[x + 1]*2 + trow1[x+1] + trow2[x+1] + delta) >> rshift;
                
                tdst2[x + 0] = (uchar)val0;
                tdst2[x + 1] = (uchar)val1;
                
                val0 = (trow[x + 2]*2 + trow1[x+2] + trow2[x+2] + delta) >> rshift;
                val1 = (trow[x + 3]*2 + trow1[x+3] + trow2[x+3] + delta) >> rshift;
                
                tdst2[x + 2] = (uchar)val0;
                tdst2[x + 3] = (uchar)val1;
            }
        }
        else if( ker_height == 5 )
        {
            int *trow1 = rows[0], *trow2 = rows[1],
                *trow3 = rows[3], *trow4 = rows[4];
            
            for( x = 0; x < width_n; x++ )
            {
                int val0 = (trow[x]*6 + (trow2[x] + trow3[x])*4 +
                            trow1[x] + trow4[x] + delta) >> rshift;
                tdst2[x] = (uchar)val0;
            }
        }
        else
        {
            int *trow1 = rows[0], *trow2 = rows[1],
                *trow3 = rows[2], *trow4 = rows[4],
                *trow5 = rows[5], *trow6 = rows[6];
            
            for( x = 0; x < width_n; x++ )
            {
                int val0 = (trow[x]*18 + (trow3[x] + trow4[x])*14 +
                    (trow2[x] + trow5[x])*7 + (trow1[x] + trow6[x])*2 + delta) >> rshift;
                tdst2[x] = (uchar)val0;
            }
        }

        if( width_rest )
        {
            if( need_copy )
                CV_COPY( dst, tbuf, width_n, x );
            else
                CV_COPY( dst + width_n, tbuf + width_n, CV_MORPH_ALIGN, x );
        }

        rows[ker_y] = saved_row;

        /* rotate buffer */
        {
            int *t = rows[0];

            CV_COPY( rows, rows + 1, ker_height - 1, i );
            rows[i] = t;
            crows--;
            dst += dstStep;
        }
    }
    while( ++y < dst_height );

    roiSize->height = y;
    state->crows = crows;

    return CV_OK;
}


IPCVAPI( CvStatus,
     icvGaussianBlur_8u_CnR, ( uchar* src, int srcStep,
                               uchar* dst, int dstStep, CvSize * roiSize,
                               CvFilterState* state, int stage ));
IPCVAPI_IMPL( CvStatus,
     icvGaussianBlur_8u_CnR, ( uchar* src, int srcStep,
                               uchar* dst, int dstStep, CvSize * roiSize,
                               CvFilterState* state, int stage ))
{
    if( state->ker_width <= SMALL_GAUSSIAN_SIZE &&
        state->ker_height <= SMALL_GAUSSIAN_SIZE )
    {
        return icvGaussianBlur_small_8u_CnR( src, srcStep, dst, dstStep,
                                             roiSize, state, stage );
    }
    else
    {
        int width = roiSize->width;
        int src_height = roiSize->height;
        int dst_height = src_height;
        int x, y = 0, i;

        int ker_width = state->ker_width;
        int ker_height = state->ker_height;
        int ker_x = ker_width/2;
        int ker_y = ker_height/2;
        int ker_right = ker_width - ker_x;

        int crows = state->crows;
        float **rows = (float**)(state->rows);
        uchar *tbuf = (uchar*)(state->tbuf);
        float *trow = 0;

        int channels = state->channels;
        int ker_x_n = ker_x * channels;
        int ker_right_n = ker_right * channels;
        int width_n = width * channels;
    
        float* fmaskX = (float*)(state->ker0) + ker_x;
        float* fmaskY = (float*)(state->ker1) + ker_y;
        double fmX0 = fmaskX[0], fmY0 = fmaskY[0];

        int is_small_width = width < MAX( ker_x, ker_right );
        int starting_flag = 0;
        int width_rest = width_n & (CV_MORPH_ALIGN - 1);

        /* initialize cyclic buffer when starting */
        if( stage == CV_WHOLE || stage == CV_START )
        {
            for( i = 0; i < ker_height; i++ )
                rows[i] = (float*)(state->buffer + state->buffer_step * i);

            crows = ker_y;
            if( stage != CV_WHOLE )
                dst_height -= ker_height - ker_y - 1;
            starting_flag = 1;
        }

        if( stage == CV_END )
            dst_height += ker_height - ker_y - 1;

        do
        {
            int need_copy = is_small_width | (y == 0);
            uchar *tsrc;
            float *tdst;
            uchar *tdst2;
            float *saved_row = rows[ker_y];

            /* fill cyclic buffer - horizontal filtering */
            for( ; crows < ker_height; crows++ )
            {
                tsrc = src - ker_x_n;
                tdst = rows[crows];

                if( src_height-- <= 0 )
                {
                    if( stage != CV_WHOLE && stage != CV_END )
                        break;
                    /* duplicate last row */
                    trow = rows[crows - 1];
                    CV_COPY( tdst, trow, width_n, x );
                    continue;
                }

                need_copy |= src_height == 1;

                if( ker_width > 1 )
                {
                    if( need_copy )
                    {
                        tsrc = tbuf - ker_x_n;
                        CV_COPY( tbuf, src, width_n, x );
                    }
                    else
                    {
                        CV_COPY( tbuf - ker_x_n, src - ker_x_n, ker_x_n, x );
                        CV_COPY( tbuf, src + width_n, ker_right_n, x );
                    }

                    if( channels == 1 )
                    {
                        /* make replication borders */
                        uchar pix = tsrc[ker_x];
                        CV_SET( tsrc, pix, ker_x, x );

                        pix = tsrc[width + ker_x - 1];
                        CV_SET( tsrc + width + ker_x, pix, ker_right, x );

                        /* horizontal blurring */
                        for( i = 0; i < width_n; i++ )
                        {
                            int j;
                            double t0 = CV_8TO32F(tsrc[i + ker_x_n])*fmX0;

                            for( j = 1; j <= ker_x; j++ )
                                t0 += (CV_8TO32F(tsrc[i+ker_x_n+j]) +
                                       CV_8TO32F(tsrc[i+ker_x_n-j]))*(double)fmaskX[j];

                            ((float*)tdst)[i] = (float)t0;
                        }
                    }
                    else if( channels == 3 )
                    {
                        /* make replication borders */
                        CvRGB8u pix = ((CvRGB8u *)tsrc)[ker_x];
                        CV_SET( (CvRGB8u *) tsrc, pix, ker_x, x );

                        pix = ((CvRGB8u *) tsrc)[width + ker_x - 1];
                        CV_SET( (CvRGB8u *) tsrc + width + ker_x, pix, ker_right, x );

                        /* horizontal blurring */
                        if( ker_width == 3 )
                        {
                            for( i = 0; i < width_n; i += 3 )
                            {
                                double t0 = (tsrc[i + 3]*2 + tsrc[i] + tsrc[i+6])*0.25;
                                double t1 = (tsrc[i + 4]*2 + tsrc[i+1] + tsrc[i+7])*0.25;
                                double t2 = (tsrc[i + 5]*2 + tsrc[i+2] + tsrc[i+8])*0.25;

                                tdst[i] = (float)t0;
                                tdst[i+1] = (float)t1;
                                tdst[i+2] = (float)t2;
                            }
                        }
                        else
                        {
                            for( i = 0; i < width_n; i += 3 )
                            {
                                int j;
                                double t0 = CV_8TO32F(tsrc[i + ker_x_n])*fmX0;
                                double t1 = CV_8TO32F(tsrc[i + ker_x_n + 1])*fmX0;
                                double t2 = CV_8TO32F(tsrc[i + ker_x_n + 2])*fmX0;

                                for( j = 1; j <= ker_x; j++ )
                                {
                                    int j3 = j*3;
                                    double m = fmaskX[j];
                                    t0 += (CV_8TO32F(tsrc[i+ker_x_n+j3]) +
                                           CV_8TO32F(tsrc[i+ker_x_n-j3]))*m;
                                    t1 += (CV_8TO32F(tsrc[i+ker_x_n+j3+1]) +
                                           CV_8TO32F(tsrc[i+ker_x_n-j3+1]))*m;
                                    t2 += (CV_8TO32F(tsrc[i+ker_x_n+j3+2]) +
                                           CV_8TO32F(tsrc[i+ker_x_n-j3+2]))*m;
                                }

                                tdst[i] = (float)t0;
                                tdst[i+1] = (float)t1;
                                tdst[i+2] = (float)t2;
                            }
                        }
                    }
                    else    /* channels == 4 */
                    {
                        /* make replication borders */
                        CvRGBA8u pix = ((CvRGBA8u *) tsrc)[ker_x];
                        CV_SET( (CvRGBA8u *) tsrc, pix, ker_x, x );

                        pix = ((CvRGBA8u *) tsrc)[width + ker_x - 1];
                        CV_SET( (CvRGBA8u *) tsrc + width + ker_x, pix, ker_right, x );

                        /* horizontal blurring */
                        for( i = 0; i < width_n; i += 4 )
                        {
                            int j;
                            double t0 = CV_8TO32F(tsrc[i + ker_x_n])*fmX0;
                            double t1 = CV_8TO32F(tsrc[i + ker_x_n + 1])*fmX0;
                            double t2 = CV_8

⌨️ 快捷键说明

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