Index: opencv/modules/imgproc/include/opencv2/imgproc/imgproc.hpp =================================================================== --- opencv/modules/imgproc/include/opencv2/imgproc/imgproc.hpp (revision 4902) +++ opencv/modules/imgproc/include/opencv2/imgproc/imgproc.hpp (working copy) @@ -605,13 +605,14 @@ //! smooths and downsamples the image CV_EXPORTS_W void pyrDown( const InputArray& src, OutputArray dst, - const Size& dstsize=Size()); + const Size& dstsize=Size(), int borderType=BORDER_DEFAULT); //! upsamples and smoothes the image CV_EXPORTS_W void pyrUp( const InputArray& src, OutputArray dst, - const Size& dstsize=Size()); + const Size& dstsize=Size(), int borderType=BORDER_DEFAULT); //! builds the gaussian pyramid using pyrDown() as a basic operation -CV_EXPORTS void buildPyramid( const InputArray& src, OutputArrayOfArrays dst, int maxlevel ); +CV_EXPORTS void buildPyramid( const InputArray& src, OutputArrayOfArrays dst, + int maxlevel, int borderType=BORDER_DEFAULT ); //! corrects lens distortion for the given camera matrix and distortion coefficients CV_EXPORTS_W void undistort( const InputArray& src, OutputArray dst, Index: opencv/modules/imgproc/src/pyramids.cpp =================================================================== --- opencv/modules/imgproc/src/pyramids.cpp (revision 4902) +++ opencv/modules/imgproc/src/pyramids.cpp (working copy) @@ -185,7 +185,7 @@ #endif template void -pyrDown_( const Mat& _src, Mat& _dst ) +pyrDown_( const Mat& _src, Mat& _dst, int borderType ) { const int PD_SZ = 5; typedef typename CastOp::type1 WT; @@ -209,8 +209,8 @@ for( x = 0; x <= PD_SZ+1; x++ ) { - int sx0 = borderInterpolate(x - PD_SZ/2, ssize.width, BORDER_REFLECT_101)*cn; - int sx1 = borderInterpolate(x + width0*2 - PD_SZ/2, ssize.width, BORDER_REFLECT_101)*cn; + 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++ ) { tabL[x*cn + k] = sx0 + k; @@ -234,7 +234,7 @@ for( ; sy <= y*2 + 2; sy++ ) { WT* row = buf + ((sy - sy0) % PD_SZ)*bufstep; - int _sy = borderInterpolate(sy, ssize.height, BORDER_REFLECT_101); + int _sy = borderInterpolate(sy, ssize.height, borderType); const T* src = (const T*)(_src.data + _src.step*_sy); int limit = cn; const int* tab = tabL; @@ -308,7 +308,7 @@ template void -pyrUp_( const Mat& _src, Mat& _dst ) +pyrUp_( const Mat& _src, Mat& _dst, int borderType ) { const int PU_SZ = 3; typedef typename CastOp::type1 WT; @@ -349,7 +349,7 @@ for( ; sy <= y + 1; sy++ ) { WT* row = buf + ((sy - sy0) % PU_SZ)*bufstep; - int _sy = borderInterpolate(sy, ssize.height, BORDER_REFLECT_101); + int _sy = borderInterpolate(sy, ssize.height, borderType); const T* src = (const T*)(_src.data + _src.step*_sy); if( ssize.width == cn ) @@ -397,11 +397,12 @@ } } -typedef void (*PyrFunc)(const Mat&, Mat&); +typedef void (*PyrFunc)(const Mat&, Mat&, int); } -void cv::pyrDown( const InputArray& _src, OutputArray _dst, const Size& _dsz ) +void cv::pyrDown( const InputArray& _src, OutputArray _dst, + const Size& _dsz, int borderType ) { Mat src = _src.getMat(); Size dsz = _dsz == Size() ? Size((src.cols + 1)/2, (src.rows + 1)/2) : _dsz; @@ -420,10 +421,11 @@ else CV_Error( CV_StsUnsupportedFormat, "" ); - func( src, dst ); + func( src, dst, borderType ); } -void cv::pyrUp( const InputArray& _src, OutputArray _dst, const Size& _dsz ) +void cv::pyrUp( const InputArray& _src, OutputArray _dst, + const Size& _dsz, int borderType ) { Mat src = _src.getMat(); Size dsz = _dsz == Size() ? Size(src.cols*2, src.rows*2) : _dsz; @@ -442,16 +444,17 @@ else CV_Error( CV_StsUnsupportedFormat, "" ); - func( src, dst ); + func( src, dst, borderType ); } -void cv::buildPyramid( const InputArray& _src, OutputArrayOfArrays _dst, int maxlevel ) +void cv::buildPyramid( const InputArray& _src, OutputArrayOfArrays _dst, + int maxlevel, int borderType ) { Mat src = _src.getMat(); _dst.create( maxlevel + 1, 1, 0 ); _dst.getMatRef(0) = src; for( int i = 1; i <= maxlevel; i++ ) - pyrDown( _dst.getMatRef(i-1), _dst.getMatRef(i) ); + pyrDown( _dst.getMatRef(i-1), _dst.getMatRef(i), Size(), borderType ); } CV_IMPL void cvPyrDown( const void* srcarr, void* dstarr, int _filter )