diff --git a/modules/imgproc/src/pyramids.cpp b/modules/imgproc/src/pyramids.cpp index 7b817d8887..6fb61bf6cd 100644 --- a/modules/imgproc/src/pyramids.cpp +++ b/modules/imgproc/src/pyramids.cpp @@ -741,13 +741,13 @@ pyrDown_( const Mat& _src, Mat& _dst, int borderType ) CV_Assert( ssize.width > 0 && ssize.height > 0 && std::abs(dsize.width*2 - ssize.width) <= 2 && std::abs(dsize.height*2 - ssize.height) <= 2 ); - int k, x, sy0 = -PD_SZ/2, sy = sy0, width0 = std::min((ssize.width-PD_SZ/2-1)/2 + 1, dsize.width); + int sy0 = -PD_SZ/2, sy = sy0, width0 = std::min((ssize.width-PD_SZ/2-1)/2 + 1, dsize.width); - for( x = 0; x <= PD_SZ+1; x++ ) + for (int x = 0; x <= PD_SZ+1; x++) { int sx0 = borderInterpolate(x - PD_SZ/2, ssize.width, borderType)*cn; int sx1 = borderInterpolate(x + width0*2 - PD_SZ/2, ssize.width, borderType)*cn; - for( k = 0; k < cn; k++ ) + for (int k = 0; k < cn; k++) { tabL[x*cn + k] = sx0 + k; tabR[x*cn + k] = sx1 + k; @@ -758,10 +758,10 @@ pyrDown_( const Mat& _src, Mat& _dst, int borderType ) dsize.width *= cn; width0 *= cn; - for( x = 0; x < dsize.width; x++ ) + for (int x = 0; x < dsize.width; x++) tabM[x] = (x/cn)*2*cn + x % cn; - for( int y = 0; y < dsize.height; y++ ) + for (int y = 0; y < dsize.height; y++) { T* dst = _dst.ptr(y); WT *row0, *row1, *row2, *row3, *row4; @@ -772,15 +772,13 @@ pyrDown_( const Mat& _src, Mat& _dst, int borderType ) WT* row = buf + ((sy - sy0) % PD_SZ)*bufstep; int _sy = borderInterpolate(sy, ssize.height, borderType); const T* src = _src.ptr(_sy); - int limit = cn; - const int* tab = tabL; - for( x = 0;;) - { - for( ; x < limit; x++ ) + do { + int x = 0; + for( ; x < cn; x++ ) { - row[x] = src[tab[x+cn*2]]*6 + (src[tab[x+cn]] + src[tab[x+cn*3]])*4 + - src[tab[x]] + src[tab[x+cn*4]]; + row[x] = src[tabL[x+cn*2]]*6 + (src[tabL[x+cn]] + src[tabL[x+cn*3]])*4 + + src[tabL[x]] + src[tabL[x+cn*4]]; } if( x == dsize.width ) @@ -840,18 +838,22 @@ pyrDown_( const Mat& _src, Mat& _dst, int borderType ) } } - limit = dsize.width; - tab = tabR - x; - } + // tabR + for (int x_ = 0; x < dsize.width; x++, x_++) + { + row[x] = src[tabR[x_+cn*2]]*6 + (src[tabR[x_+cn]] + src[tabR[x_+cn*3]])*4 + + src[tabR[x_]] + src[tabR[x_+cn*4]]; + } + } while (0); } // do vertical convolution and decimation and write the result to the destination image - for( k = 0; k < PD_SZ; k++ ) + for (int k = 0; k < PD_SZ; k++) rows[k] = buf + ((y*2 - PD_SZ/2 + k - sy0) % PD_SZ)*bufstep; row0 = rows[0]; row1 = rows[1]; row2 = rows[2]; row3 = rows[3]; row4 = rows[4]; - x = PyrDownVecV(rows, dst, dsize.width); - for( ; x < dsize.width; x++ ) + int x = PyrDownVecV(rows, dst, dsize.width); + for (; x < dsize.width; x++ ) dst[x] = castOp(row2[x]*6 + (row1[x] + row3[x])*4 + row0[x] + row4[x]); } }